如何实现均衡器

时间:2013-01-10 23:26:14

标签: java signal-processing fft equalizer

我知道有很多关于均衡器的问题,但我没有得到我正在寻找的东西。我想要做的是一个均衡器,用于修改音频样本,如:

equalizer.eqAudio(audiosamples, band, gain)

我不确定这是否是我想要的确切界面,因为我在实现它们方面对DSP知之甚少(我使用过滤器,限制器,压缩器但没有制作它们)。

所以关于这个谷歌搜索我读到我必须对样本进行FFT,这样我得到每个频率范围的数据而不是幅度,按照我想要的方式处理它,然后进行FFT的反转,所以我得到了结果音频样本再次。我寻找了这个FFT的实现,并找到了JTransform for Java。该库具有称为离散余弦变换(DCT)的FFT相关算法的实现。

我的问题是:

  • 嗯,我是以正确的方式吗?
  • 由于FFT给出了有关频率的数据,我应该将一大块样本传递给FFT算法。这个块一定要多大?
  • 是否有一本关于DSP编程的好书可以解释均衡器?

谢谢!

2 个答案:

答案 0 :(得分:13)

我认为没有必要使用FFT进行音频均衡。我将使用IIR或FIR滤波器实现均衡器。

通常推荐的参考是Cookbook Formulae for Audio EQ Biquad Filter Coefficients

用于编程双二阶滤波器的java教程。 http://arachnoid.com/BiQuadDesigner/index.html

  

是否有一本关于DSP编程的好书可以解释均衡器?

Understanding Digital Signal Processing是对DSP的一个很好的介绍。有关FIR和IIR滤波器的章节。

朱利叶斯·史密斯三世的{p> Intoduction To Digital Filters with Audio Applications

Martin Holters和Udo Zolzer的

Graphic Equalizer Design Using Higher-Order Recursive Filters是一篇简短的论文,详细介绍了一种EQ滤波器设计方法。

答案 1 :(得分:11)

获得均衡器有许多不同的方法,正如Shannon所解释的那样,IIR / FIR滤波器方式就是其中之一。但是,如果您的目标是快速启动并运行均衡器,那么通过FFT方式可能会更容易,因为存在大量的参考实现。

关于FFT大小的问题,它取决于您希望均衡器具有的频率分辨率。如果您选择16的大小,您将在频域中获得9(8个复数+ 1个实数)通道,从0到fs / 2等间隔。第1个以0Hz为中心,第9个以fs / 2 Hz为中心。请注意,一些实现返回16个通道,其中高部分是低部分的镜像和复杂共轭版本。

关于均衡器功能的实现,将每个通道乘以所需增益。如果光谱具有镜像部分,也可以反映增益。如果不这样做,以下IFFT的结果将不是实值信号。乘法后,应用IFFT。

关于FFT和基于滤波器的均衡器之间的区别,请记住,FFT只是计算一组FIR滤波器的快速方法,其中正弦波为脉冲,临界采样(采用滤波器长度下采样)和均匀间隔的中心频率

问候