当前位置: 代码迷 >> 综合 >> M-point moving-average(M点滑动平均)Matlab 实现
  详细解决方案

M-point moving-average(M点滑动平均)Matlab 实现

热度:73   发布时间:2023-11-23 04:52:09.0

目录

1. M点滑动平均

2. Matlab 实现过程

3. 滤波器的表示

4. 总体代码以及实现结果


1. M点滑动平均

由于观测的信号被噪声污染,需要对其进行噪声的滤除,M 点滑动平均则是对该信号的某一个点及其前面的共 M 点取平均,从而得到该信号大致的样本值

2. Matlab 实现过程

由于该平均方法是对一个被噪声污染的信号进行操作,所以首先我们可以得到一个原始信号,在此处我们取一个简单的正弦信号

n = -100:100;Sn = sin(0.1*pi*n); %original signal
figure
stem(n,Sn,'.')
axis([0,100,-1.1,1.1])
title('Original signal')

上述代码得到的信号如下:

得到原始信号后对其进行加噪处理,生成噪声我们采用随机函数 randn

Rn = 0.15*randn(size(Sn)); %noise signal(得到噪声信号)
stem(Rn,'r.')
axis([0,100,-0.5,1])
title('Noise')X = Sn + Rn; %input signal(将样本信号和随机噪声结合起来)
stem(X,'.')
axis([0,100,-1.3,1.3])
title('Signal added noise')

以上代码的效果如下:

我们知道,滑动平均就是对多个点进行取平均操作,得到一个均值,所以我们可以采用一个循环来进行这个操作过程,对原序列的每一个点进行平均操作,而平均的次数则是 M 次:

S = zeros(1,100);
for n = 1:100for i = 0:7S(n) = S(n) + X(n + i);endS(n) = 1/8*S(n);
end

经过取平均操作后得到的信号可以使用如下代码表示

subplot(2,4,4)
stem(S,'.')
axis([0,100,-1.3,1.3])
title('Signal after filtering')

效果如下:

这样就大致完成了滑动平均

3. 滤波器的表示

由前面的表达式可以看出,该滤波器的单位冲击响应是单位阶跃函数的一段,可以用下面的代码块表示

d = zeros(100,1);
d(1:5) = 0.2;
subplot(2,4,7)
stem(d,'.')
axis([0,10,0,0.3])
title('Unit impulse response')

其中的每一个点的值为 1/M,点数为 M 个

得到的单位冲激响应如下

对其进行快速傅里叶变换得到系统的频响:

f = fft(d);
subplot(2,4,8)
plot(abs(f))
title('Ferquency response')

4. 总体代码以及实现结果

n = -100:100;Sn = sin(0.1*pi*n); %original signal
figure
subplot(2,4,1)
stem(n,Sn,'.')
axis([0,100,-1.1,1.1])
title('Original signal')Rn = 0.15*randn(size(Sn)); %noise signal
subplot(2,4,2)
stem(Rn,'r.')
axis([0,100,-0.5,1])
title('Noise')X = Sn + Rn; %input signal
subplot(2,4,3)
stem(X,'.')
axis([0,100,-1.3,1.3])
title('Signal added noise')S = zeros(1,100);
for n = 1:100for i = 0:4S(n) = S(n) + X(n + i);endS(n) = 1/5*S(n);
endsubplot(2,4,4)
stem(S,'.')
axis([0,100,-1.3,1.3])
title('Signal after filtering')a = fft(X);
b = fft(S);
subplot(2,4,5)
plot(abs(a))
title('Signal X in Frequency domain')subplot(2,4,6)
plot(abs(b))
title('Signal S in Frequency domain')d = zeros(100,1);
d(1:5) = 0.2;
subplot(2,4,7)
stem(d,'.')
axis([0,10,0,0.3])
title('Unit impulse response')f = fft(d);
subplot(2,4,8)
plot(abs(f))
title('Ferquency response')

  相关解决方案