第一步是验证您的初始采样率和目标采样率均是有理数。由于它们是整数,因此它们自动是有理数。如果其中一个不是一个有理数,仍然可以改变采样率,但这是一个非常不同的过程,而且难度更大。
下一步是考虑两个采样率。在这种情况下,起始采样率为44100,这是因数。目标采样率16000是因数。因此,要从初始采样率转换为目标率,我们必须抽取并内插。2 7 * 5 3 3 2 * 7 2 2 5 * 522* 32* 52* 7227* 5332* 7225* 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()进行内插,因此我们保留了160个样本,它们代表从-8 kHz到+8 kHz的频率。然后,我们对这些样本进行逆FFT运算并保存!您有160个时域采样,采样频率为16 kHz。25* 5
您可能会怀疑,有两个潜在的问题。我将逐一介绍并解释如何克服它们。
如果数据不是抽取因子的整数倍,该怎么办?您可以通过在数据末尾填充足够的零以使其成为抽取因子的倍数来轻松克服这一问题。在对数据进行FFT处理之前将其填充。
尽管我介绍的方法非常简单,但它也不理想,因为它会在时域中引入振铃和其他令人讨厌的伪影。您可以通过在删除高频数据之前对频域数据进行过滤来避免这种情况。您可以通过FFT'ing你长的过滤器做到这一点至少,填充数据(FFT'ing之前)l − 1升l − 1零(请注意,数据样本的数量和填充样本的数量都必须是抽取因子的正数-您可以增加填充长度来满足此约束),对填充的数据进行FFT,并乘以频域数据和滤波器,然后将高频(> 8 kHz)结果混叠为低频(<8 kHz)结果,然后再丢弃高频结果。不幸的是,由于频域中的滤波本身就是一个大话题,因此,我将无法在此答案中更详细地介绍。不过,我要说的是,如果您要过滤并处理多个块中的数据,则需要实现Overlap-and-Add或Overlap-and-Save以使过滤连续进行。
我希望这有帮助。
编辑:频域样本的起始数量与目标频域样本的数量之间的差异必须是偶数,以便您可以从结果的正侧除去与结果的负侧相同数目的样本。在我们的示例中,样本的起始数量是抽取率(即441),目标样本的数量是内插率(即160)。两者之差为279,不是偶数。解决方案是将FFT长度增加一倍至882,这会使目标样本数也增加一倍至320。现在两者之间的差异是偶数,并且可以毫无问题地丢弃适当的频域样本。