C++ 如何获得粉红噪声的每倍频程功率(使用Aquila DSP库)?
我的目标是制作一个声音均衡器软件;经过一点研究,我发现我需要产生一个粉红色的噪音,用麦克风记录下来,然后比较两个光谱 到目前为止,我只生成了一个使用Voss算法的粉红色噪声,它听起来很好,尽管比维基百科上的样本“标准化为-1dbfs峰值”的声音要小一些 我想获得每一个人的力量⅓ 倍频带,这是我所做工作的伪代码,使用它帮助了我很多:C++ 如何获得粉红噪声的每倍频程功率(使用Aquila DSP库)?,c++,signal-processing,fft,spectrum,C++,Signal Processing,Fft,Spectrum,我的目标是制作一个声音均衡器软件;经过一点研究,我发现我需要产生一个粉红色的噪音,用麦克风记录下来,然后比较两个光谱 到目前为止,我只生成了一个使用Voss算法的粉红色噪声,它听起来很好,尽管比维基百科上的样本“标准化为-1dbfs峰值”的声音要小一些 我想获得每一个人的力量⅓ 倍频带,这是我所做工作的伪代码,使用它帮助了我很多: Aquila::PinkNoiseGenerator pinkNoise(44100); // sampleFrequency = 44.1 kHz Pink
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:我想指出,信号处理对我来说是一件新鲜事,我做了一些研究,但我可能用错了一些术语。你想先把频谱大小相加,然后取db,你的代码似乎做的正好相反。总和的日志与日志值的总和非常不同
dB通常报告为低于某一参考水平的震级。由于该比率将小于100%,因此该比率的对数将为负。谢谢,现在我的值更符合逻辑,但它们仍然不相等:它从低频时的145 dB开始,到高频时的140 dB。这是好的还是应该严格等同于良好的粉红色噪声?另外,我如何确定我需要有一个类似图形的参考值?我有点迷糊了,因为这是一个数字信号,我试着用我得到的最大幅度作为参考,但它似乎不起作用。