这个例子展示了如何使用两个命令行函数设计和实现FIR过滤器,fir1
而且designfilt
,以及互动滤波器设计应用程序。
创建一个在示例中使用的信号。信号是一个100赫兹的正弦波加 高斯白噪声。将随机数生成器设置为可重现结果的默认状态。
rng默认的Fs = 1000;t = linspace(0,1,Fs);X = cos(2*pi*100*t)+0.5*randn(size(t));
滤波器设计为FIR低通滤波器,阶数为20,截止频率为150hz。使用一个凯泽窗,其长度大于一个样本的过滤顺序和
.看到凯撒
了解凯撒窗口的详细信息。
使用fir1
设计滤波器。fir1
需要在区间[0,1]中的归一化频率,其中1对应于
rad /样品。使用fir1
,则必须将所有频率规格转换为标准化频率。
设计滤波器并查看滤波器的震级响应。
Fc = 150;Wn = (2/Fs)*fc;b = fir1(20,Wn,“低”3)、kaiser(21日);fvtool (b, 1“Fs”Fs)
将滤波器应用于信号,并绘制100hz正弦波前十个周期的结果。
Y = filter(b,1,x);Plot (t,x,t,y) xlim([0 0.1])“时间(s)”) ylabel (“振幅”)传说(原始信号的,过滤数据的)
设计相同的过滤器使用designfilt
.将过滤器响应设置为“lowpassfir”
并输入规格名称,值
对。与designfilt
,您可以以Hz为单位指定过滤器设计。
Fs = 1000;Hd = designfilt(“lowpassfir”,“FilterOrder”, 20岁,“CutoffFrequency”, 150,...“DesignMethod”,“窗口”,“窗口”{@kaiser 3},“SampleRate”Fs);
过滤数据并绘制结果。
y1 = filter(Hd,x);Plot (t,x,t,y1) xlim([0 0.1])“时间(s)”) ylabel (“振幅”)传说(原始信号的,过滤数据的)
本例展示了如何使用交互式窗口法设计和实现一个低通FIR滤波器滤波器设计应用程序。
通过输入启动应用程序filterDesigner
在命令行。
设置响应类型来低通滤波器.
设置设计方法来冷杉并选择窗口方法。
下过滤器订单中,选择指定的顺序.将顺序设置为20。
下频率的规范,设置单位来赫兹,Fs到1000,和足球俱乐部到150年。
点击设计滤波器.
选择文件>出口……将FIR滤波器作为系数或过滤器对象导出到MATLAB®工作空间。在本例中,将筛选器导出为对象。指定变量名为高清
.
点击出口.
使用导出的过滤器对象对命令窗口中的输入信号进行过滤。绘制100hz正弦波前十个周期的结果。
y2 = filter(Hd,x);Plot (t,x,t,y2) xlim([0 0.1])“时间(s)”) ylabel (“振幅”)传说(原始信号的,过滤数据的)
选择文件>生成MATLAB代码>滤波器设计功能生成一个MATLAB函数,使用您的规范创建一个过滤器对象。
您还可以使用交互工具filterBuilder
设计你的过滤器。
这个例子展示了如何设计一个带通滤波器,并用最小阶FIR等纹波滤波器和IIR巴特沃斯滤波器过滤数据。您可以将许多真实世界的信号建模为振荡分量、低频趋势和附加噪声的叠加。例如,经济数据通常包含振荡,这表示周期叠加在缓慢变化的上升或下降趋势上。此外,还有一个附加噪声成分,它是测量误差和过程中固有的随机波动的组合。
在这些例子中,假设您在一年的时间里每天都对某个过程进行抽样。假设流程在大约一周和一个月的范围内振荡。此外,数据和添加剂均有低频上升趋势 高斯白噪声。
创建两个频率为1/7和1/30周期/天的正弦波的叠加信号。添加一个低频递增趋势项和 高斯白噪声。重置随机数发生器可重现的结果。数据以1个样本/天进行采样。绘制结果信号和功率谱密度(PSD)估计。
rng默认的Fs = 1;N = 1:6 65;X = cos(2* *(1/7)*n)+cos(2* *(1/30)*n- /4);趋势= 3*sin(2*pi*(1/1480)*n);Y = x+趋势+0.5*randn(size(n));[pxx,f] =周期图(y,[],[],Fs);Subplot (2,1,1) plot(n,y) xlim([1 365]) xlabel(“天”) grid subplot(2,1,2) plot(f,10*log10(pxx)) xlabel(“周期/天”) ylabel (“数据库”网格)
随着低频功率的增加,功率谱密度估计出现低频趋势。低频功率以1/30次/天的频率出现在振荡上方约10 dB。在过滤器阻带的规格中使用此信息。
设计最小阶FIR等纹波和IIR巴特沃斯滤波器,其规格为:通频带为[1/40,1/4]次/天,阻频带为[0,1/60]和[1/4,1/2]次/天。设置两个阻带衰减为10 dB,通带纹波公差为1 dB。
Hd1 = designfilt(“bandpassfir”,...“StopbandFrequency1”, 1/60,“PassbandFrequency1”, 1/40,...“PassbandFrequency2”1/4,“StopbandFrequency2”1/2,...“StopbandAttenuation1”10“PassbandRipple”, 1...“StopbandAttenuation2”10“DesignMethod”,“equiripple”,“SampleRate”Fs);Hd2 = designfilt(“bandpassiir”,...“StopbandFrequency1”, 1/60,“PassbandFrequency1”, 1/40,...“PassbandFrequency2”1/4,“StopbandFrequency2”1/2,...“StopbandAttenuation1”10“PassbandRipple”, 1...“StopbandAttenuation2”10“DesignMethod”,“黄油”,“SampleRate”Fs);
比较FIR和IIR滤波器的阶数和未包裹相位响应。
流(' FIR滤波器的阶为%d\n', filtord (Hd1))
FIR滤波器的阶数为78
流(IIR滤波器的阶为%d\nfiltord (Hd2))
IIR滤波器的阶数为8
[phifir,w] = phasez(Hd1,[],1);[phiiir,w] = phasez(Hd2,[],1);Figure plot(w,unwrap(phifir)) hold住在情节(w,打开(phiiir))从包含(“周期/天”) ylabel (“弧度”)传说(FIR等纹波滤波器,“IIR巴特沃斯滤波器”网格)
IIR滤波器的阶数比FIR滤波器低得多。然而,FIR滤波器在通带上有线性相位响应,而IIR滤波器没有。FIR滤波器平均延迟滤波器通带中的所有频率,而IIR滤波器则不是。
此外,在FIR滤波器中,每单位频率的相位变化率比在IIR滤波器中要大。
设计一个低通FIR等纹波滤波器进行比较。低通滤波器规格为:通带[0,1/4]次/天,阻带衰减等于10 dB,通带纹波容差设置为1 dB。
Hdlow = designfilt(“lowpassfir”,...“PassbandFrequency”1/4,“StopbandFrequency”1/2,...“PassbandRipple”, 1“StopbandAttenuation”10...“DesignMethod”,“equiripple”,“SampleRate”1);
用带通和低通滤波器过滤数据。
yfir = filter(Hd1,y);yiir = filter(Hd2,y);yellow = filter(Hdlow,y);
绘制带通IIR滤波器输出的PSD估计。你可以替换yiir
与yfir
在下面的代码中查看FIR带通滤波器输出的PSD估计。
[pxx,f] =周期图(yiir,[],[],Fs);情节(f, 10 * log10 (pxx))包含(“周期/天”) ylabel (“数据库”网格)
PSD估计结果表明,带通滤波器能有效地抑制低频趋势和高频噪声。
绘制前120天的FIR和IIR滤波器输出。
Plot (n,yfir,n,yiir)轴([1 120 -2.8 2.8])xlabel(“天”)传说(FIR带通滤波器输出,IIR带通滤波器输出,...“位置”,“东南”)
在FIR滤波器中相位延迟的增加在滤波器输出中是明显的。
将低通FIR滤波器输出叠加在7天周期和30天周期的叠加上进行比较。
Plot (n,x,n, yellow) xlim([1 365]) xlabel(“天”)传说(“7天和30天周期”,FIR低通滤波器输出,...“位置”,“西北”)
在上面的图中,您可以看到低通滤波器输出中低频趋势很明显。虽然低通滤波器保留了7天和30天的周期,但带通滤波器在本例中表现更好,因为带通滤波器也去除了低频趋势。
这个例子展示了如何执行零相位滤波。
重复信号产生和低通滤波器设计用fir1
而且designfilt
.如果工作空间中已经有这些变量,则不必执行以下代码。
rng默认的Fs = 1000;t = linspace(0,1,Fs);X = cos(2*pi*100*t)+0.5*randn(size(t));%使用fir1Fc = 150;Wn = (2/Fs)*fc;b = fir1(20,Wn,“低”3)、kaiser(21日);使用designfiltHd = designfilt(“lowpassfir”,“FilterOrder”, 20岁,“CutoffFrequency”, 150,...“DesignMethod”,“窗口”,“窗口”{@kaiser 3},“SampleRate”Fs);
使用以下命令筛选数据过滤器
.绘制滤波器输出的前100个点,以及与输入信号具有相同振幅和初始相位的叠加正弦信号。
yout = filter(Hd,x);Xin = cos(2* *100*t);Plot (t,xin,t,yout) xlim([0 0.1]) xlabel(“时间(s)”) ylabel (“振幅”)传说(“输入正弦波”,过滤数据的网格)
查看过滤数据的最初0.01秒,您可以看到输出相对于输入是延迟的。延迟似乎约为0.01秒,这几乎是样本中FIR滤波器长度的1/2 .
这种延迟是由于滤波器的相位响应。这些例子中的FIR滤波器是I型线性相位滤波器。滤波器的群时延为10个样本。
绘制使用的组延迟fvtool
.
fvtool(高清“分析”,“grpdelay”)
在许多应用中,相位失真是可以接受的。当相位响应为线性时尤其如此。在其他应用中,需要具有零相位响应的滤波器。零相位响应在技术上不可能出现在非因果滤波器中。但是,可以使用因果滤波器来实现零相位滤波filtfilt
.
对输入信号进行滤波filtfilt
.绘制响应以比较所获得的过滤器输出过滤器
而且filtfilt
.
yzp = filtfilt(Hd,x);Plot (t,xin,t,yout,t,yzp) xlim([0 0.1]) xlabel(“时间(s)”) ylabel (“振幅”)传说(“100赫兹正弦波”,“过滤信号”,“零相位滤波”,...“位置”,“东北”)
在上图中,可以看到filtfilt
不表现出延迟由于相位响应的FIR滤波器。