1.MATLAB实现
1.1初始信号的生成
在本文中使用简单的正弦信号作为初始信号。
x = 0 :0.001 : 2*pi;
y1 = sin(x);%设置初始函数
c = parula(10);%生成十种颜色,用于绘图
subplot(2,2,1);
plot(x,y1,'LineWidth', 1.5, 'Color', c(1, :));%绘制初始信号
title('初始信号');
1.2噪声信号的生成
在初始信号中添加信噪比为20dB的噪声
snr = 20;%设置添加的噪声的信噪比
y2 = awgn(y1,snr,'measured');%生成添加噪声后的信号
subplot(2,2,2);
plot(x,y2,'LineWidth', 1.5, 'Color', c(2, :));%绘制添加噪声后的信号
title('添加噪声后的信号');
1.3滑动均值滤波
进行10点滑动均值滤波
L = length(x);
N = 10;%设置滑动窗长度
%10点滑动均值滤波
for i = 1: L
if i <= N-1
W(i) = 0;
else
W(i) = 0;
for j = 1:N
W(i) = W(i) + y2(i-j+1);
end
y3(i) = W(i)/N;
end
end
subplot(2,2,3);
plot(x,y3,'LineWidth', 1.5, 'Color', c(3, :));
title('10点滑动滤波后的信号');
进行100点滑动滤波
L = length(x);
N = 100;%设置滑动窗长度
%100点滑动均值滤波
for i = 1: L
if i <= N-1
W(i) = 0;
else
W(i) = 0;
for j = 1:N
W(i) = W(i) + y2(i-j+1);
end
y4(i) = W(i)/N;
end
end
subplot(2,2,4);
plot(x,y4,'LineWidth', 1.5, 'Color', c(5, :));
title('100点滑动滤波后的信号');
运行结果如下图所示
2.Simulink实现
接下来在simulink中完成滑动均值滤波的仿真。整体模块搭建如下图所示。
2.1初始信号的生成
本文采用Simulink自带的正弦信号发生器生成初始信号。
2.2噪声信号的添加
function [sys,x0,str,ts,simStateCompliance] = sfun_awgn(t,x,u,flag)
switch flag
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 1
sys=mdlDerivatives(t,x,u);
case 2
sys=mdlUpdate(t,x,u);
case 3
sys=mdlOutputs(t,x,u);
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [1e-3 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
sys = 0.1*randn(1)+u;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
2.3滑动滤波模块添加
function [sys,x0,str,ts,simStateCompliance] = sfun_filter(t,x,u,flag,N)
switch flag
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(N);
case 1
sys=mdlDerivatives(t,x,u);
case 2
sys=mdlUpdate(t,x,u,N);
case 3
sys=mdlOutputs(t,x,u);
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(N)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = N;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = zeros(N,1);
str = [];
ts = [1e-3 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u,N)
for i = N:-1:2
x(i) = x(i-1);
end
x(1)=u;
sys = x;
function sys=mdlOutputs(t,x,u)
sys = mean(x);
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
参数设置如下图所示