当前位置:   article > 正文

数字信号处理中的逆滤波器(inverse filter)matlab实现

数字信号处理中的逆滤波器(inverse filter)matlab实现

由线性时不变系统的可逆性,输入经过原系统之后再经过对应的逆系统可得到原输入。

用冲击响应来描述原系统和逆系统的关系,设原系统冲击响应为h(n), 逆系统的冲激响应为h_{I}(n),上图等价于如下的卷积方程:

w(n) = h_{I}(n)*h(n)*x(n) = x(n)

这意味着:

h(n) *h_{I}(n) = \delta (n)

上式可求出给定h(n)h_{I}(n),然而在时域中求解上式通常很困难。更简单的方法是将上式转换到z域来求解逆系统,上式在z变换域可表示为:

H(z) H_{I}(z) = 1

系统函数为:

H_{I} (z) = 1 / H(z)

H(z)的所有零点都位于单位圆内(最小相位系统),这样得到的H_{I}(z)是稳定的。

知道H(z)H_{I}(z)似乎很简单,但是如果h(n)是一个很长的脉冲响应(FIR滤波器的系数),对其求逆系统会得到全极点的IIR滤波器,并且阶数也非常大。

在MIT的HRTF 数据库中,为了进行扬声器均衡,作者用到了使用DFT/IDFT进行求解扬声器脉冲响应的逆滤波器的方法。具体的步骤如下:

  1. h(n)进行padding(补零),使用FFT计算h(n)的离散傅里叶变换(DFT)得到H(k)。补零是防止发生混叠;
  2. 计算1/H(k),限制幅度
  3. 使用IFFT计算H(k)的IDFT
  4. 得到因果的滤波器,并加窗

matlab代码如下

  1. [invdft, fs3] = audioread('.\data\headphones+spkr\Opti-inverse.wav');
  2. [spkir, fs4] = audioread('.\data\headphones+spkr\Optimus.wav');
  3. N = 16384;
  4. Y = fft(spkir, N);
  5. ind1 = floor(18000/44100*N);
  6. mag = abs(Y);
  7. ang = angle(Y);
  8. % mag(1) = 1 / mag(1);
  9. mag(2:ind1) = 1 ./ mag(2:ind1);
  10. mag(ind1+1:N-ind1+1) = mag(ind1);
  11. mag(N-ind1+2:N) = flipud(mag(2:ind1));
  12. % mag(mag2db(mag) > 60) = db2mag(60);
  13. Ynew1 = mag.*exp(1j*ang);
  14. yh = fftshift(real(ifft(Ynew1)));
  15. [~, loc] = max(yh);
  16. yhs = yh(loc-1023:loc+1024).*hann(2048)*db2mag(-6);
  17. figure;
  18. plot(yhs);
  19. title('inverse filter')
  20. figure;
  21. freqz(yhs,1);
  22. title('inverse filter frequency response')
  23. fvtool(yhs, 1, invdft,1)

Optimus.wav是MIT HRTF数据集中的扬声器脉冲响应,长度为16383。Opti-inverse.wav是MIT数据库提供的2048点的扬声器脉冲响应的逆滤波器系数,上面的代码以Optimus.wav作为输入,求解逆滤波器。最终得到的逆滤波器和数据库提供的比较接近 ,如下图:

参考:

[1] William G. Gardner. 3-D Audio Using Loudspeakers
[2]  Bill Gardner and Keith Martin. HRTF Measurements of a KEMAR Dummy-Head Microphone
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/287838
推荐阅读
相关标签
  

闽ICP备14008679号