Подтвердить что ты не робот

Понимание БПФ в aurioTouch2

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

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

Ответ 1

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

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

Я предполагаю, что мы вычисляем прямой БПФ из 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 я всегда предполагал, что они просто не беспокоят. n/2 результаты, очевидно, более удобны в работе, и вы вряд ли можете сказать из визуализатора: "О, смотрите, он пропускает одну величину на частоте Найквиста"

Документы UsingFourierTransforms объясняют упаковку

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

Они масштабируют все на -128db

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

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

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

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