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

How do I obtain the power per octave of a Pink noise (Using Aquila DSP library)?

我的目标是做一个声音均衡软件;经过一番研究,我发现我需要生成粉红噪声,用麦克风记录下来,然后比较两个频谱。

到目前为止,我只用 Aquila library in C++ 生成了粉红噪声,它使用 Voss 算法,听起来不错,但比维基百科上的“归一化为 -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);

显示的内容如下:

From 14.1 Hz to 17.8 Hz - Result = 393.421

From 17.8 Hz to 22.4 Hz - Result = 375.055

From 22.4 Hz to 28.2 Hz - Result = 520.531

[...]

From 891 Hz to 1122 Hz - Result = 19048.2

From 1122 Hz to 1413 Hz - Result = 23770.9

From 1413 Hz to 1778 Hz - Result = 29700.3

[...]

From 11220 Hz to 14130 Hz - Result = 214689

From 14130 Hz to 17780 Hz - Result = 268036

这引出了我的问题:

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

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

感谢您的宝贵时间。

PS : 我想指出信号处理对我来说是一个新事物,我做了一些研究,但我可能用错了一些术语。

您想先将频谱幅度相加,然后取分贝(您的代码似乎是相反的。)总和的对数与对数值的总和有很大不同。

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