MATLAB函数——fir2

fir2:基于频率取样法的 FIR 滤波器设计


语法

b = fir2(n,f,m)
b = fir2(n,f,m,npt,lap)

b = fir2(___,window)


说明

b = fir2(n,f,m) 返回幅频特性由向量 fm 指定的 n 阶 FIR 滤波器。该函数将所需的频率响应线性插值到密集的网格上,然后使用傅立叶逆变换和 Hamming 窗来获得滤波器系数。举例

b = fir2(n,f,m,npt,lap) 指定 npt,即插值网格中的点数;而 lap,即 fir2 插入重复频率点周围区域的长度,它指定了频率响应中阶跃的形式。举例

b = fir2(___,window) 除了指定上述语法中的任何输入自参数外,还指定在设计中使用的窗向量。举例

注意

使用 fir1 来设计基于窗窗函数的标准低通,带通,高通,带阻和多频带滤波器。


示例


衰减低频信号

加载MAT文件 chirp。该文件包含以 Fs = 8192 Hz 采样的信号 y。该信号的大部分功率高于 Fs/4 = 2048 Hz,或奈奎斯特频率的一半。向信号中添加随机噪声。

load chirp
y = y + randn(size(y))/25;
t = (0:length(y)-1)/Fs;

设计一个 34 阶 FIR 高通滤波器,以衰减低于 Fs/4的信号分量。指定归一化截止频率为 0.48,约等于 1966 Hz。将滤波器的频率响应可视化。

f = [0 0.48 0.48 1];
mhi = [0 0 1 1];
bhi = fir2(34,f,mhi);

freqz(bhi,1,[],Fs)

高通滤波器
对线性调频信号进行滤波。在滤波前后绘制信号。

outhi = filter(bhi,1,y);

figure
subplot(2,1,1)
plot(t,y)
title('Original Signal')
ylim([-1.2 1.2])

subplot(2,1,2)
plot(t,outhi)
title('Higpass Filtered Signal')
xlabel('Time (s)')
ylim([-1.2 1.2])

滤波前后的线性调频信号
将滤波器从高通更改为低通。 使用相同的阶数和截止频率。再次进行滤波。结果主要是噪音。

mlo = [1 1 0 0];
blo = fir2(34,f,mlo);
outlo = filter(blo,1,y);

subplot(2,1,1)
plot(t,y)
title('Original Signal')
ylim([-1.2 1.2])

subplot(2,1,2)
plot(t,outlo)
title('Lowpass Filtered Signal')
xlabel('Time (s)')
ylim([-1.2 1.2])

低通结果


FIR 低通滤波器

设计一个归一化截止频率为 0.6 π \pi π rad / sample 的 30 阶低通滤波器。在同一张图上绘制实际频率响应与理想频率响应。

f = [0 0.6 0.6 1];
m = [1 1 0 0];

b1 = fir2(30,f,m);
[h1,w] = freqz(b1,1);

plot(f,m,w/pi,abs(h1))
xlabel('\omega / \pi')
lgs = {'Ideal','fir2 default'};
legend(lgs)

实际频率响应与理想频率响应
使用 64 点插值网格重新设计滤波器。

b2 = fir2(30,f,m,64);
h2 = freqz(b2,1);

hold on
plot(w/pi,abs(h2))
lgs{3} = 'npt = 64';
legend(lgs)

在这里插入图片描述
使用 64 点插值网格和截止频率附近的13点间隔重新设计滤波器。
在这里插入图片描述


任意幅度滤波器

设计具有以下频率响应的FIR滤波器:

  • 频率为 0 到 0.18 π \pi π rad / sample 的正弦信号。
    F1 = 0:0.01:0.18;
    A1 = 0.5+sin(2*pi*7.5*F1)/4;
    
  • 频率在 0.2 π \pi π rad / sample 和 0.78 π \pi π rad / sample 之间的分段线性节。
    F2 = [0.2 0.38 0.4 0.55 0.562 0.585 0.6 0.78];
    A2 = [0.5 2.3 1 1 -0.2 -0.2 1 1];
    
  • 频率在 0.79 π \pi π rad / sample 与奈奎斯特频率之间的二次节。
    F3 = 0.79:0.01:1;
    A3 = 0.2+18*(1-F3).^2;
    

