MATLAB函数——fir2
fir2:基于频率取样法的 FIR 滤波器设计
文章目录
fir2
:基于频率取样法的 FIR 滤波器设计
语法
b = fir2(n,f,m)
b = fir2(n,f,m,npt,lap)
说明
b = fir2(n,f,m)
返回幅频特性由向量 f
和 m
指定的 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
,则 fir2
将 n
增加 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}
z−n
算法
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 之前推出
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)