我的目标是制作一个声音均衡器软件;经过一番研究,我发现我需要产生一个粉红色的噪音,用麦克风记录下来,并比较这两个频谱。

到目前为止,我仅使用Aquila library in C++使用Voss算法生成了粉红噪声,虽然听起来比Wikipedia上的样本“归一化为-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-我得到的分贝值在100到130之间,但是在我看的每张图形上,该值都是负数。与上述相同的问题,除了Aquila :: db方法之外,我还应该做些其他事情吗?

谢谢你的时间。

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

最佳答案

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

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

关于c++ - 如何获得粉红噪声的每倍频程功率(使用Aquila DSP库)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29628156/

10-11 22:53