数字信号处理中的逆滤波器(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代码如下

[invdft, fs3] = audioread('.\data\headphones+spkr\Opti-inverse.wav');
[spkir, fs4] = audioread('.\data\headphones+spkr\Optimus.wav');


N = 16384;
Y = fft(spkir, N);
ind1 = floor(18000/44100*N);
mag = abs(Y);
ang = angle(Y);

% mag(1) = 1 / mag(1);
mag(2:ind1) = 1 ./ mag(2:ind1);
mag(ind1+1:N-ind1+1) = mag(ind1);
mag(N-ind1+2:N) = flipud(mag(2:ind1));

% mag(mag2db(mag) > 60) = db2mag(60);

Ynew1 = mag.*exp(1j*ang);

yh = fftshift(real(ifft(Ynew1)));
[~, loc] = max(yh);
yhs = yh(loc-1023:loc+1024).*hann(2048)*db2mag(-6);
figure;
plot(yhs);
title('inverse filter')
figure;
freqz(yhs,1);
title('inverse filter frequency response')

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

相关推荐

  1. 探索信号处理:低通滤波器原理与应用

    2024-03-25 19:46:03       17 阅读
  2. 数字滤波器设计

    2024-03-25 19:46:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 19:46:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 19:46:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 19:46:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 19:46:03       20 阅读

热门阅读

  1. Spark 集群管理器

    2024-03-25 19:46:03       22 阅读
  2. C语言刷题(18)

    2024-03-25 19:46:03       17 阅读
  3. AST抽象语法树&webpack逻辑解析

    2024-03-25 19:46:03       38 阅读
  4. 【C语言】如何将数据写入文件?

    2024-03-25 19:46:03       21 阅读
  5. .NET 依赖注入和配置系统

    2024-03-25 19:46:03       17 阅读