我的目标是制作一个声音均衡器软件;经过一番研究,我发现我需要产生一个粉红色的噪音,用麦克风记录下来,并比较这两个频谱。
到目前为止,我仅使用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/