使用MATLAB模拟指定信噪比的噪声的施加与滤除,并在Simulink中实现

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 = [];

参数设置如下图所示
在这里插入图片描述

运行结果

在这里插入图片描述

  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值