如何在 FFT 之前进行过滤和下采样?

信息处理 过滤器 fft
2022-02-11 10:29:44

我想以定义的采样率(44100Hz)对音乐信号执行 STFT。我想获得比最大可用频率范围更小的 FFT 结果(不是22050Hz,而是4000Hz),因此结果将具有更好的频率分辨率。所以我认为我应该对其进行下采样,但是如何下采样到与输入频率不成整数关系的频率(你不能离开第 k 个样本)?您是否进行某种插值来获取新样本的值?它如何影响信号?

我也知道我应该滤除高于8000Hz信号混叠的频率。在 STFT 中是否有某种与使用相关的过滤器?

我对过滤器的了解是,要获得更好(更清晰)的过滤器,您需要更多的系数,因此需要更多的时间来计算。我知道有 IIR 滤波器和 FIR 滤波器。我读到 IIR 过滤器可能不稳定,但如果我使用现成的实现(并且我认为它做得对),我应该关心它吗?

一次过滤整个信号(整个音频文件)会更好吗?如果我从 IIR 滤波器获得无限响应,并且我一次过滤整个信号,那么能量会在信号的末端部分被最模糊吗?

我还读到滤波器可能会对频率造成某种延迟,并且对于不同的频率会有所不同。您如何分析和补偿这种现象?

编辑:我发现你可以得到具有线性延迟的 FIR,而且现在它们比 IIR 更常用。但是还是有延迟,这是什么意思?频率事件(如音符)将在样本编号时间的后期发生?这个延迟会是什么?

Edit2:当我想降低采样率时,8000Hz我必须过滤,这样就不会有任何频率超过4000Hz. 这实际上是否可行,因为我查看了不同的 FIR 滤波器特性,它们似乎只是极大地抑制了阻带频率而不是消除它们?如果我在信号中只有一点高频,那么在下采样时信号看起来是否正常(混叠不会很明显)?

2个回答

以任意分数改变采样率的过程nk称为重采样。它基本上只是同时进行插值抽取

听起来您正试图从 44100 Hz 变为 4000 Hz。如果是这样,则需要将采样率更改为40441, 自从4410040441=4000. 实际上,您不希望一次进行非常大的采样率更改(例如通过 441 抽取),因为很难实现可以做到这一点的过滤器。因此,我们尝试将其分解为更小的步骤。

如果您将插值率分解为 40,我们看到它是 2 * 2 * 2 * 5。我们同样可以将抽取率分解为 3 * 3 * 7 * 7。然后,进行重采样的一种简单方法是分四个步骤完成,如下所示:

44100Hz23232757

如果您试图最小化计算负载,您可以重新安排重新采样的顺序以尽快降低采样率。这将使后面的重采样步骤的计算量减少,因为它们不必处理尽可能多的样本。

44100Hz27232357

你也可以将两者结合起来23重新取样,因为他们的产品,49, 没有任何大数。这给我们留下了以下内容-

44100Hz274957

回答最后的编辑:

当数据实时到达时,FIR 滤波器只有一个延迟,您需要在足够的未来样本到达之前处理结果。对于离线处理,您始终可以提前读取文件以获取“未来”样本,甚至可以按时间顺序向后过滤,因此无需任何延迟。但是您仍然需要处理文件开头和结尾处的不完整(零或虚构)过滤器输入数据。