如何获得粉红噪声的每倍频程的功率(使用Aquila DSP库)?

时间:2015-04-14 13:06:22

标签: c++ signal-processing fft spectrum

我的目标是制作声音均衡器软件;经过一些研究后,我发现我需要产生粉红噪声,用麦克风录制,然后比较两个光谱。

到目前为止,我只使用Voss算法生成了一个带有Aquila library in C++的粉红噪声,虽然维基百科上的样本“标准化为-1 dBFS峰值”的声音稍微大一点但听起来不错。

我想获得每⅓倍频带的功率,这里是我所做的伪代码,使用this post给了我很多帮助:

Aquila::PinkNoiseGenerator pinkNoise(44100);    // sampleFrequency = 44.1 kHz

PinkNoise.setAmplitude(65536 / 2);          // sampleAmplitude = 65536
PinkNoise.generate(32768);                  // http://goo.gl/85R4wm

Aquila::SpectrumType spectrum = Aquila::fft(PinkNoise); // contain ComplexeType(real, imaginary)
double  frequency, db;

for (i = 0; i <= (32768 / 2); i++)
{
      frequency = (i * 44100) / 32768;  
      foreach (thirdOctave : o)
      {
            if (frequency >= o.min && frequency < o.max)
            {
                   db = Aquila::db(spectrum[i]);    // How it’s done : http://goo.gl/tkRicN 
                   o.result += db;
            }
      }
}

foreach(thirdOctave : o)
    print(“From “ + o.min + “ Hz to “ + o.max + “ Hz - Result = “ + o.result);

以下是显示的内容:

  

从14.1 Hz到17.8 Hz - 结果= 393.421

     

从17.8 Hz到22.4 Hz - 结果= 375.055

     

从22.4 Hz到28.2 Hz - 结果= 520.531

     

[...]

     

从891 Hz到1122 Hz - 结果= 19048.2

     

从1122 Hz到1413 Hz - 结果= 23770.9

     

从1413 Hz到1778 Hz - 结果= 29700.3

     

[...]

     

从11220 Hz到14130 Hz - 结果= 214689

     

从14130 Hz到17780 Hz - 结果= 268036

这引出了我的问题:

1 - 根据我的理解,每个结果应该大致相同,这显然不是这里的情况。有什么(可能很简单)我做错了吗?

2 - 我得到的db值在100到130之间,但在我看的每个图形上,值都是负数。同上面的问题,除了Aquila :: db方法之外,还有什么我应该做的吗?

感谢您的时间。

PS:我想指出信号处理对我来说是一件新事物,我做了一些研究,但我可能会以错误的方式使用某些术语。

1 个答案:

答案 0 :(得分:0)

你想首先加上频谱幅度,然后取db(你的代码似乎正好相反。)和的对数与对数值的总和非常不同。

dB通常报告的幅度低于某个参考电平。由于该比率将小于100%,该比率的对数将为负。