如何获得粉红噪声的每倍频程功率(使用 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%,因此该比率的对数将为负数。
我的目标是做一个声音均衡软件;经过一番研究,我发现我需要生成粉红噪声,用麦克风记录下来,然后比较两个频谱。
到目前为止,我只用 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%,因此该比率的对数将为负数。