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

目录

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:100
    for i = 0:7
        S(n) = S(n) + X(n + i);
    end
    S(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:100
    for i = 0:4
        S(n) = S(n) + X(n + i);
    end
    S(n) = 1/5*S(n);
end

subplot(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')

猜你喜欢

转载自blog.csdn.net/qq_52309640/article/details/120476695
M
^M