matlab 数字滤波入门

转自https://zhuanlan.zhihu.com/p/65483011?utm_source=qq
1. 时间序列分析入门
模拟与数字信号我们本身生活在一个模拟量的世界里,所谓模拟量,即连续变化量,屋里的温度是连续变化的,时间是连续变化的,诸如此类。而计算机是数字系统,他不能处理模拟量,而只能处理离散量,这意味着我们要把连续的模拟量进行采样,得到一系列离散的数字量。
matlab 数字滤波入门_第1张图片
Aliasing(混叠)
所有自然界的信号都不是很干净的,都会有噪声。下面是一个更接近真实的潮汐水位高度随时间变化的数据集:
matlab 数字滤波入门_第2张图片
如果我们对它采样,大概会得到这样:
matlab 数字滤波入门_第3张图片
用一条线把采样点连接起来,采集的到的数字波形可以看出明显的上下振动。由于高频噪声和原来的低频真实信号相叠加,最后采集出来的数据和原来的数据相比很难看。这是因为采样的频率远低于噪声信号的频率,Aliasing发生了。
matlab 数字滤波入门_第4张图片
避免AliasingAliasing
通常是有害但又不可能100%避免的
Nyquist Theorem
这个定理告诉我们,如果想要完整采集某个频率的信号,那么你至少要用2倍于该信号的最高频率的采样率来采集,否则 Aliasing就会发生。举个例子:如果你知道潮汐变化最短以一天为周期,那么你至少半天就需要采集一个潮汐水位变化。实际应用中,通常用更高(>2倍)的采样率去采集信号。
Anti-Aliasing Filters
除了提高采样率,另外一种避免Aliasing的方法是使用 Anti-Aliasing Filter. 通常在数字化之前使用一个low-pass filter把噪声滤掉即可。举例:采样之前安装一个低通滤波器,截止频率为10Hz. 那么你只需要一个20Hz的采样率就可以把你感兴趣的信号采集进来。高频噪声在采样之前就被模拟低通滤波器干掉了。
但是:一定要在数字化(采样)之前进行低通滤波(模拟低通滤波)。否则如果采样率不够,则必然发生Aliasing, 噪声会混进你感兴趣的低频信号中,这时候再采用数字低通滤波就没啥效果了。当然,如果你采样频率够高,那么采样进来后才进行数字低通滤波也是OK的。而且绝大多数应用就是这么干的。
RMS
RMS=root,mean,square. 用来描述信号质量。 计算方法: 一组数据,先平方,再求均值,最后开根。用matlab撸一个rms函数:建一个rms.m 写入以下内容:
matlab 数字滤波入门_第5张图片
产生一些随机数,然后计算他们的RMS:
matlab 数字滤波入门_第6张图片
2. FFT 傅里叶变换
傅里叶变换是信号处理里强大的工具,他可以帮助我们分析信号的频率成分,本文不会讲解傅里叶变化的数学原理,而会侧重matlab实践。fft和ifft(逆傅里叶变换)可以把信号进行时域和频域转换如下图。
matlab 数字滤波入门_第7张图片
所谓fft 就是把X轴从时间换成频率。 ifft,就是把X轴坐标从频率变成时间。
先用matlab产生一个100Hz正弦信号, 先产生时间序列。
matlab 数字滤波入门_第8张图片
matlab 数字滤波入门_第9张图片
下面准备开始fft, 使用matlab自带的fft函数就可以了,注意fft返回的一组复数,包含了频率成分和相位成分,我们要绝对值一把fft的结果:
在这里插入图片描述
matlab 数字滤波入门_第10张图片
如果仔细观察,发现定点的值是50,而我们sin波形的正弦信号幅度是1啊。。这是matlab fft返回结果定义的问题,我们只需要除以用于fft运算的采样点个数的一半即可:
matlab 数字滤波入门_第11张图片
matlab 数字滤波入门_第12张图片
好啦,Y轴顶点整成1啦。那么X轴怎么办呢,下面把X轴整成Hz…首先需要知道fft的频率分辨率为:
在这里插入图片描述
在我们的例子中, binwidth(频率分辨率) 就是1Hz.
频率分辨率是啥意思呢? 顾名思义,就是FFT转换后频谱图上的X轴(频率)的最小细分单位。或者说频谱图上X轴的最小间隔。
matlab 数字滤波入门_第13张图片
matlab 数字滤波入门_第14张图片
当然我们还有最大的问题没有解决,明明是2Hz的信号怎么右面还有一个对称的?。。这个你就别问了,谜之数学!通常我们只取前面一半就好:
matlab 数字滤波入门_第15张图片
测量某一个频率成分信号的大小
之前说过,FFT变换的频率分辨率取决于信号采样频率和进入FFT函数的数据量。如果你有一个1000点的数据,原信号是
8000Hz,那么频率分辨率就是8Hz
获得最大赋值对应的频率

