Comprender FFT en aurioTouch2

He estado mirando aurioTouch 2 desde el código de ejemplo de Apple (que se encuentra aquí ). Al final del día, quiero analizar las frecuencias yo mismo. Por ahora estoy tratando de entender algo de lo que está sucediendo aquí. Mis disculpas si esto es trivial, solo bash comprender algunos de los numbers mágicos sin comentarios que flotan en alguna parte de la fuente. Mis principales puntos de confusión en este momento son:

  1. ¿Por qué cero el valor de nyquist en FFTBufferManager :: ComputeFFT? ¿Se puede tirar realmente este valor? (~ línea 112 de FFTBufferManager.cpp).
  2. Reducen todo hacia abajo en -128db, así que asumo que los resultados están en el range de (-128, 0). Sin embargo, más tarde en aurioTouchAppDelegate.mm (~ línea 807), convierten esto a un valor entre 0 y 1 al agregar 80 y dividir por 64, y luego sujetar a 0 y 1. ¿Por qué la borrosidad? Además, ¿estoy en lo correcto al suponer que los valores estarán en las proximidades de (-128, 0)?

Bueno, tampoco es trivial para mí, pero así es como lo entiendo. Si he simplificado demasiado, es solo para mi beneficio, no quiero ser condescendiente.

Poner a cero el resultado correspondiente a la frecuencia de Nyquist:

Supongo que estamos computando el FFT directo de 1024 muestras de input. Con una input de 44100hz esto suele ser cierto en mi caso (pero no es lo que está haciendo AurioTouch, lo que me parece un poco raro, pero no soy un experto). Es más fácil para mí comprender con valores específicos.

Dadas 1024 (n) muestras de input, arregladas según sea necesario (incluso los índices primero y luego los índices impares {{en [0], en [2], en [4], …, en 1 , en [3], en [5] , …}) (use vDSP_ctoz() para orderar su input)

La salida de las muestras de input FFT 1024 (n) es 513 ((n / 2) +1) valores complejos. es decir, 513 componentes reales y 513 componentes imaginarios , un total de 1026 valores.

Sin embargo, imaginario [0] e imaginario [512] (n / 2) son siempre, necesariamente, cero . Por lo tanto, al colocar [512] real (el componente real del contenedor de frecuencias Nyquist) en imaginario [0] y olvidar imaginario [512] , que siempre es cero y se puede inferir, los resultados se empaquetan en un buffer de 1024 (n) de longitud .

Por lo tanto, para que los resultados devueltos sean válidos, debe configurar al less imaginario [0] de nuevo a cero. Si necesita todos los contenedores de frecuencia 513 ((n / 2) +1), debe agregar otro valor complejo al resultado y configurarlo así …

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

En AurioTouch siempre supuse que no se molestan. Los resultados de n / 2 son obviamente más convenientes de trabajar y casi no se puede distinguir del visualizador: " Oh, mira, falta una magnitud en la frecuencia de Nyquist "

Los documentos UsingFourierTransforms explican el embalaje

NB los valores específicos 1024, 513, 512, etc. son ejemplos, no los valores reales de n, (n / 2) +1, n / 2 de AurioTouch.

Reducen todo por -128db

No del todo, el range de los valores de salida es relativo al número de muestras de input, por lo que tiene que ser normalizado. La escala es 1.0 / (2 * inNumberFrames).

Después de escalar el range es -1.0 -> +1.0 . Luego se toma la magnitud del vector complejo (se ignora la fase) y se obtiene un valor escalar para cada intervalo de frecuencia entre 0 y 1.0

Este valor se interpreta como un valor de decibelios entre -128 y 0

El material de dibujo … +80 / 64. … * 120 … … no estoy seguro. ¿Puedo estar completamente equivocado o puede ser … licencia artística?