我有一张来自CD的44Khz音频流,表示为16位PCM样本的数组。我想把它切成11KHz的流。我怎么做?从我多年前的工程课时代开始,我知道流不能再准确地描述超过5500Hz的任何东西了,所以我想我也想把所有东西都切掉。有任何想法吗?感谢。

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

有帮助吗?

解决方案

读取FIR和IIR滤波器。这些是使用coefficent数组的过滤器。

如果你在“FIR或IIR滤镜设计师”上进行谷歌搜索你会发现很多软件和在线applet为你完成艰苦的工作(获得系数)。

修改

此页面( http://www-users.cs。 york.ac.uk/~fisher/mkfilter/ )允许您输入过滤器的参数,并准备好使用C-Code ...

其他提示

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

使用浮点数进行过滤是个好主意。还有定点滤波器算法,但这些算法通常具有可用的质量权衡。如果你有浮子然后使用它们!

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

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

下采样是一种特殊情况。因为你要扔掉4个样本中的3个,所以不需要计算它们。这种称为多相滤波器的滤波器有一类特殊的滤波器。

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

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

顺便说一下:实际上任何进行重新采样的软件(音频,图像或其他任何;音频情况的示例:sox)都会考虑到这一点,并经常让您选择底层的低通滤波器。

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

您称之为“抽取”的过程。 有两个步骤:

  1. 对数据应用低通滤波器(在您的情况下,在Pi / 4处使用截止的LPF)。
  2. 下采样(在您的情况下,从4个样本中取出1个)。
  3. 有许多方法可以设计和应用低通滤波器。

    你可以从这里开始:

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

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

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

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

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

您可以通过将样本值平均在一起来做足够的工作。按照四乘四的方式抓取样本并做一个相等的加权平均值的方法很有效,但不是太大。相反,你会想要使用“内核”。以非直观的方式将它们平均在一起的函数。

Mathwise,丢弃低频段以外的所有内容乘以频率空间中的box函数。 (逆)傅立叶变换将逐点乘法转换为函数的(逆)傅立叶变换的卷积,反之亦然。因此,如果我们想在时域中工作,我们需要使用box函数的(逆)傅里叶变换执行卷积。结果证明与“sinc”成比例。 function(sin at)/ at,其中a是频率空间中盒子的宽度。因此,在每个第4个位置(因为你的下采样4倍),你可以将它附近的点相加,乘以sin(a dt)/ a dt,其中dt是到该位置的时间距离。怎么在附近?嗯,这取决于你希望它听起来有多好。例如,忽略第一个零点之外的所有内容是常见的,或者只是将点数作为下采样的比率。

最后,只有丢弃大部分样本,只保留第0个,第4个等等,这是穷人(但速度很快)的方法。

老实说,如果它适合记忆,我建议你去DFT路线。如果它没有使用其他人建议的软件过滤器包来为您构建过滤器。

我最近遇到了 BruteFIR ,这可能已经做了一些什么你有兴趣吗?

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

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

直接搜索有关此主题的简介文章: https:// www。 dspguru.com/dsp/faqs/multirate/decimation

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top