第一步是验证您的起始采样率和目标采样率都是有理数。因为它们是整数,所以它们自动是有理数。如果其中一个不是有理数,仍然可以改变采样率,但这是一个非常不同的过程并且更加困难。
下一步是考虑这两个采样率。在这种情况下,起始采样率为 44100,这会影响到22∗32∗52∗72. 目标采样率,16000,因素27∗53. 因此,要将起始采样率转换为目标率,我们必须通过以下方式抽取32∗72并插值25∗5.
无论您想如何重新采样数据,都必须完成前面的步骤。现在让我们谈谈如何使用 FFT 来实现。使用 FFT 重新采样的技巧是选择 FFT 长度,以使一切顺利进行。这意味着选择一个是抽取率倍数的 FFT 长度(在本例中为 441)。为了示例的目的,我们选择 FFT 长度 441,尽管我们可以选择 882、1323 或 441 的任何其他正倍数。
要了解这是如何工作的,有助于将其可视化。您从一个音频信号开始,在频域中看起来类似于下图。
当您完成处理后,您希望将采样率降低到 16 kHz,但您希望失真尽可能小。换句话说,您只需将上图中的所有内容保持在 -8 kHz 到 +8 kHz 之间,并放弃其他所有内容。结果如下图。
请注意,采样率不是按比例缩放的,它们只是为了说明概念。
选择作为抽取因子倍数的 FFT 长度的好处在于,您可以简单地通过删除 FFT 结果的一部分来重新采样,然后对剩下的内容进行反 FFT。在我们的示例中,您对 441 个数据样本进行 FFT,从而在频域中获得 441 个复杂样本。我们要抽取 441 并插值 160 (25∗5),因此我们保留了代表 -8 kHz 到 +8 kHz 频率的 160 个样本。然后我们对这些样本进行反 FFT 和 presto!您有 160 个以 16 kHz 采样的时域样本。
您可能会怀疑,有几个潜在的问题。我将逐一介绍并解释如何克服它们。
如果您的数据不是抽取因子的倍数,您会怎么做?您可以通过用足够的零填充数据的末尾以使其成为抽取因子的倍数来轻松克服这一问题。数据在 FFT 之前被填充。
尽管我解释的方法非常简单,但它也很不理想,因为它会在时域中引入振铃和其他令人讨厌的伪影。您可以通过在删除高频数据之前过滤频域数据来避免这种情况。你可以通过 FFT'ing 你的长度过滤器来做到这一点l,填充您的数据(在 FFT 之前)至少l−1零(请注意,数据样本的数量和填充样本的数量都必须是抽取因子的正倍数 - 您可以增加填充长度以满足此约束),对填充数据进行 FFT,乘以频域数据和滤波器,然后将高频 (> 8 kHz) 结果混叠为低频 (< 8 kHz) 结果,然后丢弃高频结果。不幸的是,由于频域中的过滤本身就是一个很大的话题,我将无法在这个答案中更详细地介绍。不过,我要说的是,如果您过滤并处理多个数据块中的数据,您将需要实现Overlap-and-Add或Overlap-and-Save以使过滤连续。
我希望这有帮助。
编辑:频域样本的起始数量和频域样本的目标数量之间的差异需要是偶数,以便您可以从结果的正侧删除与结果的负侧相同数量的样本。在我们的示例中,起始样本数是抽取率,即 441,目标样本数是插值率,即 160。差异为 279,不是偶数。解决方案是将 FFT 长度加倍到 882,这导致目标样本数也加倍到 320。现在差异是偶数,您可以毫无问题地删除适当的频域样本。