通过fft很容易让我们知道赋值最大的信号频点在哪里:
matlab 数字滤波入门_第16张图片
3. 数字滤波器
数字滤波器用于滤掉一些不需要的频率信号。比如工频噪声(50Hz)正弦信号等。通常有两类滤波器:
FIR(有限冲击响应滤波器)
IIR(无限冲击响应滤波器)
本文侧重matlab应用,并不会涉及深奥的理论知识。
FIR filter
其实你可能之前用过FIR filter只不过没有意识到而已, moving average(滑动平均)滤波器就是FIR滤波器的一种。在一些应用中,有一个窗口,每一次新的数据进来都在窗口进行一次平局然后输出。
matlab 数字滤波入门_第17张图片
在这个滤波器中,可以看到每次把前三个数据进行平均(分别乘以0.33333)然后输出。 这三个系数的不同组合(0.3333, 0.333, 0.3333)就组成了各种FIR滤波器。这些系数叫做filter coefficients. 或者叫做taps. 在matlab中,他们叫做 b. 下面是一个moving average filter的 例子:
matlab 数字滤波入门_第18张图片
matlab 数字滤波入门_第19张图片
End Bit
问题你可能已经注意到了, 对于moving average filter 一开始滤波的时候没有之前的数据做平均, 这可咋整? matlab的 filter函数是这么整的:filtered_data(2) = x(1)*0.2 + x(2)*0.2.总之,我们的5点滑动滤波的计算公式是:filtered_data(n) = b(1)*x(n) + b(2)*x(n-1) + b(3)*x(n-2) + b(4)*x(n-3) + b(5)*x(n-4).可以想到,如果滤波器的阶数很大(N) 那么滤波后的数据要比原始信号"迟缓" 很多。。这叫做相位延时
通过FFT看滤波后的频率响应
我们把原始信号和滤波后信号用FFT搞一把:
matlab 数字滤波入门_第20张图片
matlab 数字滤波入门_第21张图片
可以看出,5点moving average filter会使高频分量衰减。这是一种low pass filter, 通低频,阻高频。
小知识
搞一个滑动平均滤波器的系数可以用下面的简便方法:在这里插入图片描述
IIR filter
IR和FIR类似,不过进入了反馈机制。即下一次的滤波输出不仅仅和上几次的输入信号有关,还和上几次的输出信号有关。IIR比FIR"效率"更高,通常用更少的系数就可以达到很好的滤波结果,但是IIR也有缺点,由于引入了反馈机制,一些特定的系数组成的IIR滤波器可能不稳定,造成输出结果崩溃。
根据IIR滤波器的不同系数 有很多经典的IIR滤波器,什么Butterworth, Chebyshew, Bessel之类的,反正都是以牛人的名字命名的。本文只讨论一种滤波器:butterworth. 下面还是上例子:
先产生一个采样频率1000Hz, 2000个采样点的随机信号,然后用butter 滤一波:
matlab 数字滤波入门_第22张图片
matlab 数字滤波入门_第23张图片
butter 函数是matlab内置函数,输入截止频率和阶数,返回滤波器系数,b,a。 b 就跟FIR 一样的b(前馈系数), a指的是后馈系数。
matlab 数字滤波入门_第24张图片
可以看出同样是5阶滤波,butter filter的滤波效果单从幅频响应来说 比moving average 好了不少。
IIR 滤波器原理
使用matlab的帮助文档,可以看到一个框图,介绍滤波器是如何工作的:输入信号为x(m). 对应的乘以每一个b系数。 在5点moving average filter的例子中,这个b 就是 0.2,0.2,0.2,0.2,0.2. 输出为y(m). 这样每一个x(m)乘上对应的系数然后再加在一起 组成了 y.IIR 滤波器引入了’a’ 系数反馈环节。 每一次滤波,上一次的输出也要程序对应的系数a 然后减到本次输出中:
y(n)=b(1)*x(n)+b(2)*x(n-1)+ … + b(n)*x(n) - a(2)y(n-1) - a(3)*y(n-2)…
matlab 数字滤波入门_第25张图片
4. 自动信号检测
信号检测指的是在带有噪声的信号中发掘有用信号。
能量检测器一般的能量检测器包含以下步骤:
1.对信号进行滤波,将有用信号提取出来
2.对信号进行整流
3.对整流过的信号进行包络
4.设置阈值,检测有用信号
还是一个例子, 这次我们把一个正弦信号,藏 在噪声信号中的一个随机位置:
matlab 数字滤波入门_第26张图片
matlab 数字滤波入门_第27张图片
step1: 对信号进行滤波, 将有用信号提取出来, 我们搞一个 带宽为10Hz的 带通滤波器,中心频点设置在需要提取的正弦信号位置,这一波操作代码如下:
matlab 数字滤波入门_第28张图片
step2: 整流信号,其实就是取绝对值,把负的信号弄成正的:
matlab 数字滤波入门_第29张图片
step3: 对整流过的信号进行包络。 求整流过的信号的包络。可以通过一个低通滤波器实现。这里我们用一个6极点butter 滤波器实现,截止频率是 10Hz。过了这个滤波器,滤波后的信号基本就成了原信号的包络。注意信号的起始位置,因为过了滤波器,所有可以看出一点点的相位滞后
matlab 数字滤波入门_第30张图片
step4: 给信号设置阈值,搞一个变量gated, 当原信号超过一个阈值的时候,gated=1, 否则=0
matlab 数字滤波入门_第31张图片
setp5: diff一把,找到信号
在这里插入图片描述
matlab 数字滤波入门_第32张图片

你可能感兴趣的:(FPGA,matlab)