【信号去噪】基于Sage-Husa自适应卡尔曼滤波器实现海浪磁场噪声抑制及海浪磁场噪声的产生附matlab代码

简介: 【信号去噪】基于Sage-Husa自适应卡尔曼滤波器实现海浪磁场噪声抑制及海浪磁场噪声的产生附matlab代码

 1 内容介绍

一种海洋磁力仪海浪磁场噪声实时抑制方法,属于海洋地磁场探测领域.包括以下步骤:步骤一:启动海洋磁力仪,读取海洋地磁传感器的输出数据作为量测量;步骤二:建立系统状态方程和量测方程;步骤三:在t_(k1)时刻利用SageHusa自适应卡尔曼滤波器估计出t_k时刻的地磁总场值,并对系统噪声阵Q和量测噪声阵R进行更新和修正;步骤四:海洋磁力仪运行时间为M,若t_k=M,则保存数据,海洋磁力仪完成测量工作;若t_k<M,则回代Q和R更新值,返回步骤三继续估计.本发明解决了海浪磁场噪声对海洋磁力仪进行高精度海洋磁场探测时的扰动问题,即使在极端海况下也能保证海洋磁力仪具有较高的探测精度.

2 仿真代码

%%weaver模型模拟噪声  第二组磁异常数据

% sagehusa自适应卡尔曼与传统卡尔曼的对比(直观对比和残差对比)

clc;clear

Base_Value = 49600;   %基值

ab_single = ([49599.47

49597.37

49598.05

49597.9

49594.27

49584.91

49569.71

49541.43

49563.28

49663.24

49676.9

49673.31

49669.99

49666.46

49658.54

49647.31

49634.22

49627.6

49622.01

49618.89

49616.64

49613.81

49613.16

49613.77

]-Base_Value)./56 + Base_Value;

N = 500;   %噪声源点数

N1 = 30;   %噪声叠加次数

%%%%海浪噪声配置%%%%

z = 10;  %定深度

x = 10;  %定x

t = linspace(0,200,N);   % 采样率:f = 1/(200/500) = 2.5Hz

Noise = zeros(1,N);  

F = 0.488;   %地磁场强度

I = pi/4;    %磁偏角

Sita = 0;  

a = 100;    %cm  波浪高度  

g = 980;    %cm/s2        

sigama = 4*10^(-11);  %emu 电导率

w = 10*(0.314 + 0.314*rand(1,N1));  %w  0.314~0.628   角频率

m =(w.^2)/g;  %波数

Bata = (4*pi*sigama*w)./(m.^2);  

C = cos(I)*cos(Sita);

S = sin(I);

A = a*m*F*(C*i + S);

%%%%%%%%%%%%% z>0时遭受叠加 %%%%%%%%%%%%%%%%%  

for j = 1:1:N1  

   Hx = (i*Bata(j)*A(j)/4)*(2*m(j)*z-1)*exp(i*w(j)*t-i*m(j)*x-m(j)*z);

   Hz = (Bata(j)*A(j)/4)*(2*m(j)*z+1)*exp(i*w(j)*t-i*m(j)*x-m(j)*z);

   H11 = Hx*C + Hz*S;   %总磁场强度

   Noise = Noise + H11;    %叠加

end

%%%%%%%%%%%理想信号配置%%%%%%%%%%%%%%%

single = Base_Value*ones(1,N);

single(1,N/2:N/2+size(ab_single)-1) = ab_single;

%%%%%%%%%%%%信号加噪%%%%%%%%%%%%%%%%%%

sum_single = 6500000*Noise/56 + single;

Z = sum_single;

% %%%%%%%%%%%%卡尔曼滤波器配置%%%%%%%%%%%%

% R = 10*std(sum_single)^2;    %测量噪声  

% Q = 0.025*R;    %系统噪声

% p(1) = 10;      %增益初值

% kalman_out(1) = Base_Value;   %卡尔曼初值的选择要合理,大致落在数据区间内

%

% for j = 2:1:N

% kalman_out1(j) = kalman_out(j-1);   %预测状态

% p1(j) = p(j-1) + Q;     %预测估计协方差

%

% kg(j) = p1(j) / (p1(j) + R);   % 最优卡尔曼增益

% kalman_out(j) = kalman_out1(j) + kg(j) * (sum_single(j) - kalman_out1(j));   %更新状态估计

% p(j) = (1 - kg(j)) * p1(j);     %更新协方差估计  

% end

