FIR 到线性相位 FIR

信息处理 matlab 有限脉冲响应 线性相位
2022-02-05 00:25:34

我正在尝试将 FIR 脉冲转换为线性相位 FIR 脉冲,我需要移除相位响应,因此当它应用于声音时,它只会改变幅度响应。

下面是我的代码:

clear all; 
close all;        
[x,fs]=audioread('impulse.wav')

s=fft(x)    
ph=angle(s)

amp=abs(s)    
s2=real(ifft(pol2cart(0,amp))) ; setting phase to zero

s2= circshift(s2,(round(length(s2)/2)))
plot(s2)

s2=s2/max(max(abs(s2)))

audiowrite('LinearPhaseImpulse.wav',s2,fs,'BitsPerSample',24)
  • 这是将 FIR 转换为线性相位 FIR 脉冲响应的正确方法吗?
  • 如何否定相位,使 FIR 变为线性相位?
1个回答

将任意 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 滤波器选择更长的滤波器长度可以进一步改进幅度近似。

在此处输入图像描述