我的目标是制作声音均衡器软件;经过一些研究后,我发现我需要产生粉红噪声,用麦克风录制,然后比较两个光谱。
到目前为止,我只使用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:我想指出信号处理对我来说是一件新事物,我做了一些研究,但我可能会以错误的方式使用某些术语。答案 0 :(得分:0)
你想首先加上频谱幅度,然后取db(你的代码似乎正好相反。)和的对数与对数值的总和非常不同。
dB通常报告的幅度低于某个参考电平。由于该比率将小于100%,该比率的对数将为负。