Преобразование AudioKit FFT в дБ?

Публикация впервые, спасибо за отличное сообщество!

Я использую AudioKit и пытаюсь добавить фильтры частотного взвешивания на вход микрофона, поэтому я пытаюсь понять значения, которые исходят из AudioKit AKFFTTap.

В настоящее время я пытаюсь просто распечатать буфер FFT, преобразованный в значения в дБ.

for i in 0..<self.bufferSize {
    let db = 20 * log10((self.fft?.fftData[Int(i)])!)
    print(db)
}

Я ожидал, что значения будут в диапазоне от -128 до 0, но я получаю странные значения почти -200 дБ, и когда я дую в микрофон, чтобы зафиксировать показания, он достигает только -60. Я не правильно подхожу к этому? Я предполагал, что значения, выводимые механизмом EZAudioFFT, будут простыми значениями амплитуды и что нормальная математика преобразования дБ будет работать. У кого-нибудь есть идеи?

Заранее благодарим за обсуждение этой проблемы!


person Dan Jensen    schedule 01.11.2017    source источник
comment
эй, Дэн Дженсен добился решения этого вопроса? Потому что у меня такой же вопрос, как и у твоего вопроса   -  person Mahesh Dangar    schedule 12.09.2018
comment
Привет, Пауло, на самом деле мне никогда не удавалось заставить это работать правильно в AudioKit. AudioKit великолепен, но я нашел другое решение, которое лучше подходит для моей ситуации, под названием Superpowered. Я смог заставить его работать так, как я ожидал от этого приложения. superpowered.com   -  person Dan Jensen    schedule 13.09.2018
comment
вы достигли решения получили ли вы дБ (А)?   -  person NLU    schedule 06.04.2020


Ответы (2)


Вам нужно добавить все значения из self.fft?.fftData (подумайте об изменении отрицательных значений на положительные перед добавлением), а затем измените это на децибелы

person Lu_    schedule 14.11.2017
comment
Я попробовал вашу идею суммирования абсолютных значений в self.fft?.fftData, и я определенно получил более разумный результат, однако результаты все еще слишком чувствительны. Чтобы проверить это, я добавляю значение смещения, чтобы показания соответствовали показаниям специального измерителя SPL, который у меня есть здесь, на моем столе. И если я говорю, свистну, дую или создаю розовый шум и сравниваю результаты, мое приложение подскакивает на 40 дБ +, в то время как измеритель SPL увеличивается только на 7-10 дБ. Я сравнил с некоторыми приложениями iOS для просмотра показаний в дБ, и они, похоже, дают аналогичные результаты с измерителем SPL. Есть идеи, почему это было бы намного более чувствительным? - person Dan Jensen; 15.11.2017
comment
сколько образцов вы используете для одного расчета? полный буфер? Я использовал стандартный Tap, у меня нет опыта работы с AKFFTTap, так что, возможно, я что-то упустил - person Lu_; 16.11.2017

Значения в массиве соответствуют значениям элементов разрешения БПФ. Наличие одного бина, содержащего значение величины, близкое к 1, означало бы, что большое количество энергии находится в этой узкой полосе частот, например. очень громкая синусоида (сигнал с одной частотой).

Нормальные звуки, такие как тот, что вы дует в микрофон, распределяют свою энергию по всему спектру, то есть во множестве бункеров, а не только в одном. По этой причине обычно величины снижаются с увеличением размера БПФ.

Величина -40 дБ на одном бункере довольно громкая. Если вы попытаетесь воспроизвести тон, вы должны увидеть четкий пик в одной из ячеек.

person Matti Jokipii    schedule 15.11.2017
comment
В AudioKit значения бинов не имеют шкалы от 0 до 1, они представляют собой величины, которые могут содержать значения от нуля до 700-1000. Если бы я мог получить это по шкале от 0 до 1, это очень помогло бы, но я не понимаю, как это сделать без четкого максимального значения для справки. Я дул в микрофон, чтобы попытаться получить эту ссылку, но никогда не было постоянного верхнего предела для величин, производимых fft. - person Dan Jensen; 15.11.2017
comment
Ваш вопрос создает впечатление, что значения находятся в диапазоне 0..1, только ближе к 0, чем вы ожидаете. - person Matti Jokipii; 17.11.2017