欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/3/19 编程问答 75 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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: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')

总结

以上是生活随笔为你收集整理的M-point moving-average(M点滑动平均)Matlab 实现的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。