将任意 FIR 滤波器转换为具有相同幅度响应的线性相位 FIR 通常是不可能的。如msm 的回答中所述,此转换必须使用全通滤波器完成,该滤波器必须是 IIR 滤波器,并且只有在极少数情况下,您可以获得适当的零极点消除,总滤波器才会是 FIR。一般来说,你最终会得到一个 IIR 滤波器。
话虽如此,有可能将给定的 FIR 滤波器转换为具有大致相同幅度响应的线性相位 FIR 滤波器。通过增加线性相位 FIR 滤波器的长度,可以任意提高近似值。
该方法与您实现的方法相似,但关键区别在于零填充。您需要使用远大于给定 FIR 滤波器长度的 FFT 长度。
下面是一个八度音程示例,解释了它是如何工作的。我选择了一个长度为的非线性相位滤波器30, 并用一个长度来近似它39线性相位 FIR 滤波器:
% 想出一些非线性相位 FIR 滤波器
[b,a] = 黄油(5,.3);
h = impz(b,a);
h = h(1:30); % 长度 30
h = h(:)';
% 做 FFT 技巧
N = 1024; % FFT 长度(偶数!)
H = fft(h,N);
hlp = 真实(ifft(abs(H)));
hlp = [hlp(N/2+2:N),hlp(1:N/2)];
% 开窗
净重 = 39; % 选择窗口长度(奇怪!)= 过滤器长度
w = 个(1,Nw);% 直角。窗口(如果您愿意,请选择另一个)
w = w(:)';
Nw2 = (Nw-1)/2;
hlp = hlp(N/2-Nw2:N/2+Nw2) .* w;
% 阴谋
hlp = fft(hlp,N);
n = (0:N/2)*2/N;
子图(2,1,1),茎(h),等等,茎(hlp,'r'),等等
图例('NLP FIR','LP FIR')
子图(2,1,2),
绘图(n,20*log10(abs(H(1:N/2+1))),n,20*log10(abs(Hlp(1:N/2+1))),'r')
图例('NLP FIR', 'LP FIR'),网格打开
下图显示了两个 FIR 滤波器的脉冲响应和幅度响应。通过为线性相位 FIR 滤波器选择更长的滤波器长度可以进一步改进幅度近似。
