Как получить мощность на октаву розового шума (с помощью библиотеки Aquila DSP)?

Моя цель состоит в том, чтобы сделать программное обеспечение звукового эквалайзера; После небольшого исследования я обнаружил, что мне нужно генерировать розовый шум, записывать его с помощью микрофона и сравнивать два спектра.

До сих пор я генерировал только розовый шум с Библиотека Aquila в C ++ который использует алгоритм Восса, он звучит хорошо, хотя и немного менее громко, чем сэмпл в Википедии, который «нормализован до пика -1 дБФС».

Я хотел получить мощность на октавную полосу, вот псевдокод того, что я сделал, используя эта почта что мне очень помогло:

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%, логарифм этого отношения будет отрицательным.

0

Другие решения


По вопросам рекламы [email protected]