使用 Hamming 窗设计滤波器。 指定过滤阶数为 50。

N = 50;

FreqVect = [F1 F2 F3];
AmplVect = [A1 A2 A3];

ham = fir2(N,FreqVect,AmplVect);

使用成型参数为 3 的 Kaiser 窗再次计算。

kai = fir2(N,FreqVect,AmplVect,kaiser(N+1,3));

使用 designfilt 函数重新设计滤波器。默认情况下,designfilt 使用矩形窗。计算 1024 点的滤波器的零相响应。

d = designfilt('arbmagfir','FilterOrder',N, ...
    'Frequencies',FreqVect,'Amplitudes',AmplVect);

[zd,wd] = zerophase(d,1024);

显示三个滤波器的零相响应,外加理想的响应。

zerophase(ham,1)
hold on
zerophase(kai,1)
plot(wd/pi,zd)
plot(FreqVect,AmplVect,'k:')
legend('Hamming','Kaiser','designfilt','ideal')

三个滤波器的零相响应,外加理想的响应


输入参数


n - 滤波器阶数

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

对于通带处于奈奎斯特频率的情况,fir2 始终使用偶数阶。如果此时指定奇数值 n,则 fir2n 增加 1。

数据类型:double


f,m - 幅频特性

幅频特性,指定为具有相同长度的向量

  • f 是频率点的矢量,范围从 0 到 1,其中 1 对应于奈奎斯特频率。f 的第一个点必须为 0,最后一个点必须为 1。f 必须以升序排序。允许重复的频率点,并将其视为频率响应中的阶跃。

  • m 是一个向量,包含了在 f 中指定的每个频点处所需的幅度响应。

数据类型:double


npt - 网格点数

网格点数,指定为正整数标量,默认为 512。npt 必须大于滤波器阶数的二分之一:npt > n/2。

数据类型:double


lap - 重复频率点周围区域的长度

重复频率点周围区域的长度,指定为正整数标量,默认为 25。

数据类型:double


window - 窗

窗,指定为列向量。 窗向量必须具有 n + 1 个元素。 如果未指定窗,则 fir2 将使用 Hamming 窗。 有关可用窗口的列表,请参见加窗法

如果尝试设计使用通带为奈奎斯特频率的奇数阶滤波器,则 fir2 不会自动增加窗的长度。

举例kaiser(n+1,0.5) 指定一个用于 n 阶滤波器的成型因子为 0.5 的 Kaiser 窗。

举例hamming(n+1) 等价于未指定窗。

数据类型:double


输出参数


b - 滤波器系数

滤波器系数,以长度为 n + 1行向量返回。这些系数以 Z 变换变量 z z z 的降幂排序:
B ( z ) = \bm{B}(z)= B(z)= b(1) + b(2) z z z + … + b(n+1) z − n z^{-n} zn


算法

fir2 使用频率取样法来设计滤波器。该函数将所需的频率响应线性内插到长度为 npt 的密集、均匀间隔的网格上。fir2 还在f的重复值附近设置了重叠点区域,以提供陡峭但平滑的过渡。该函数将对网格进行快速傅里叶逆变换并乘以 window,以获得滤波器系数。


参考

[1] Jackson, L. B. Digital Filters and Signal Processing. 3rd Ed. Boston: Kluwer Academic Publishers, 1996.

[2] Mitra, Sanjit K. Digital Signal Processing: A Computer Based Approach. New York: McGraw-Hill, 1998.


扩展功能


C/C++ 代码生成

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

用法说明和限制:

所有输入必须为常数。 如果表达式或变量的值不变,则也允许使用。


另请参阅

butter | cheby1 | cheby2 | designfilt | ellip | filter | fir1 | firpm | hamming | maxflat | yulewalk


在 R2006a 之前推出


原文参考:https://ww2.mathworks.cn/help/signal/ref/fir2.html

  • 8
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值