Ответ 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...... я не уверен. Возможно, я ошибаюсь или это может быть... художественная лицензия?