代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

对数字音频进行下采样并应用低通滤波器

  •  13
  • twk Mark Adler  · 技术社区  · 16 年前

    我从CD上得到了一个44Khz的音频流,表示为16位PCM样本的数组。我想把它减少到11KHz的频率。我该怎么做?从我多年前上工程课的时候起,我就知道这条流再也不能准确地描述超过5500Hz的任何东西了,所以我想我也要删掉这上面的所有内容。有什么想法吗?谢谢

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

    10 回复  |  直到 15 年前
        1
  •  10
  •   Nils Pipenbrinck    16 年前

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

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

    编辑:

    这一页在这里( http://www-users.cs.york.ac.uk/~fisher/mkfilter/ )允许您输入过滤器的参数,并将吐出准备使用的C代码。。。

        2
  •  5
  •   Mendelt    16 年前

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

    使用浮动进行过滤是个好主意。也有固定点过滤算法,但这些算法通常有质量折衷。如果你有花车,那就用吧!

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

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

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

    有关更多信息,请尝试谷歌搜索多相IIR或多相FIR。

        3
  •  5
  •   leonbloy    15 年前

    请注意(除其他注释外),简单直观的方法” 通过将每组4个连续样本替换为平均值,将样本减少4倍

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

        4
  •  1
  •   Hallgrim    16 年前

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

        5
  •  1
  •   wnoise    16 年前

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

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

    最后还有一种很差(但很快)的方法,就是丢弃大部分样本,只保留第0个、第4个,依此类推。

    老实说,如果它适合内存,我建议只使用DFT路线。如果它没有使用其他人建议为您构建过滤器的软件过滤器包之一。

        6
  •  1
  •   Royi    14 年前

    你所追求的过程叫做“抽取”。 有两个步骤:

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

    设计和应用低通滤波器的方法很多。

    你可以从这里开始:

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

        7
  •  1
  •   Russell    14 年前

    你可以利用 libsamplerate 去做这项繁重的工作。Libsamplerate是一个C API,负责计算过滤器系数。您需要从不同的质量过滤器中进行选择,以便在质量和速度之间进行权衡。

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

        8
  •  0
  •   artificialidiot    16 年前

    我会尝试应用DFT,将结果的3/4切掉,然后应用逆DFT。如果不真的努力,我就说不出它听起来是否好。

        9
  •  0
  •   Jon Cage    16 年前

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

        10
  •  0
  •   Danijel    7 年前

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

    刚在谷歌上搜索了一篇介绍这一主题的文章: https://www.dspguru.com/dsp/faqs/multirate/decimation

    推荐文章