【问题标题】:Audio equalization音频均衡
【发布时间】:2015-10-02 13:01:25
【问题描述】:

我正在使用 FFmpeg 开发音频播放器,我想将音频均衡器添加到我的应用程序中。我使用 FFmpeg 来获取音频样本并计算 FFT,但是当我尝试应用 IIR 滤波器之一时,我得到了非常嘈杂的音频信号。 这是我的代码:

double Q = 1.0;
double omega = 2.0 * PI * 1000.0 / 44100.0;
double sine = sin(omega);
double alpha = sine / ( 2.0 * Q);
double cosine = cos(omega);

double b0 = (1 + cosine)/2;
double b1 = (-1) * (1 + cosine);
double b2 = (1 + cosine)/2;
double a0 = 1 + alpha;
double a1 = (-2) * cosine;
double a2 = 1 - alpha;

for( int n = 2; n < fftSize; n++ )
{
   leftChannel2[n].re = ((b0/a0)*leftChannel[n].re + (b1/a0)*leftChannel[n-1].re + (b2/a0)*leftChannel[n-2].re -
                         (a1/a0)*leftChannel2[n-1].re - (a2/a0)*leftChannel2[n-2].re);
   rightChannel2[n].re = ((b0/a0)*rightChannel[n].re + (b1/a0)*rightChannel[n-1].re + (b2/a0)*rightChannel[n-2].re -
                          (a1/a0)*rightChannel2[n-1].re - (a2/a0)*rightChannel2[n-2].re);                    
   leftChannel2[n].im = leftChannel[n].im;
   rightChannel2[n].im = rightChannel[n].im;
}

谁能告诉我这段代码有什么问题?

【问题讨论】:

  • 我真的不明白你想用这段代码做什么。你想让某个频率范围更安静还是更响亮?
  • @Andrey,根据 Audio-EQ-Cookbook,这是具有 1kHz 切割频率的低通滤波器。我错过了一些代码。
  • 也许我遗漏了一些东西,但 sinecosine 不应该是函数,而不是一次性定义吗?
  • 实际上根据this Audio-EQ-Cookbook,它是一个高通滤波器(这也是你在Matlab中使用例如freqz绘制滤波器频率响应时得到的)。
  • @Andrey,所以我必须直接对音频样本应用过滤器?

标签: c++ signal-processing audio-processing equalizer


【解决方案1】:

此过滤器在 Excel 或 Matlab 中是否正确执行?乍一看,我在这里看不到语法或语义错误。顺便说一下,这个滤波器(差分方程)计算时域的频率响应。那么信号的虚部呢?如果它是非零的,你必须以同样的方式过滤它。

【讨论】:

  • 您确定时域吗?我正在过滤频域中的快速傅立叶变换的结果。我尝试以相同的方式过滤信号的虚部,但没有任何改变。
  • 您应该将此过滤器直接应用于时域。双二阶滤波器是一种递归滤波器,可以廉价地逼近频域中昂贵的滤波。
猜你喜欢
  • 2016-07-29
  • 2015-07-15
  • 1970-01-01
  • 2015-12-23
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
相关资源
最近更新 更多