Ir al contenido principal

Entendiendo: La transformada de Fourier discreta TFD

A la transformada discreta de Fourier se le proporcionan datos y devuelve las funciones sinusoidales que contienen esos datos. 

Esto es útil si desea analizar datos, pero también puede ser útil si desea modificar las frecuencias y luego utilizar la transformada discreta inversa de Fourier para obtener los datos modificados en frecuencia.

Exploremos multiplicando por sinusoides (seno/coseno)

Si tuviera un flujo de datos que tuviera una sola frecuencia con una amplitud constante y quisiera saber la amplitud de esa frecuencia, ¿cómo podría averiguarlo? Una forma sería hacer una onda cosenoidal de esa frecuencia y multiplicar cada muestra de su onda por las muestras correspondientes.

Por ejemplo, digamos que tenemos un flujo de datos de cuatro valores que representan una onda coseno de 1 Hertzio:
$$1, 0, -1, 0$$

Luego podríamos multiplicar cada punto por un punto correspondiente en una onda cosenoidal, sumarlos juntos:

Obtenemos ...
$$1 * 1 + 0 * 0 + (-1) * (-1) + 0 * 0 = 2$$

El resultado que obtenemos es 2, que es el doble de la amplitud de los puntos de datos que teníamos. Podemos dividir por dos para obtener la amplitud real.

Para mostrar que esto funciona para cualquier amplitud, aquí están los mismos datos de onda cosenoidal de 1 Hertzio con una amplitud de cinco:
$$5, 0, -5, 0$$

Multiplicando por la onda coseno de 1 hz, obtenemos…
$$5 * 1 + 0 * 0 + -5 * -1 + 0 * 0 = 10$$

La amplitud real es 5, por lo que podemos ver que nuestro resultado fue el doble de amplitud.
En general, necesitará dividir por N/2 donde N es el número de muestras que tiene la señal. 

En éste caso:
$$\frac{4 muestras} {2} = 2$$

Sin embargo, ¿qué sucede si nuestro flujo de datos tiene algo más que una onda coseno?

Probemos una onda sinusoidal:
$$0, 1, 0, -1$$

Cuando multiplicamos esos valores por nuestros valores de onda coseno,
obtenemos: 

$$0 * 1 + 1 * 0 + 0 * -1 + -1 * 0 = 0$$

Tenemos cero. ¡Nuestro método se rompió!

En este caso, si en lugar de multiplicar por coseno, multiplicamos por seno, obtenemos lo que esperamos: 

$$0 * 0 + 1 * 1 + 0 * 0 + -1 * -1 = 2$$

Obtenemos resultados consistentes con antes, donde nuestra respuesta es la amplitud multiplicada por dos.

Todo ésto no es muy útil si tenemos que saber si estamos buscando una onda seno o coseno. ¡Incluso podríamos tener otro tipo de onda que no sea ninguna de estas dos!

La solución a este problema es multiplicar los puntos de datos por ondas coseno y sinusoidal, y mantener ambos resultados.

Para este ejemplo, tomaremos una onda de coseno y la desplazaremos 0.25 radianes (a la izquierda) para darnos muestras: 0.97, -0.25, -0.97, 0.25.
La fórmula es:
$$ cos (\frac{x*2\pi}{4} + 0.25), x\in [0,3]$$

Cuando multiplicamos eso por una onda de coseno obtenemos:
$$ 0,97 * 1 + -0,25 * 0 + -0,97 * -1 + 0,25 * 0 = 1,94 $$

Cuando lo multiplicamos por una onda sinusoidal obtenemos:
$$ 0,97 * 0 + -0,25 * 1 + -0,97 * 0 + 0,25 * -1 = -0,5 $$

Como sabemos que ambos números son el doble de la amplitud real, podemos dividirlos entre dos para obtener: coseno: 0,97, seno: -0,25

