algorithm - reales - todo numero real es complejo
¿Por qué FFT produce números complejos en lugar de números reales? (5)
Todas las implementaciones de FFT que hemos encontrado dan como resultado valores complejos (con partes reales e imaginarias), incluso si la entrada al algoritmo era un conjunto discreto de números reales (enteros).
¿No es posible representar el dominio de frecuencia en términos de números reales solamente?
La transformación discreta de Fourier es fundamentalmente una transformación de un vector de números complejos en el "dominio del tiempo" a un vector de números complejos en el "dominio de la frecuencia" (yo uso comillas porque si aplica los factores de escala correctos, el DFT es propio inverso). Si sus entradas son reales, entonces puede realizar dos DFT a la vez: Tome los vectores de entrada xey, y calcule F ( x + i y ). Olvidé cómo separas el DFT después, pero sospecho que es algo sobre simetría y conjugados complejos.
La clase de transformación de coseno discreto le permite representar el "dominio de frecuencia" con los reales, y es común en los algoritmos de compresión con pérdida (JPEG, MP3). Lo sorprendente (para mí) es que funciona a pesar de que parece descartar la información de fase, pero esto también parece hacerla menos útil para la mayoría de los procesos de señal (no conozco una forma fácil de hacer convolución / correlación con un DCT).
Probablemente he recibido algunos detalles incorrectos;)
La FFT es fundamentalmente un cambio de base. La base en la cual la FFT cambia su señal original es un conjunto de ondas sinusoidales. Para que esa base describa todas las entradas posibles, debe ser capaz de representar tanto la fase como la amplitud; la fase se representa utilizando números complejos.
Por ejemplo, supongamos que FFT es una señal que contiene solo una onda senoidal. Dependiendo de la fase, es posible que obtenga un resultado de FFT completamente real. Pero si cambia la fase de su entrada unos pocos grados, ¿de qué otro modo puede la salida FFT representar esa entrada?
editar: Esta es una explicación algo floja, pero solo intento motivar la intuición.
La FFT le proporciona amplitud y fase. La amplitud se codifica como la magnitud del número complejo (sqrt (x ^ 2 + y ^ 2)) mientras que la fase se codifica como el ángulo (atan2 (y, x)). Para obtener un resultado estrictamente real de la FFT, la señal entrante debe tener incluso simetría (es decir, x [n] = conj (x [Nn])).
Si lo único que te importa es la intensidad, la magnitud del número complejo es suficiente para el análisis.
Sí, es posible representar los resultados del dominio de frecuencia FFT de entradas estrictamente reales utilizando solo números reales.
Esos números complejos en el resultado de FFT son simplemente 2 números reales, los cuales son necesarios para darle las coordenadas 2D de un vector de resultados que tiene un ángulo de longitud y de dirección (o magnitud y una fase). Y cada componente de frecuencia en el resultado FFT puede tener una amplitud única y una fase única (relativa a algún punto en la apertura FFT).
Un número real solo no puede representar tanto la magnitud como la fase. Si descarta la información de fase, podría distorsionar la señal de forma masiva si intenta recrearla utilizando un iFFT (y la señal no es simétrica). Por lo tanto, un resultado FFT completo requiere 2 números reales por contenedor de FFT. Estos dos números reales se agrupan en algunas FFT en un tipo de datos complejo según la convención común, pero el resultado de FFT podría fácilmente (y algunas FFT sí) producir solo 2 vectores reales (uno para las coordenadas del coseno y otro para las coordenadas sinusoidales).
También existen rutinas FFT que producen magnitud y fase directamente, pero funcionan más lentamente que las FFT que producen un resultado vectorial complejo (o dos reales). También existen rutinas de FFT que calculan solo la magnitud y simplemente descartan la información de fase, pero generalmente no corren más rápido que permitirte hacerlo tú mismo después de una FFT más general. Tal vez guarden un codificador unas pocas líneas de código a costa de no ser invertibles. Pero muchas bibliotecas no se molestan en incluir estas formas más lentas y menos generales de FFT, y simplemente dejan que el codificador convierta o ignore lo que necesitan o no necesitan.
Además, muchos consideran que las matemáticas involucradas son mucho más elegantes usando aritmética compleja.
(Agregado :) Y, como otra opción más, puede considerar los dos componentes de cada contenedor de resultados de FFT, en lugar de componentes reales e imaginarios, como componentes pares e impares, ambos reales.
Si su coeficiente de FFT para una frecuencia dada f
es x + iy
, puede ver x
como el coeficiente de un coseno en esa frecuencia, mientras que y
es el coeficiente del seno. Si agrega estas dos ondas para una frecuencia particular, obtendrá una onda desplazada en esa frecuencia; la magnitud de esta onda es sqrt(x*x + y*y)
, igual a la magnitud del coeficiente complejo.
La Transformada Coseno Discreta (DCT) es un pariente de la transformada de Fourier que produce todos los coeficientes reales. Un DCT bidimensional es utilizado por muchos algoritmos de compresión de imagen / video.