13

我有来自 CD 的 44Khz 音频流,表示为 16 位 PCM 样本数组。我想将其缩减为 11KHz 流。我怎么做?从我多年前上工程课的日子开始,我知道流将无法准确描述超过 5500Hz 的任何东西,所以我想我也想剪掉超过 5500Hz 的所有东西。有任何想法吗?谢谢。

更新:此页面上有一些代码使用简单的算法和看起来像 { 1, 4, 12, 12, 4, 1 } 的系数数组从 48KHz 转换为 8KHz。我认为这就是我所需要的,但我需要它的 4 倍而不是 6 倍。知道这些常数是如何计算的吗?此外,无论如何,我最终还是将 16 字节样本转换为浮点数,因此我可以使用浮点数而不是短裤进行下采样,如果这对质量有帮助的话。

4

10 回答 10

10

阅读 FIR 和 IIR 滤波器。这些是使用系数阵列的过滤器。

如果您在“FIR 或 IIR 滤波器设计器”上进行谷歌搜索,您会发现许多软件和在线小程序可以为您完成艰巨的工作(获取系数)。

编辑:

这个页面在这里(http://www-users.cs.york.ac.uk/~fisher/mkfilter/)让你输入你的过滤器的参数,并会吐出准备使用C代码......

于 2008-10-26T18:46:05.327 回答
5

你是对的,你需要对你的信号应用低通滤波。任何超过 5500 Hz 的信号都将出现在您的下采样信号中,但会“混叠”为另一个频率,因此您必须在下采样之前将其删除。

使用浮点数进行过滤是个好主意。也有定点滤波器算法,但这些算法通常需要权衡质量。如果您有花车,请使用它们!

使用 DFT 进行过滤通常是矫枉过正,它使事情变得更加复杂,因为 dft 不是一个连续的过程,而是在缓冲区上工作。

数字滤波器通常有两种口味。FIR 和 IIR。这通常是相同的想法,但 IIF 滤波器使用反馈回路来实现更陡峭的响应和更少的系数。这对于下采样可能是一个好主意,因为您需要一个非常陡峭的滤波器斜率。

下采样是一种特殊情况。因为您将丢弃 4 个样本中的 3 个,所以无需计算它们。为此有一类特殊的滤波器,称为多相滤波器。

尝试在谷歌上搜索多相 IIR 或多相 FIR 以获取更多信息。

于 2008-10-26T20:27:30.550 回答
5

请注意(除了其他评论之外)简单直观的方法“通过将每组 4 个连续样本替换为平均值来将样本缩小 4 倍”不是最优的,但仍然没有错,实际上也没有概念上。因为平均等于一个低通滤波器(一个矩形窗口,对应于频率的正弦值)。在概念上错误的是通过每 4 个样本中的一个来进行下采样:这肯定会引入混叠。

顺便说一句:几乎所有进行重新采样的软件(音频、图像或其他;音频案例的示例:sox)都会考虑到这一点,并经常让您选择底层的低通滤波器。

于 2010-03-26T17:34:09.860 回答
1

您需要在对信号进行下采样之前应用低通滤波器以避免“混叠”。低通滤波器的截止频率应小于奈奎斯特频率,即采样频率的一半。

于 2008-10-26T18:18:54.367 回答
1

可能的“最佳”解决方案确实是 DFT,丢弃前 3/4 的频率,并执行逆 DFT,域限制在底部的 1/4。在这种情况下,丢弃前 3/4 是低通滤波器。填充到 2 个样本的幂可能会给您带来速度优势。请注意您的 FFT 包如何存储样本。如果它是一个复杂的 FFT(更容易分析,并且通常具有更好的特性),频率将从 -22 到 22,或 0 到 44。在第一种情况下,您需要中间的 1/4。在后者中,最外层的 1/4。

您可以通过将样本值平均在一起来完成足够的工作。以四乘四的方式抓取样本并进行相等加权平均的天真方法是可行的,但并不太好。相反,您需要使用“内核”函数以非直观的方式将它们平均在一起。

在数学上,丢弃低频带之外的所有内容是乘以频率空间中的盒函数。(逆)傅立叶变换将逐点乘法转换为函数的(逆)傅立叶变换的卷积,反之亦然。因此,如果我们想在时域工作,我们需要使用盒函数的(逆)傅里叶变换进行卷积。结果证明这与“sinc”函数(sin at)/at 成正比,其中 a 是频率空间中框的宽度。因此,在每第 4 个位置(因为您要进行 4 倍的下采样),您可以将其附近的点相加,乘以 sin (a dt) / a dt,其中 dt 是到该位置的时间距离。有多近?好吧,这取决于您希望它听起来有多好。它'

最后,还有一种很糟糕(但很快)的方法,就是丢弃大部分样本,只保留第零个、第四个等等。

老实说,如果它适合记忆,我建议只走 DFT 路线。如果它不使用其他人推荐的软件过滤器包之一为您构建过滤器。

于 2008-10-26T21:03:49.947 回答
1

您所追求的过程称为“抽取”。有2个步骤:

  1. 对数据应用低通滤波器(在您的情况下,LPF 在 Pi / 4 处截止)。
  2. 下采样(在您的情况下,从 4 个样本中抽取 1 个)。

有许多方法可以设计和应用低通滤波器。

你可以从这里开始:

http://en.wikipedia.org/wiki/Filter_design

于 2011-05-09T14:32:02.143 回答
1

您可以使用libsamplerate来完成繁重的工作。Libsamplerate 是一个 C API,负责计算滤波器系数。您可以从不同的质量过滤器中进行选择,以便您可以权衡质量以换取速度。

如果您不想编写任何代码,您可以使用Audacity进行采样率转换。它提供了强大的 GUI,并利用 libsamplerate 进行采样率转换。

于 2011-06-05T04:41:47.487 回答
0

我会尝试应用 DFT,砍掉 3/4 的结果并应用逆 DFT。如果不真正努力,我无法判断它是否听起来不错。

于 2008-10-26T18:27:22.633 回答
0

我最近遇到了BruteFIR,它可能已经做了一些你感兴趣的事情?

于 2009-04-15T11:07:49.517 回答
0

您必须应用低通滤波器(去除 5500 Hz 以上的频率),然后应用抽取(在您的情况下每第 N 个样本,每 4 个样本)。

对于抽取,通常使用 FIR 而不是 IIR 滤波器,因为它们不依赖于先前的输出,因此您不必为丢弃的样本计算任何内容。IIR 通常取决于输入和输出,因此,除非使用特定类型的 IIR,否则您必须在丢弃 3/4 之前计算每个输出样本。

刚刚搜索了一篇关于这个主题的介绍性文章:https ://www.dspguru.com/dsp/faqs/multirate/decimation

于 2013-06-24T17:41:43.353 回答