%%%%%%%%%%%%sage-husa卡尔曼滤波器配置%%%%%%%%%%%%%

R1(1) = 0.7536;    %测量噪声  

Q1(1) = 0.0151;    %系统噪声  

P(1) = 1.5;       %增益初值

q(1) = 0;        %Q标准差初值

r(1) = 0;        %R标准差初值

v(1) = 0;

X(1) = Base_Value;   %卡尔曼初值的选择要合理,大致落在数据区间内

b = 0.95;        %遗忘因子

for j = 2:1:N

d = (1-b)/(1-b^(j+1));

% kalman_out1(j) = kalman_out(j-1) + q(j-1);   %预测状态

X_(j) = X(j-1) ;   %预测状态  + q(j-1)

P_(j) = P(j-1) + Q1(j-1);     %预测估计协方差

r(j) = (1-d)*r(j-1) + d*(Z(j)-X_(j));

% v(j) = sum_single(j)-kalman_out1(j) - r(j);

v(j) = Z(j) - X_(j);  

% R(j) = (1-d)*R(j-1) + d*(v(j)*v(j) - p1(j));

R1(j) = (1-d)*R1(j-1);

K(j) = P_(j) / (P_(j) + R1(j-1));   % 最优卡尔曼增益

X(j) = X_(j) + K(j) * (Z(j) - X_(j));   %更新状态估计

P(j) = (1 - K(j)) * P_(j);     %更新协方差估计  

q(j) = (1-d)*q(j-1) + d*(X(j) - X(j-1));

% Q(j) = (1-d)*Q(j-1) + d*(kg(j)*kg(j)*v(j)*v(j) + p(j) - p(j-1) - 2*kg(j)*kg(j)*R(j) - 2*kg(j)*kg(j)*p1(j) + 2*p1(j)*kg(j));

Q1(j) = (1-d)*Q1(j-1);

end

% V_1 = kalman_out - single;  %Kalman输出残差

% V_2 = X - single;    %SageHusa输出残差

% figure(1);

% plot(t,sum_single,'g');

% hold on;

figure(2);

plot(t,R1,'g');

axis([0 200 -0.8 0.8]);

title('R');

figure(3);

plot(t,Q1,'r')

axis([0 200 -0.016 0.016]);

title('Q');

%%%%%%%%%%%%%%%%%残差数据输出到文件中%%%%%%%%%%%%%%%%%

% fid = fopen('SageHusa残差数据.txt','wt');

% fprintf(fid,'%g\n',abs(V_1(4:500)));

% fclose(fid);

%

% fid1 = fopen('常规卡尔曼残差数据.txt','wt');

% fprintf(fid1,'%g\n',abs(V_2(4:500)));

% fclose(fid1);

%

% fid2 = fopen('滤波前噪声.txt','wt');

% fprintf(fid2,'%g\n',6500000*Noise/56);

% fclose(fid2);

%

% fid3 = fopen('卡尔曼滤波后噪声.txt','wt');

% fprintf(fid3,'%g\n',V_1);

% fclose(fid3);

%

% fid4 = fopen('SageHusa滤波后噪声.txt','wt');

% fprintf(fid4,'%g\n',V_2);

% fclose(fid4);

%

% fid4 = fopen('残差时间轴.txt','wt');

% fprintf(fid4,'%g\n',t(4:500));

% fclose(fid4);

%%%%%%%%%%%%%%%%%%%%%%% END %%%%%%%%%%%%%%%%%%%%%%%%%%%

3 运行结果

image.gif编辑

image.gif编辑

4 参考文献

[1]王福军, 丁小燕, 王前,等. 自适应强跟踪Sage-Husa卡尔曼滤波器载波环设计[J]. 电光与控制, 2019, 26(10):5.

[1]钱华明, 柏明明, 钱林琛,等. 一种海洋磁力仪海浪磁场噪声实时抑制方法:, CN107576989A[P]. 2018.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

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

相关文章
|
3月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
199 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
3月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
90 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
3月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
128 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
6月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
6月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
6月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)
|
6月前
|
供应链 算法
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
基于分布式优化的多产消者非合作博弈能量共享(Matlab代码)
|
6月前
|
算法 调度
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
基于多目标粒子群算法冷热电联供综合能源系统运行优化(matlab代码)
|
6月前
|
算法 调度 SoC
电动汽车充放电V2G模型(Matlab代码)
电动汽车充放电V2G模型(Matlab代码)