• 【信号处理】基于扩展卡尔曼滤波器和无迹卡尔曼滤波器的窄带信号时变频率估计(Matlab代码实现)


    目录

    1 概述

    2 数学模型 

    3 运行结果

    4 结论 

    5 参考文献

    6 Matlab代码实现


    1 概述

    本文讲解和比较了基于卡尔曼滤波器的频率跟踪方法的能力,例如扩展卡尔曼滤波器 (EKF) 和无味卡尔曼滤波器 (UKF),以跟踪窄带谐波信号的时变频率。这些结果与 Savaresi 等人的结果进行了比较。在 [3] 中。为了评估算法实现的估计质量,使用了两个标准:性能指数 (PI) 和鲁棒性指数 (RI),如 [3] 中所述。引入了辅助收敛比以更好地解释 PI 图。考虑两个信号:从现实世界记录的单频正弦信号和生成的噪声信号,该信号具有随时间变化的频率,遵循阶跃分布。该算法能够以~10-7 的精度估计真实世界的信号,并实现与 [3] 一致的性能。在最后一节中显示和讨论了获得的结果。

    本文讨论了估计嵌入噪声的窄带谐波信号的频率问题;特别是基于卡尔曼滤波器的方法,例如扩展卡尔曼滤波器 (EKF) 和无迹卡尔曼滤波器 (UKF)。为了评估算法实现的估计质量,引入了两个标准:性能指数(PI)和鲁棒性指数(RI),以及辅助收敛比。已对记录的真实信号和生成的噪声信号进行了测试。详细文章见第3部分。

    2 数学模型 

    所提出的模型是从信号表示为笛卡尔平面中具有角速度 Φ(t) 的旋转矢量构建的。通过将向量沿轴的两个投影和瞬时频率作为状态变量推导出三阶状态空间模型(ARMA 表示)

    \left\{\begin{aligned} x_{1}(t+1) &=\cos \left(x_{3}(t)\right) x_{1}(t)-\sin \left(x_{3}(t)\right) x_{2}(t) \\ x_{2}(t+1) &=\sin \left(x_{3}(t)\right) x_{1}(t)+\cos \left(x_{3}(t)\right) x_{2}(t) \\ x_{3}(t+1) &=x_{3}(t)+w(t) \\ y(t) &=x_{1}(t)+v(t) \end{aligned}\right.

    详细讲解见:

    1. %% RI
    2. clear all
    3. close all
    4. clc
    5. fclose('all');
    6. global logpath;
    7. addpath('./ukf')
    8. addpath('./ekf')
    9. addpath('./generate')
    10. addpath('./ri')
    11. PLOT_PREDICTION = false;
    12. PLOT_PROFILE = false;
    13. COMPUTE = true;
    14. % Parameters
    15. initial_omega = pi/2;
    16. step_profile = [pi/11 -pi/5.5 pi/4 -pi/3.4 pi/2.8 -pi/2.5 pi/2 -pi/1.6 pi/1.4]; % Approximation of Fig.2 on the paper
    17. step_length = 400;
    18. sigma = 1e+1;
    19. q = 1e-5;
    20. r = sigma*q;
    21. n_simulations = 500;
    22. initialization_noise_sigma = 0.001;
    23. threshold = 120;
    24. % sigma_noise = 2e-2;
    25. % sigma_omega_noise = 1e-3;
    26. sigma_noise = 4e-1;
    27. sigma_omega_noise = 3e-1;
    28. if (PLOT_PREDICTION)
    29. ri_figure = figure('visible','off');
    30. set(ri_figure, 'Position', [0, 0, 720, 720],'Resize','off')
    31. end
    32. namestring = sprintf('q%1.2e_s%1.2e_sn%1.2e_sno%1.2e',q,sigma,sigma_noise,sigma_omega_noise);
    33. logpath = strcat(pwd,'\data\ri\',namestring,'\')
    34. if ~exist(logpath,'dir'), mkdir(logpath), end
    35. if (COMPUTE)
    36. ri_ekf = zeros(1,n_simulations);
    37. ri_ukf = ri_ekf;
    38. for ii = 1:n_simulations
    39. fprintf('***** Iteration %d *****\n',ii)
    40. % Generate signal
    41. [signal, omega]=generate_signal_step(step_length,initial_omega,step_profile,sigma_noise,sigma_omega_noise);
    42. %% Track
    43. x_pred_0 = [0, 0, normrnd(omega(1),omega(1)*initialization_noise_sigma)]; % Initialization
    44. pred_vec_ekf = ekf( ...
    45. signal, ...%signal
    46. x_pred_0, ...%x_pred_0
    47. initialization_noise_sigma, ...%sigma_init
    48. r, ... %r,
    49. q ... %q
    50. );
    51. pred_vec_ukf = ukf( ...
    52. signal, ...%signal
    53. x_pred_0, ...%x_pred_0
    54. initialization_noise_sigma, ...%sigma_init
    55. r, ... %r,
    56. q ... %q
    57. );
    58. % Take only the state we are interested in
    59. pred_omega_ekf = pred_vec_ekf(3,:);
    60. pred_omega_ukf = pred_vec_ukf(3,:);
    61. disp('************ EKF *************');
    62. ri_ekf(ii) = compute_ri(pred_omega_ekf,omega,step_length,threshold);
    63. disp('************ UKF *************');
    64. ri_ukf(ii) = compute_ri(pred_omega_ukf,omega,step_length,threshold);
    65. % Plot ground truth and predictions
    66. if PLOT_PREDICTION
    67. set(0, 'currentfigure', ri_figure);
    68. clf;
    69. title('Predictions for RI');
    70. t = 1:length(omega);
    71. stairs(t, omega, 'k');
    72. xlabel('Samples')
    73. ylabel('Omega')
    74. set(gca,'YLim',[0,pi]);
    75. set(gca,'YTick',0:pi/4:pi);
    76. set(gca,'YTickLabel',{'0' 'pi/4','pi/2','3/4pi','pi'});
    77. hold on
    78. plot(t,pred_omega_ekf,'ro');
    79. plot(t,pred_omega_ukf,'bx');
    80. legend('True','EKF','UKF')
    81. RI(ii) = getframe;
    82. end
    83. end
    84. if (PLOT_PREDICTION)
    85. generate_video(strcat('ri_',namestring),RI);
    86. end
    87. save(strcat(logpath,'ri_ekf.mat'),'ri_ekf')
    88. save(strcat(logpath,'ri_ukf.mat'),'ri_ukf')
    89. else
    90. if exist('ri_ekf.mat','file') && exist('ri_ukf.mat','file')
    91. load(strcat(logpath,'ri_ekf.mat'),'ri_ekf')
    92. load(strcat(logpath,'ri_ukf.mat'),'ri_ukf')
    93. else
    94. error('No saved curves. Recompute.')
    95. end
    96. end
    97. n_steps = length(step_profile);
    98. steps_axis = 1:n_steps;
    99. psi_ekf = hist(ri_ekf, steps_axis);
    100. psi_ukf = hist(ri_ukf, steps_axis);
    101. if PLOT_PROFILE
    102. figure(1)
    103. hold off
    104. stairs(omega)
    105. xlabel('Samples')
    106. ylabel('Omega')
    107. set(gca,'YLim',[initial_omega-pi/2,initial_omega+pi/2]);
    108. set(gca,'YTick',0:pi/4:pi);
    109. set(gca,'YTickLabel',{'0' 'pi/4','pi/2','3/4pi','pi'});
    110. end
    111. ri_figure = figure(2);
    112. title('RI')
    113. bar(steps_axis,[psi_ekf', psi_ukf'])
    114. legend('EKF','UKF')
    115. saveas(ri_figure, strcat(logpath,'ri_figure_',namestring,'.png'), 'png');

    3 运行结果

      

       

    4 结论 

    本文讨论了估计嵌入噪声的窄带谐波信号的频率问题;特别是基于卡尔曼滤波器的方法,例如扩展卡尔曼滤波器 (EKF) 和无迹卡尔曼滤波器 (UKF)。为了评估算法实现的估计质量,引入了两个标准:性能指数(PI)和鲁棒性指数(RI),以及辅助收敛比。已对记录的真实世界信号和生成的噪声信号进行了测试。剩余详细文章见第3部分。

    部分理论引用网络文献,如有侵权请联系博主删除。

    5 参考文献

    [1] Corbetta S ,  Dardanelli A ,  Boniolo I , et al. Frequency estimation of narrow band signals in Gaussian noise via Unscented Kalman Filter[C]// Proceedings of the 49th IEEE Conference on Decision and Control, CDC 2010, December 15-17, 2010, Atlanta, Georgia, USA. IEEE, 2010.

    [2] Dash P K ,  Hasan S ,  Panigrahi B K . Adaptive complex unscented Kalman filter for frequency estimation of time-varying signals[J]. Iet Science Measurement Technology, 2010, 4(2):93-103.

    [3] S. Bittanti and S. Savaresi. “On the Parameterization and Design of an
    Extended Kalman Filter Frequency Tracker”. In: IEEE transactions on
    automatic control 45.9 (2000), pp. 1718–1724.
    [4] B. Boashash. “Estimating and Interpreting the instantaneous frequency of
    a signal”. In: Proceedings of the IEEE 80.4 (1992), pp. 540–568.
    [5] S. Savaresi et al. “Frequency estimation of narrow band signals in Gaussian
    noise via Unscented Kalman Filter”. In: 49th IEEE Conference on Decision
    and Control (2010), pp. 2869–2874.

    6 Matlab代码实现

  • 相关阅读:
    华为认证 | 这门HCIA认证正式发布!
    信号稳定,性能卓越!德思特礁鲨系列MiMo天线正式发布!
    【5G核心网】手把手教你将Open5gs托管到k8s(KubeSphere)
    Redis学习笔记18:基于spring data redis及lua脚本的分布式锁
    手画图解 | 关于死锁,面试的一切都在这里了
    使用shell生成指定范围日期序列
    七夕特别篇 | 浪漫的Bug
    相约2023,高通公司宣布参加第六届进博会
    基于java多特蒙德周边商城系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    如何利用ChatGPT撰写学术论文?
  • 原文地址:https://blog.csdn.net/weixin_46039719/article/details/126850538