数字信号处理1-Moving Average Filter

大多数人对滤波器的了解,只是认为,滤波器就是对信号进行分离,比如滤除信号中低频或者高频的成分,实际上这种理解是狭义的,广义上的滤波器除了包括上面的功能以外,还包括对信号的整形,而前者是频域滤波器,后者为时域滤波器。本文所提到的Moving Average Filter实际上就是一种时域滤波器。

由滤波器的名称可以得知,这种滤波器就是通过对输入信号做平均来产生输出信号的方式。

其中y[]是输出信号,x[]是输入x[]是输入信号,M表示用来做平均的点数

例如:

这是取输出采样点的右边做平均,还可以取对称的两边:

这是取输出点两边做平均,但是此时M必须取奇数

采用这种滤波算法的效果图,这种滤波方式主要是用来去噪,并且往往M取值越大,则得到的波形就会越平滑,去噪能力越强,但同时信号的上升沿会遭到破坏,变缓less sharp。

上图是频响曲线,可以看出,M值越大,高频损耗就越大,越偏向低频滤波器,相当于高频成分都会消失。

滤波器也是通过将输入信号和滤波器的的impulse response(filter kernel)做卷积得到输出信号,只不过moving average的filter kernel的每一个point都是相等的。

还有一类和moving average很类似的filter,relatives of the moving average,有高斯和布莱克blackman

和moving average相比,它们的优势,在阻带衰减性能更佳,moving average每个输入point对于输出point的权重都是一样大的,但是高斯却是距离输出点越远,则占输出点的权重越小。

实际上,如果重复使用moving average则实际得到的就类似于高斯filter。

使用多次,相当于moving average滤波器对其自身作卷积,上图分别是,做2次,4次的效果。

实例:

下面是对采集卡采到的数据,使用moving average做了处理,主要是通过matlab来实现的

 

代码如下:

 

data_array=textread(‘D:\My Documents\MATLAB\data_process\33bit-25Mhz\data_clear.txt‘,‘%d‘); %读取数据

points_per_period=16;    %定义每个周期有多少个采样点

col_array=650; %取多少个点(因为文件中有4096个采用点,这里我们只取650个点)

data_array_section=ones(1,col_array);

for k=1:col_array

data_array_section(k)=data_array(k);  %将取出的650个采样点放入矩阵data_array_section中

end

moving_point=9;  %定义moving average中去多少个点进行平均运算,也就是M的值

moving_point_left=(-moving_point+1)/2; %取输出点对称两边的采样点的值做平均,这里值为-4

moving_point_right=(moving_point-1)/2; %这里值为4

data_array_filter=zeros(1,col_array); %初始化一个和data_array_section大小相同的矩阵,存储结果

for i=1:moving_point_right

data_array_filter(i)=data_array_section(i);

end

for i=(col_array+moving_point_left+1):col_array %这一段代码,是对矩阵的前4个和后4个点进行赋值

data_array_filter(i)=data_array_section(i);

end

for i=(moving_point_right+1):(col_array+moving_point_left)

for j=moving_point_left:moving_point_right

data_array_filter(i)=data_array_filter(i)+data_array_256(i+j); %moving average filter process

end

data_array_filter(i)=data_array_filter(i)/moving_point;

end

plot(data_array_filter,‘-.*r‘);  %将结果绘图

没有filter之前的波形图

采用moving average filter之后的结果M=9

本文提到的这种滤波算法,是一种很简单,但是很好用的滤波方法,基本上对得到的原始采样数据都可以采用这种方法先处理一下。

时间: 2024-12-20 19:50:20

数字信号处理1-Moving Average Filter的相关文章

[LeetCode] Moving Average from Data Stream 从数据流中移动平均值

Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window. For example,MovingAverage m = new MovingAverage(3);m.next(1) = 1m.next(10) = (1 + 10) / 2m.next(3) = (1 + 10 + 3) / 3m.next(5) = (10 + 3

LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)

Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window. For example, MovingAverage m = new MovingAverage(3); m.next(1) = 1 m.next(10) = (1 + 10) / 2 m.next(3) = (1 + 10 + 3) / 3 m.next(5) = (1

[LeetCode] 346. Moving Average from Data Stream 从数据流中移动平均值

Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window. For example,MovingAverage m = new MovingAverage(3);m.next(1) = 1m.next(10) = (1 + 10) / 2m.next(3) = (1 + 10 + 3) / 3m.next(5) = (10 + 3

转载--理解数字信号处理的三把钥匙

原址 在数字信号处理大厦中,有许许多多的小房间,有的门上写着"DFT",有的门上写着"滤波",有的门上写着"卷积",有的门上写着"相关",等等.每一个房间都藏着知识的秘密,每一个房间都要用属于自己的钥匙才能打开.但就整体上来说,理解数字信号处理有三把"万能"的钥匙:时域与频域的相互切换.向量和MATLAB软件.充分应用这三把钥匙,能为深入理解数字信号处理提供有力的帮助. 1.时域与频域的相互切换 深入理解数

FS,FT,DFS,DTFT,DFT,FFT的联系和区别 数字信号处理

DCT变换的原理及算法 文库介绍 对于初学数字信号处理(DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. 学习过<高等数学>和<信号与系统>这两门课的朋友,都知道时域上任意连续的周期信号可以分解为无限多个正弦信号之和,在频域上就表示为离散非周期的信号,即时域连续周期对应频域离散非周期的特点,这就是傅里叶级数展开(FS),它用于分析连续周期信号. FT是傅里叶变换,它主要用于分析连续非周期信号,由于信号是非周期的,它必包含了各种频率的信号,

数字信号处理MATLAB简单序列

数字信号处理应用的几个基本序列: 1 单位样本序列 function mainImseq() clc clear disp('生成抽样序列'); y=imseq(1,1,5); %调用样本函数,此时序列下标以1开头(1~5之间5个数,下标为1的抽样值为1) %子函数imseq:抽样函数 function [x,n]=imseq(n0,n1,n2) n=[n1:n2]; x=[(n-n0) ==0 ] 2 单位阶越序列 产生u(n) function mainImseq() clc clear d

《数字信号处理》 学习总结

21世纪属于数字化信息时代,很有幸学习了一些数字信号的基础内容,尽管还不清楚这些理论基础的应用,但他所应用的技术给了自己很多积累也让自己感受到了人类智慧的伟大,本文章主要论述对高西全和丁玉美编著的<数字信号处理>简要学习总结. 上图为对本书学习的主要内容, 信号有模拟信号,时域离散信号和数字信号之分,主要讨论的是离散信号和离散系统,为什么数字信号处理却讨论的是时域离散信号呢?原因是数字信号与离散信号的区别,数字信号存在量化误差,离散信号的特性研究相对容易. [分析方式] 任何事物都会有不同的分

Leetcode 346. Moving Average from Data Stream

Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window. For example, MovingAverage m = new MovingAverage(3); m.next(1) = 1 m.next(10) = (1 + 10) / 2 m.next(3) = (1 + 10 + 3) / 3 m.next(5) = (1

Moving Average from Data Stream

Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window. For example,MovingAverage m = new MovingAverage(3);m.next(1) = 1m.next(10) = (1 + 10) / 2m.next(3) = (1 + 10 + 3) / 3m.next(5) = (10 + 3