目录
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')