Esos números tienen sentido si lo piensas.
Tomamos una onda de coseno y la cambiamos un poco para que nuestra respuesta combinada que es principalmente una onda de coseno, pero se dirige hacia una onda sinusoidal (técnicamente una onda sinusoidal que tiene una amplitud de -1, por lo que es una onda sinusoidal negativa, pero sigue siendo una onda sinusoidal).
Para obtener la amplitud de nuestra onda de fase desplazada, tratamos esos valores como un vector y obtenemos la magnitud.
$$\sqrt{(0,97)^{2} + (- 0,25)^{2}}= 1,00 $$

¡Eso es correcto! La amplitud de nuestra onda es 1.0.

Para obtener el ángulo (fase) inicial de la onda, usamos la tangente inversa del seno sobre el coseno. 
$$\arctan ({\frac{-0,25}{0,97}})= -0.25 rad$$

Esa es la cantidad en la que cambiamos nuestra onda, ¡así que también es correcto!

Con todo esto, podemos desarrollar ya el siguiente formulario...

Formulas

Echemos un vistazo a dónde estamos matemáticamente. Para N muestras de datos, multiplicamos cada muestra de datos por una muestra de una onda con la frecuencia que estamos buscando y sumamos los resultados (¡Tenga en cuenta que esto es realmente un producto escalar entre N vectores dimensionales!).
Tenemos que hacer esto tanto con una onda coseno como con una onda sinusoidal, y mantener los dos valores resultantes para poder obtener nuestra verdadera información de amplitud y fase.

Por ahora, dejemos la parte de “dividir por dos” y veamos las ecuaciones que tenemos.

$$Valor_{coseno}= \sum_{n = 0}^{N-1} Muestra_n * cos (\frac{2\pi * Frecuencia * n}{N}) $$

$$Valor_{seno}= \sum_{n = 0}^{N-1} Muestra_n * sen (\frac{2\pi * Frecuencia * n}{N}) $$

Esas ecuaciones anteriores hacen exactamente lo que trabajamos en las muestras.

La parte que puede ser confusa es la parte dentro de cos () y sen ().

Mirando el gráfico cos (x) y sen (x) verás que ambos hacen un ciclo completo entre los valores de x de 0 y 2 * pi (aproximadamente. 6.28):


Si, en cambio, lo cambiamos a una gráfica de:

$$cos (2\pi * x)$$
$$sen (2\pi * x)$$

al escalarla, ahora ambos hacen un ciclo completo entre los valores de x de 0 y 1:

Esto significa que podemos pensar en las formas de onda en términos de porcentaje (0 a 1) en lugar de radianes (0 a 2*Pi).

A continuación, multiplicamos por la frecuencia que buscamos. Hacemos esto porque esa multiplicación hace que la forma de onda se repita tantas veces entre 0 y 1.
Nos convierte en una onda de la frecuencia deseada, que aún permanece en el "espacio porcentual" donde podemos ir de 0 a 1 para obtener muestras en nuestro coseno. y ondas sinusoidales.

Aquí hay una gráfica de:
$$cos (2\pi*  x * 2)$$
$$sin (2\pi * x * 2)$$
Con ésto podemos mostrar algunas ondas de frecuencia de 2 Hertzios:

Por último, multiplicamos por n / N.
En nuestra suma, n es nuestra variable índice y va de 0 a N-1. Esto es muy parecido a un bucle for.
n / N es nuestro porcentaje actual hecho, estamos en el ciclo for, por lo que cuando multiplicamos por n / N, solo estamos muestreando en una ubicación diferente (por porcentaje realizado) en nuestras ondas coseno y sinusoidal que están en las frecuencias especificadas.


Números imaginarios

