音频均衡器的过滤器

信息处理 过滤器 声音的 过滤器设计 均衡 C++
2022-02-22 06:16:37

我是 DSP 新手,我必须在 C++ 中做一个音频均衡器。
我对它进行了大量研究并在上个月尝试了一些东西,但我对所有这些信息有点不知所措,而且它还没有工作。

我决定重新开始,现在我得到的只是一个用正弦波(1kHz)填充音频缓冲区的函数。我正在尝试对其应用具有这些值的过滤器。

<Filter>
    <Bands num-bands="28">
        <band0    freq="31.25"      width="7.23625"     gain="0" />
        <band1    freq="39.3725"    width="9.1171"      gain="0" />
        <band2    freq="49.6063"    width="11.4868"     gain="0" />
        <band3    freq="62.5"       width="14.4725"     gain="0" />
        <band4    freq="78.7451"    width="18.2342"     gain="0" />
        <band5    freq="99.2126"    width="22.9737"     gain="0" />
        <band6    freq="125"        width="28.945"      gain="0" />
        <band7    freq="157.49"     width="36.4684"     gain="0" />
        <band8    freq="198.425"    width="45.9473"     gain="0" />
        <band9    freq="250"        width="57.89"       gain="0" />
        <band10   freq="314.98"     width="72.9368"     gain="0" />
        <band11   freq="396.85"     width="91.8946"     gain="0" />
        <band12   freq="500"        width="115.78"      gain="0" />
        <band13   freq="629.961"    width="145.874"     gain="0" />
        <band14   freq="793.701"    width="183.789"     gain="0" />
        <band15   freq="1000"       width="231.56"      gain="6" />
        <band16   freq="1259.92"    width="291.747"     gain="0" />
        <band17   freq="1587.4"     width="367.579"     gain="0" />
        <band18   freq="2000"       width="463.12"      gain="0" />
        <band19   freq="2519.84"    width="583.495"     gain="0" />
        <band20   freq="3174.8"     width="735.157"     gain="0" />
        <band21   freq="4000"       width="926.24"      gain="0" />
        <band22   freq="5039.68"    width="1166.99"     gain="0" />
        <band23   freq="6349.6"     width="1470.31"     gain="0" />
        <band24   freq="8000"       width="1852.48"     gain="0" />
        <band25   freq="10079.4"    width="2333.98"     gain="0" />
        <band26   freq="12699.2"    width="2940.63"     gain="0" />
        <band27   freq="16000"      width="3704.96"     gain="0" />
    </Bands>
</Filter>

所以这是我的问题:

  1. 我应该在哪个域中应用过滤器?我从频域开始,但是这个博客(这里这里)告诉我这不是最好的也是唯一的解决方案。

  2. 我应该使用哪种过滤器?我迷失了所有那些高通、低通、峰值、搁架滤波器;我不知道该选择哪一个。

  3. 我只找到“教程”来创建一个只修改一个频率/频段的滤波器。是否可以创建一个过滤器,它是多个过滤器的总和?或者对信号串联多个滤波器?

随意问我是否忘记了一些可能有助于理解我的问题的东西。
谢谢你的时间。

PS:对不起,如果这篇文章不是很具体,但我想在发布具体问题或代码之前清除它。

2个回答

简而言之,您需要一组通带滤波器。您通过每个过滤器输入信号,并对过滤器的输出求和。

设计过滤器是乐趣所在。

首先,假设这只是音频(音乐等),那么就不需要特殊的过滤器。你可以用最简单最快的,不用太担心相位和纹波。
您将需要使用 IIR 滤波器,因为它们需要最少的计算量 - 因为您有 28 个频段并且可能在立体声中工作,您将希望减少 CPU 的负载,否则计算机将无法做很多事情别的。IIR 使用的 CPU 时间比 FIR 滤波器少。

您可以使用在线工具为滤波器创建所需的系数。也可以使用 Matlab 或 Gnu Octave。您将需要查找实现 IIR 滤波器的算法,以及如何使用计算的系数。

指定波段是下一个有趣的步骤。当过滤器通过音频时,它不会简单地删除其通带之外的所有内容。只是不可能这样做。滤波器通带之外的频率会向零幅度倾斜。
在其通带之外的某个频率处,音频幅度将下降一半。这是 -3dB 点,用于指定滤波器。
您要做的是安排通带,使相邻滤波器的 -3dB 点处于相同频率。假设您有两个过滤器。一个应该通过从 500 到 1000Hz 的频率,然后从 1000 到 2000Hz。您可能希望下滤波器的高截止频率为 1000Hz,而高滤波器的低截止频率也为 1000Hz。设计滤波器,使每个滤波器中的 1000Hz 降低一半(通常,只需将其指定为截止频率就足够了。)当您现在将两者的输出相加时,它们加起来只是从 500 到 200Hz 的音频,所有内容在该范围内(或多或少)与以前相同的幅度。

现在,随着您的音频被分成银行,您可以将每个滤波器的输出与某个常数相乘,以抑制或强调该频段。这张图片展示了我所说的乐队必须布置的方式。 均衡器

首先,如果您想测试均衡器,则不应使用正弦波作为输入信号,而应使用具有更丰富频谱的信号。通过这种方式,您可以比较输入和输出频谱并检查均衡器性能。

1) 时域总是优于频域是不正确的。但是,如果您是初学者,这不应该是您的第一个问题。从最简单的解决方案开始,当 eq 工作时专注于性能。

2 和 3)我认为您正在寻找一个filterbank,它是一组并行应用的过滤器。在这种情况下,您需要一组带通滤波器,其中每个滤波器都具有您在上面指定的中心频率和宽度。