Как получить мощность на октаву розового шума (с помощью библиотеки Aquila DSP)?
Моя цель состоит в том, чтобы сделать программное обеспечение звукового эквалайзера; После небольшого исследования я обнаружил, что мне нужно генерировать розовый шум, записывать его с помощью микрофона и сравнивать два спектра.
До сих пор я генерировал только Pink Noise с библиотекой Aquila на C++, в которой используется алгоритм Voss, он звучит хорошо, хотя и немного менее громко, чем сэмпл в Википедии, который "нормализован до пика -1 дБ FS".
Я хотел получить мощность на ⅓ Octave Band, вот псевдокод того, что я сделал, используя этот пост, который мне очень помог:
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 до 17,8 Гц - результат = 393,421
От 17,8 Гц до 22,4 Гц - Результат = 375,055
От 22,4 Гц до 28,2 Гц - Результат = 520,531
[...]
От 891 Гц до 1122 Гц - Результат = 19048,2
От 1122 Гц до 1413 Гц - Результат = 23770,9
От 1413 до 1778 Гц - результат = 29700,3
[...]
От 11220 Гц до 14130 Гц - Результат = 214689
От 14130 Гц до 17780 Гц - результат = 268036
Что приводит к моим вопросам:
1 - Из того, что я понял, каждый результат должен быть примерно одинаковым, что здесь явно не так. Есть ли что-то (возможно, простое), что я делаю не так?
2 - Получаемое значение в дБ находится между 100 и 130, но на каждом графике, который я смотрю, значения отрицательные. Тот же вопрос, что и выше, есть ли что-то, что я должен сделать в дополнение к методу Aquila::db?
Спасибо за ваше время.
PS: Я хотел бы отметить, что обработка сигналов - это новое для меня, и я провел некоторые исследования, но я мог бы неправильно использовать некоторые термины.
1 ответ
Вы хотите сначала сложить величины спектра, а затем взять дБ (ваш код, кажется, делает обратное.) Журнал суммы очень отличается от суммы значений журнала.
дБ часто сообщается при значениях ниже некоторого опорного уровня. Поскольку это соотношение будет меньше 100%, логарифм этого отношения будет отрицательным.