¿No sería genial si en lugar de tener que hacer dos cálculos separados para nuestros valores de coseno y seno, pudiéramos hacer un solo cálculo que nos diera ambos valores?
Bueno, curiosamente, ¡podemos! Aquí es donde entran los números imaginarios. No te asustes, están aquí para hacer las cosas más simples y convenientes, no para hacer las cosas más complicadas o más difíciles de entender (:

Hay algo llamado Identidad de Euler que establece lo siguiente:

$$e ^ {ix} = cos (x) + i * sen (x)$$ 

Eso parece bastante útil para nuestro caso de uso, ¿no? Si nota que nuestras ecuaciones tenían los mismos parámetros para cos y sin, eso significa que podemos usar esta identidad en su lugar.

Ahora podemos tomar nuestras dos ecuaciones y combinarlas en una sola ecuación:

$$Valor = \sum_{n = 0} ^{N-1} Muestra_n * e ^ {\frac{i * 2\pi * Frecuencia * n}{N}} $$

Cuando hagamos el cálculo anterior, obtendremos un número complejo con una parte real e imaginaria. La parte real del número complejo es solo el valor del coseno, mientras que la parte imaginaria del número complejo es el valor del seno. No ha sucedido nada aterrador, solo hemos usado / abusado un poco de números complejos para darnos lo que queremos en una forma más compacta.


Con varias frecuencias

Ahora sabemos cómo buscar una sola frecuencia específica.

Sin embargo, ¿qué pasa si quieres buscar múltiples frecuencias? Además, ¿qué pasa si ni siquiera sabe qué frecuencias buscar?

Al realizar la transformada discreta de Fourier en una secuencia de muestras, hay un conjunto específico de frecuencias que verifica. Si tiene N muestras, solo verifica N frecuencias diferentes. Puede preguntar por otras frecuencias, pero estas frecuencias son suficientes para reconstruir la señal original a partir de solo los datos de frecuencia.

Las primeras frecuencias N/2 serán las frecuencias 0 (DC) a N/2. N/2 es la frecuencia de Nyquist y es la frecuencia más alta que su señal puede mantener.

Después de N/2 vienen las frecuencias negativas, contando desde una gran frecuencia negativa (N/2-1) hasta la última frecuencia que es -1.

Como ejemplo, si tuviera 8 muestras y ejecutara la DFT, obtendría 8 números complejos como salidas, que representan estas frecuencias:

[0 Hz, 1 Hz, 2 Hz, 3 Hz, 4 Hz, -3 Hz, -2 Hz, -1 Hz]

La conclusión importante de esta sección es que si tiene N muestras, la DFT solo pregunta acerca de N frecuencias muy específicas, lo que proporcionará suficiente información para ir del dominio de la frecuencia al dominio del tiempo y recuperar los datos de la señal.

Eso nos lleva a la siguiente ecuación, en la que simplemente ponemos un subíndice en Valor, para indicar qué frecuencia estamos probando.

$$Valor_{Frecuencia} = \sum_{n = 0}^{N-1} Muestra_n * e ^ {\frac{i * 2\pi * Frecuencia * n}{N}} $$ 

La frecuencia es un número entero y está entre 0 y N-1. Podemos decir eso matemáticamente al enumerar esta información junto con la ecuación:

$$Frecuencia \in [0, N), Frecuencia \in \mathbb Z$$


Forma definitiva

La gente de las matemáticas usa letras y símbolos en lugar de palabras en sus ecuaciones. La letra k se usa en lugar de la frecuencia. Tenemos entonces que en lugar de 

$$Valor_{Frecuencia} \rightarrow{X_{k}}$$
$$Muestra_n  \\rightarrow {x_n}$$

Esto nos da una versión más formal de la ecuación:

$$X_k= \sum_{n=0}^{N-1} x_n * e ^ {\frac{i*2\pi*k*n}{N}} k \in [0, N), k \in \mathbb Z$$

Estamos cerca de la forma final, ¡pero aún no hemos terminado!

¿Recuerdas la división por dos? Hice que elimináramos la división por dos para poder reintroducirlo ahora en su forma correcta. Básicamente, dado que estamos buscando N frecuencias, necesitamos dividir el resultado de cada frecuencia por N. Mencioné que teníamos que dividir por N / 2 para que la información de amplitud sea correcta, pero como estamos verificando tanto las frecuencias positivas como las negativas, tenemos que dividir por 2*(N/2), o simplemente N. Eso hace que nuestra ecuación se convierta en esto:

$$X_k = \frac{1}{ N} \sum_{n=0}^{N-1}x_n * e ^ {\frac{i*2\pi*k*n}{N}}, k \in [0, N), k \in \mathbb Z $$

Por último, en realidad queremos hacer que las ondas vayan hacia atrás, por lo que hacemos que el exponente sea negativo. La razón de esto es un tema más profundo del que quiero abordar en este momento, pero puede leer más sobre por qué aquí si tiene curiosidad: DFT: ¿Por qué las definiciones de inverso y avance comúnmente se cambian?

Eso nos lleva a nuestra forma final de la fórmula para la transformada discreta de Fourier:

$$X_k = \frac{1}{N} \sum_ {n = 0} ^ {N-1} x_n * e ^ {\frac{- i*2\pi*k*n}{N}}, k \in [0, N), k \in \mathbb Z $$


Vamos a probar todo esto..

Si usamos esa fórmula para calcular la DFT de una onda coseno simple de 4 muestras, 1 hz (1, 0, -1, 0), obtenemos como salida [0, 0.5, 0, -0.5].

Eso significa lo siguiente:

0hz: 0 amplitud
1hz: 0.5 amplitud
2hz: 0 amplitud
-1hz: -0.5 amplitud

Es un poco extraño que la simple onda coseno de 1 hz, 1.0 amplitud se dividiera por la mitad y se convirtiera en una onda coseno 1 hz y una onda coseno -1 hz, cada una contribuyendo con la mitad de la amplitud al resultado, pero así es como funciona. 


Realización de la transformada de Fourier discreta inversa

Hacer la fórmula para la DFT inversa es realmente simple.
Comenzamos con nuestra fórmula DFT, eliminamos el 1/N desde el frente y también hacemos que el exponente sea positivo en lugar de negativo. ¡Eso es todo! 

$$x_k = \sum_ {n = 0} ^ {N-1} X_n * e ^ {\frac{i*2\pi*k*n}{N}}, k \in [0, N), k \in \mathbb Z$$

Mientras que la DFT toma señales de valor real y emite datos de frecuencia con valores complejos, la IDFT toma datos de frecuencia con valores complejos y emite señales con valor real.

Una cosa divertida de intentar es tomar algunos datos, DFT, modificar los datos de frecuencia, luego IDFT para ver qué sale del otro lado.


Otras apreciaciones

Aquí hay algunas otras cosas importantes sobre la transformada discreta de Fourier y su inversa.

Datos que se repiten para siempre

Cuando ejecuta la DFT en un flujo de datos, las matemáticas son tales que asumen que el flujo de datos que le proporcionó se repite para siempre tanto hacia adelante como hacia atrás en el tiempo. Esto es importante porque si no tiene cuidado, puede agregar contenido de frecuencia a sus datos que no tenía la intención de estar allí.

Por ejemplo, si coloca una onda sinusoidal de 1 hz, es continua y solo está presente la frecuencia de 1 hz:


Sin embargo, si coloca una onda sinusoidal de 0,9 Hz, hay una discontinuidad, lo que significa que habrá otras frecuencias no deseadas presentes cuando haga una DFT de los datos, para poder recrear la discontinuidad:


Transformada rápida de Fourier

Hay un grupo de algoritmos llamados "Transformadas rápidas de Fourier". Puede notar que si tenemos N muestras, tomar la DFT es una operación O (N ^ 2). Las transformadas rápidas de Fourier pueden reducirlo a O (N log N).

Variaciones de fórmulas DFT / IDFT

La fórmula que se nos ocurrió es una posible fórmula DFT, pero hay un puñado de variaciones que son aceptables, ¡a pesar de que diferentes variaciones tienen diferentes valores!

La primera opción es si hacer que el exponente e sea negativo o no. Mira estas dos fórmulas para ver a qué me refiero.

$$X_k = \sum_{n = 0} ^ {N-1} x_n * e ^ {\frac{i*2\ pi*k*n}{N}}$$

$$X_k = \sum_ {n = 0}^{N-1} x_n * e ^ {\frac{-i*2\ pi*k*n}{N}} $$

Cualquiera de los dos es aceptable, pero al proporcionar datos DFT, debe mencionar cuál hizo y asegurarse de usar el opuesto en su fórmula DFT inversa.

Las siguientes opciones son si dividir por N o no, como se muestra a continuación:

$$X_k = \sum_{n = 0} ^ {N-1} x_n * e ^ {\frac{i*2\pi*k*n}{N}}$$

$$X_k = \frac{1}{N} \sum_ {n = 0} ^ {N-1} x_n * e ^ {\frac{i*2\pi*k*n}{N}}$$

Una vez más, cualquiera de los dos es aceptable, pero debe asegurarse y dejar que la gente sepa cuál hizo, y también asegurarse de usar el opuesto en su fórmula DFT inversa.

Por qué calcular frecuencias negativas

Las frecuencias negativas se pueden calcular a pedido a partir de la información de frecuencia positiva (por ejemplo, conjugación compleja), así que ¿por qué deberíamos molestarnos en calcularlas? Seguro que sería más eficiente computacionalmente no calcularlos, especialmente cuando solo se hace análisis de frecuencia, ¿verdad?

Comentarios

Entradas populares de este blog

Probablemente no deberías usar cualquier cable para cargar tu iPhone

A menos que quieras que un hacker pueda secuestrar su portátil..... Si parece un cable de carga, se ve q es un cable de carga y carga su teléfono, debe ser un cable de carga, ¿verdad? Bueno, un poco si. Pero eso no significa que eso únicamente sea eso. Mike Grover, un investigador de seguridad con sede en San Francisco, ha hecho un cable de carga para iPhone, que, cuando está conectado al teléfono en un extremo y su portátil en el otro, puede piratear el portátil. ¿Suena siniestro? Solo porque hay mucho en juego. El autor intelectual detrás del hack puede enviar correos electrónicos de phishing, etc... Grover comenzó a experimentar con cables maliciosos en 2017 como parte de un intento de aprender cómo diseñar, fabricar y ensamblar placas de circuito impreso, lo que hace a mano con herramientas de consumo de su cocina. Entonces comenzó a suceder algo gracioso: la gente se enteró de los cables de Grover, por lo que decidió comenzar a venderlos. En este momento, los cables O

Preguntas y respuestas sobre Raspberry Pi

¿Le resulta difícil buscar respuestas a sus preguntas sobre Raspberry Pi? ¿Busca ayuda para comenzar un proyecto? ¿Tiene alguna pregunta que necesita respuesta? ¿Una pregunta para la que solo has hecho investigación básica? ¿Tal vez algo que piensas que todos menos tú sabes? P: ¿Alguien tiene alguna idea de lo que puedo hacer con mi Pi? A: Prácticamente cualquier cosa, puedes ver infinidad de proyectos en internet . P: Mi Pi se comporta de manera extraña, ¿qué hago? R: La tarjeta SD es mala o problemas de energía. El 99.999% de las veces es una de estas dos cosas. P: ¿Qué modelo de Raspberry Pi debería obtener? R: Obtenga la Raspberry Pi 4B con 4GB de RAM P: ¿Puedo usar la tarjeta SD de otra Pi en mi Pi 4? R: Solo si la tarjeta SD ya tiene Raspbian Buster P: Encontré una guía antigua que me dice exactamente cómo hacer algo, ¿debería seguirla? A: Sí, síguelo. Si te quedas atascado, regresa y describe en google el paso exacto en el que estás atascado. P: ¿Cuándo se l