MATLAB中的高通滤波

use*_*339 25 matlab signal-processing filter digital-filter

有谁知道如何在MATLAB中使用过滤器?我不是一个爱好者,所以我不关心滚降特性等 - 我有一个100维采样的1维信号矢量,我想对它进行高通滤波(比如拒绝任何低于10Hz的信号) )去除基线漂移.

帮助中描述了Butterworth,Elliptical和Chebychev过滤器,但没有关于如何实现的简单解释.

abc*_*bcd 48

可以使用多个过滤器,过滤器的实际选择取决于您要实现的目标.既然你提到了Butterworth,Chebyschev和Elliptical滤波器,我假设你正在寻找一般的IIR滤波器.

维基百科是一个开始阅读不同过滤器和他们所做的事情的好地方.例如,巴特沃斯在通带中最大平坦,并且响应在阻带中滚降.在切比雪夫,你可以在通带(类型2)或阻带(类型1)中获得平滑的响应,并且在另一个中具有更大的不规则波纹,最后,在椭圆滤波器中,两个波段都有波纹.以下图片来自维基百科.

在此输入图像描述

因此,在所有这三种情况下,你必须换取其他东西.在Butterworth,你没有涟漪,但频率响应滚降速度较慢.在上图中,需要从0.4大约0.55到大约一半的功率.在Chebyschev,你会得到更陡峭的滚动,但是你必须在其中一个乐队中允许不规则和更大的涟漪,而在Elliptical中,你几乎可以瞬间切断,但你在两个乐队都有涟漪.

过滤器的选择完全取决于您的应用.你想要获得一个几乎没有损失的干净信号吗?那么你需要能够在通带中给出平滑响应的东西(Butterworth/Cheby2).您是否试图阻止阻带中的频率,并且您不会介意通带中的响应会有轻微损失吗?然后你需要在阻带(Cheby1)中平滑的东西.您是否需要极其尖锐的截止角,即超出通带的任何东西都会对您的分析产生不利影响?如果是这样,您应该使用椭圆滤镜.

关于IIR滤波器需要记住的是它们有极点.与FIR滤波器不同,您可以增加滤波器的阶数,唯一的分支是滤波器延迟,增加IIR滤波器的阶数将使滤波器不稳定.由于不稳定,我的意思是你将有一些位于单位圆外的极点.要了解为何如此,您可以阅读IIR过滤器上的维基文章,尤其是关于稳定性的部分.

为了进一步说明我的观点,请考虑以下带通滤波器.

fpass=[0.05 0.2];%# passband
fstop=[0.045 0.205]; %# frequency where it rolls off to half power
Rpass=1;%# max permissible ripples in stopband (dB)
Astop=40;%# min 40dB attenuation
n=cheb2ord(fpass,fstop,Rpass,Astop);%# calculate minimum filter order to achieve these design requirements

[b,a]=cheby2(n,Astop,fstop);
Run Code Online (Sandbox Code Playgroud)

现在,如果你看一下使用的零极图zplane(b,a),你会发现有几个极(x)位于单位圆之外,这使得这种方法不稳定.

在此输入图像描述

从频率响应全都是乱七八糟的事实可以看出这一点.使用freqz(b,a)得到以下

在此输入图像描述

要根据您的确切设计要求获得更稳定的滤波器,您需要在MATLAB中使用该z-p-k方法而不是使用二阶滤波器b-a.以下是与上述相同的过滤器的方法:

[z,p,k]=cheby2(n,Astop,fstop);
[s,g]=zp2sos(z,p,k);%# create second order sections
Hd=dfilt.df2sos(s,g);%# create a dfilt object.
Run Code Online (Sandbox Code Playgroud)

现在,如果你看看这个滤波器的特性,你会发现所有的极点都位于单位圆内(因此是稳定的)并且符合设计要求

在此输入图像描述

在此输入图像描述

这个方法类似于butterellip,相当于buttordellipord.MATLAB文档也有很好的设计滤波器的例子.您可以在这些示例的基础上构建并根据您的需要设计过滤器.

要对数据使用过滤器,您可以执行filter(b,a,data)filter(Hd,data)取决于最终使用的过滤器.如果您想要零相位失真,请使用filtfilt.但是,这不接受dfilt对象.因此,对于零相位滤波器Hd,请使用filtfilthdMathworks文件交换站点上提供的文件

编辑

这是对@DarenW评论的回应.平滑和过滤是两种不同的操作,虽然它们在某些方面相似(移动平均值是低通滤波器),但你不能简单地用一个替换另一个,除非你可以确定它不是关注具体应用.

例如,实现达人对从0-25kHz的线性啁啾信号的建议,在100kHz采样,与高斯滤波器的平滑后该频谱

在此输入图像描述

当然,接近10Hz的漂移几乎为零.但是,该操作完全改变了原始信号中频率分量的性质.出现这种差异是因为它们完全忽略了平滑操作的滚降(见红线),并假设它是零平面.如果这是真的,那么减法就行了.但是,唉,情况并非如此,这就是整个设计过滤器的领域存在的原因.

  • 你用答案让我成为一个更好的人 (3认同)

And*_*ass 7

创建过滤器 - 例如使用[B,A] = butter(N,Wn,'high')其中N是过滤器的顺序 - 如果您不确定这是什么,只需将其设置为10. Wn是在0和1之间归一化的截止频率,1对应于采样率的一半信号.如果您的采样率是fs,并且您希望截止频率为10 Hz,则需要进行设置Wn = (10/(fs/2)).

然后,您可以使用Y = filter(B,A,X)X是您的信号来应用滤波器.您还可以查看该filtfilt功能.