Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

fir1

基于窗函数的 FIR 滤波器设计

说明

示例

b = fir1(n,Wn) 使用汉明窗设计具有线性相位的 n 阶低通、带通或多频带 FIR 滤波器。滤波器类型取决于 Wn 的元素数。

示例

b = fir1(n,Wn,ftype) 根据 ftype 的值和 Wn 的元素数,设计低通、高通、带通、带阻或多频带滤波器。

示例

b = fir1(___,window) 使用 window 中指定的向量和上述语法中的任何参数设计滤波器。

b = fir1(___,scaleopt) 还指定滤波器的幅值响应是否归一化。

注意:对于具有任意频率响应的加窗滤波器,请使用 fir2

示例

全部折叠

设计一个通带范围为 0.35πω0.65π 弧度/采样点的 48 阶 FIR 带通滤波器。可视化其幅值和相位响应。

b = fir1(48,[0.35 0.65]);
freqz(b,1,512)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

加载 chirp.mat。该文件包含信号 y,其大部分功率高于 Fs/4(即奈奎斯特频率的一半)。采样率为 8192 Hz。

设计一个 34 阶 FIR 高通滤波器,以衰减低于 Fs/4 的信号的分量。使用截止频率 0.48 和波纹为 30 dB 的切比雪夫窗。

load chirp

t = (0:length(y)-1)/Fs;

bhi = fir1(34,0.48,'high',chebwin(35,30));
freqz(bhi,1)

对信号进行滤波。显示原始信号和高通滤波后的信号。两个图使用相同的 y 轴刻度。

outhi = filter(bhi,1,y);

subplot(2,1,1)
plot(t,y)
title('Original Signal')
ys = ylim;

subplot(2,1,2)
plot(t,outhi)
title('Highpass Filtered Signal')
xlabel('Time (s)')
ylim(ys)

设计一个具有相同设定的低通滤波器。对信号进行滤波,并将结果与原始结果进行比较。两个图使用相同的 y 轴刻度。

blo = fir1(34,0.48,chebwin(35,30));

outlo = filter(blo,1,y);

subplot(2,1,1)
plot(t,y)
title('Original Signal')
ys = ylim;

subplot(2,1,2)
plot(t,outlo)
title('Lowpass Filtered Signal')
xlabel('Time (s)')
ylim(ys)

设计一个 46 阶 FIR 滤波器,用它衰减低于 0.4π 弧度/采样点以及介于 0.6π0.9π 弧度/采样点之间的归一化频率。将此滤波器命名为 bM。计算它的频率响应。

ord = 46;

low = 0.4;
bnd = [0.6 0.9];

bM = fir1(ord,[low bnd]);
[hbM,f] = freqz(bM,1);

重新设计 bM,使其通过它在上例中衰减的频带并阻止其他频率。将新滤波器命名为 bW。显示滤波器的频率响应。

bW = fir1(ord,[low bnd],"DC-1");

[hbW,~] = freqz(bW,1);
plot(f/pi,mag2db(abs(hbM)),f/pi,mag2db(abs(hbW)))
legend("bM","bW",Location="best")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent bM, bW.

使用汉宁窗重新设计 bM。("DC-0" 是可选的。)比较汉明设计和汉宁设计的幅值响应。

hM = fir1(ord,[low bnd],'DC-0',hann(ord+1));

hhM = freqz(hM,1);
plot(f/pi,mag2db(abs(hbM)),f/pi,mag2db(abs(hhM)))
legend("Hamming","Hann",Location="northwest")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Hamming, Hann.

使用图基窗重新设计 bW。比较汉明设计和图基设计的幅值响应。

tW = fir1(ord,[low bnd],'DC-1',tukeywin(ord+1));

htW = freqz(tW,1);
plot(f/pi,mag2db(abs(hbW)),f/pi,mag2db(abs(htW)))
legend("Hamming","Tukey",Location="best")
ylim([-75 5])
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Hamming, Tukey.

输入参数

全部折叠

滤波器阶数,指定为整数标量。

对于高通和带阻配置,fir1 始终使用偶数滤波器阶数。阶数必须为偶数,因为奇数阶对称 FIR 滤波器在奈奎斯特频率处必须具有零增益。如果为高通或带阻滤波器指定了奇数 n,则 fir1 会将 n 递增 1。

数据类型: double

频率约束,指定为标量、二元素向量或多元素向量。Wn 的所有元素必须严格大于 0 且严格小于 1,其中 1 对应于奈奎斯特频率:0 < Wn < 1。奈奎斯特频率是采样率的一半或 π 弧度/采样点。

  • 如果 Wn 是标量,则 fir1 设计的是截止频率为 Wn 的低通或高通滤波器。截止频率是滤波器的归一化增益为 -6 dB 处的频率。

  • 如果 Wn 是二元素向量 [w1 w2],其中 w1 < w2,则 fir1 设计的是截止频率下限为 w1 且截止频率上限为 w2 的带通或带阻滤波器。

  • 如果 Wn 是多元素向量 [w1 w2 ... wn],其中 w1 < w2 <…< wn,则 fir1 返回一个 n 阶多频带滤波器,频带为 0 < ω < w1w1 < ω < w2、…、wn < ω < 1。

数据类型: double

滤波器类型,指定为以下项之一:

  • 'low' 指定截止频率为 Wn 的低通滤波器。'low' 是标量 Wn 的默认值。

  • 'high' 指定截止频率为 Wn 的高通滤波器。

  • 如果 Wn 是二元素向量,则 'bandpass' 指定一个带通滤波器。当 Wn 有两个元素时,'bandpass' 是默认值。

  • 如果 Wn 是二元素向量,则 'stop' 指定一个带阻滤波器。

  • 'DC-0' 指定多频带滤波器的第一个频带为阻带。当 Wn 有两个以上的元素时,'DC-0' 是默认值。

  • 'DC-1' 指定多频带滤波器的第一个频带为通带。

窗,指定为向量。窗向量必须有 n + 1 个元素。如果不指定 window,则 fir1 使用汉明窗。有关可用窗的列表,请参阅加窗法

如果您尝试设计奇数阶的高通或带阻滤波器,fir1 不会自动增加 window 的长度。

示例: kaiser(n+1,0.5) 指定形状参数为 0.5 的凯塞窗,用于 n 阶滤波器。

示例: hamming(n+1) 等效于不指定窗。

数据类型: double

归一化选项,指定为 'scale''noscale'

  • 'scale' 将系数归一化,使滤波器在通带中心处的幅值响应为 1 (0 dB)。

  • 'noscale' 不对系数进行归一化。

输出参数

全部折叠

滤波器系数,以长度为 n + 1 的行向量形式返回。系数按照 Z 变换变量 z 的降幂排列:

B(z) = b(1) + b(2)z + … + b(n+1)z–n

算法

fir1 使用最小二乘逼近计算滤波器系数,然后通过 window 对冲激响应进行平滑处理。

参考

[1] Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, Algorithm 5.2.

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2006a 之前推出