Понимание БПФ в aurioTouch2 - PullRequest
12 голосов
/ 13 января 2012

Я смотрел на aurioTouch 2 из примера кода Apple ( найден здесь ). В конце дня я хочу проанализировать частоты самостоятельно. Сейчас я пытаюсь понять кое-что из того, что здесь происходит. Приношу свои извинения, если это тривиально, просто пытаюсь понять некоторые некомментированные магические числа, плавающие в некоторых источниках. Мои главные пункты путаницы прямо сейчас:

  1. Почему они обнуляют значение Найквиста в FFTBufferManager :: ComputeFFT? Может ли это значение действительно быть выброшено? (строка 112 FFTBufferManager.cpp).
  2. Они уменьшают все на -128 дБ, поэтому я предполагаю, что результаты находятся в диапазоне (-128, 0). Однако позже в aurioTouchAppDelegate.mm (~ строка 807) они преобразуют это значение в значение от 0 до 1, прибавляя 80 и деля на 64, затем зажимая в 0 и 1. Почему нечеткость? Кроме того, я прав, предполагая, что значения будут в окрестности (-128, 0)?

1 Ответ

13 голосов
/ 13 января 2012

Ну, для меня это тоже не тривиально, но я так понимаю.Если я слишком упрощен, это просто для моей выгоды, я не хочу покровительствовать.

Обнуление результата, соответствующего частоте Найквиста:

IПредположим, что мы вычисляем прямое БПФ из 1024 входных выборок.На входе 44100 Гц это обычно верно в моем случае (но это не то, что делает AurioTouch, что я нахожу немного странным, но я не эксперт).Мне проще разобраться с конкретными значениями.

Учитывая 1024 (n) входных отсчетов, упорядоченных по мере необходимости (четные индексы «сначала, затем нечетные») {в [0], в [2], в [4]],…, В 1 , в [3], в [5],…}) (используйте vDSP_ctoz() для упорядочения ввода)

Вывод FFT 1024 (n) входных отсчетов составляет 513 ((n / 2) +1) комплексных значений.т.е. 513 вещественных компонентов и 513 мнимых компонентов, всего 1026 значений.

Однако, мнимые [0] и мнимые [512] (n / 2) всегда, обязательно, ноль .Таким образом, поместив real [512] (действительный компонент частотного бина Найквиста) в мнимое [0] и забыв мнимое [512] - что всегданоль и может быть выведен, результаты упакованы в буфер длины 1024 (n).

Таким образом, чтобы возвращаемые результаты были действительными, вы должны по крайней мере установить мнимый [0] вернуться к нулю.Если вам требуются все 513 ((n / 2) +1) частотные бины, вам нужно добавить еще одно комплексное значение к результату и установить его таким образом ..

unpackedVal = imaginary[0]
real[512]=unpackedVal, imaginary[512]=0
imaginary[0] = 0

В AurioTouch iвсегда предполагал, что они просто не беспокоятся.С результатами n / 2, очевидно, удобнее работать, и по визуализатору вы вряд ли сможете сказать: - « О, смотрите, на частоте Найквиста отсутствует одна величина »

Используя документы Фурье-преобразования, объясняют упаковку

NB конкретные значения 1024, 513, 512 и т. Д. Являются примерами, а не фактическими значениями n, (n / 2) +1, n / 2 изAurioTouch.

Они уменьшают все на -128 дБ

Не совсем, диапазон выходных значений равен относительно количества входных выборок так что его нужно нормализовать.Масштаб равен 1,0 / (2 * inNumberFrames).

После масштабирования диапазон составляет -1,0 -> + 1,0 .Затем берется величина комплексного вектора (фаза игнорируется), давая скалярное значение для каждого частотного интервала между 0 и 1,0

Это значение затем интерпретируется как значение децибела между -128 и 0

Материал для рисования ... +80 / 64. ... * 120 ... ... я не уверен.Я могу быть совершенно неправ или это может быть ... художественная лицензия?

...