频率响应 <-> 脉冲响应

信息处理 fft 窗函数 IFFT
2022-02-14 07:33:58

我正在尝试根据所需的频率响应计算实际的频率响应。

fftSize = 128;
fs = 8000;

我有 2 个输入数组:f[] 和 aDesired[],它们都是实数,长度为 fftSize+1(包括 DC + Nyquist)。f[] 数组在 0 和 fs/2 (0:4000) 之间呈线性间隔。aDesired[] 数组是以 dB 为单位的增益或线性值。

我可以轻松更改 f[] 和 aDesired[] 的长度,因为我有一个可以提供任何大小输出的插值函数,但我认为这是一个很好的数字。

我想采用 ADesired[] 的 IFFT 来生成系数(具有可配置的长度)、窗口和截断系数,然后 FFT 来显示实际响应是什么,aActual[]。

当输入均为实数时,如何获取此数据的 IFFT/FFT?或者我如何准备更多的数据?

最后,相位无关紧要,是否线性无关紧要。

是否有可以与我的输入数据一起使用的库?

概括:

Input: f[129] : linearly spaced fc's
       aDesired[129] : Real values of linearly spaced gains at fc's (either in lin or log),

Processing:
       coeffs = IFFT(f, aDesired)
       coeff_new Truncate(window * coeff)
       aActual = FFT(f, coeff_new)

Output: aActual[]

非常感谢

1个回答

正如 Jason R 在他的评论中指出的那样,您获得实际频率响应的方式只是其中一种方式。还有许多其他确定实际滤波器响应的方法。任何其他频域 FIR 滤波器设计方法都可以完成这项工作,并且使用每种方法,您都会得到略有不同的结果。话虽如此,让我们看一下您想要的方式:

你有一个真正有价值的期望响应。这是所需频率响应的幅度,因为对于因果(可实现)系统,频率响应始终是复数值。然而,这不是问题,因为任何有限长度的脉冲响应总是可以通过添加一些延迟来产生因果关系。首先,我们需要使期望的响应对称,这对于实值系统是必需的。让列向量 D 是等距频率网格上的期望幅度值向量,介于 0 和fs/2,那么对称的期望响应是(使用 Matlab/Octave 语法):

Dsym=[D;D(N/2:-1:2)];

在哪里N是 FFT 长度。我们可以通过逆 FFT 获得(非因果)脉冲响应:

h=real(ifft(Dsym));

请注意,由于数值错误,只需要去除微小的虚部即可取实部。为了使脉冲响应具有因果关系,我们需要将其后半部分移到开头:

h_c=[h(N/2+2:N); h(1:N/2+1)];

现在可以将脉冲响应与窗口函数相乘:

h_w = h_c.*w;

你的实际频率响应是

H=fft(h_w);

它是复数值,因此为了将其与所需响应进行比较,您需要绘制其大小:

plot(abs(H))

实际响应的相位是线性的,即系统只是增加了一些延迟,但没有引入任何相位失真。