[ DFT ] [ Algoritmo DFT ] [ IDFT ] [ Algoritmo IDFT ]
..
1. La Transformada de Fourier Discreta - DFT
Referencia: McClellan 8.1 p302
La ecuación para la transformada de Fourier discreta o DFT, discreta en tiempo y discreta en frecuencia
X[k] = \sum_{n=0}^{N-1} x[n] e^{-j(2\pi/N) k n}k = 0,1, ... N-1
que toma N muestras en el dominio del tiempo y la transforma en N valores de X[k] en el dominio de la frecuencia. Los valores de X[k] son de tipo complejo, mientras que los valores de x[n] son reales la mayoría de las veces.
1.1. DFT - ejemplo para x[n] de pocas muestras
Referencia: McClellan ejemplo 8.1 p303
Para calcular la DFT de la secuencia x[n] = [1,1,0,0] se aplica la expresión para k=0,1,2,3, siendo N=4, todos los exponentes son múltiplos de π/2.
X[0] = x[0] e^{-j(2\pi/4) (0) (0)} + x[1] e^{-j(2\pi/4) (0) (1)} + x[2] e^{-j(2\pi/4) (0) (2)} + x[3] e^{-j(2\pi/4) (0) (3)} = 1 e^{-j0} + 1 e^{-j0} + 0 e^{-j0} + 0 e^{-j0} = 2 X[1] = x[0] e^{-j(2\pi/4) (1) (0)} + x[1] e^{-j(2\pi/4) (1) (1)} + x[2] e^{-j(2\pi/4) (1) (2)} + x[3] e^{-j(2\pi/4) (1) (3)} = 1 e^{-j0} + 1 e^{-j\pi/2} + 0e^{-j\pi} + 0 e^{-j(3\pi/2) } = 1-j X[2] = x[0] e^{-j(2\pi/4) (2) (0)} + x[1] e^{-j(2\pi/4) (2) (1)} + x[2] e^{-j(2\pi/4) (2) (2)} + x[3] e^{-j(2\pi/4) (2) (3)} = 1 e^{-j0} + 1 e^{-j\pi} + 0e^{-j2\pi} + 0 e^{-j(3\pi) } = 1+(-1) = 0 X[3] = x[0] e^{-j(2\pi/4) (3) (0)} + x[1] e^{-j(2\pi/4) (3) (1)} + x[2] e^{-j(2\pi/4) (3) (2)} + x[3] e^{-j(2\pi/4) (3) (3)} = 1 e^{-j0} + 1 e^{-j3\pi/2} + 0e^{-j3\pi} + 0 e^{-j(9\pi/2) } = 1+jCoeficientes resultantes en el dominio de la frecuencia:
X[k] = [2, 1-j, 0,1+j]
Se presenta el resultado en forma polar:
X[k] = [2,\sqrt{2} e^{-j\pi/4}, 0 , \sqrt{2} e^{-j\pi/4}][ DFT ] [ Algoritmo DFT ] [ IDFT ] [ Algoritmo IDFT ]
1.2 Algoritmo DFT con Python
Para el algoritmo, el bloque de ingreso de datos es el vector con las muestras numéricas:
# INGRESO
xn = [1,1,0,0]
En Python se obtiene los coeficientes de la DFT con la instrucción np.fft.fft(xn). El resultado para el ejercicio anterior se muestra como:
X[k]: [2.+0.j 1.-1.j 0.+0.j 1.+1.j] Magnitud X[k]: [2. 1.41421356 0. 1.41421356] Fase X[k]: [ 0. -0.78539816 0. 0.78539816] >>>
detalle de las instrucciones:
# ejemplo 8.1 p302 DFT de x[n] # telg1034 DSP fiec-espol edelros@espol.edu.ec import numpy as np # INGRESO xn = [1,1,0,0] # PROCEDIMIENTO X_k = np.fft.fft(xn) magnk = np.abs(X_k) fasek = np.angle(X_k) # SALIDA print('X[k]:') print(X_k) print('Magnitud X[k]:') print(magnk) print('Fase X[k]:') print(fasek)
[ DFT ] [ Algoritmo DFT ] [ IDFT ] [ Algoritmo IDFT ]
..
2. Transformada Inversa de Fourier Discreta - IDFT
La transformada inversa de Fourier discreta convierte la secuencia X[k] en el dominio de la frecuencia a x[n] en el dominio del tiempo
x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j(2\pi/N) k n}n = 0, 1, ... N-1
2.1 IDFT - Ejemplo para X[k] de pocas muestras
Referencia: McClellan ejemplo 8.2 p305
Para calcular la IDFT de la secuencia X[k] obtenida en el ejercicio anterior, se aplica la fórmula con n=0,1,2,3, siendo N=4, todos los exponentes son múltiplos de π/2.
X[k] = [2,\sqrt{2} e^{-j\pi/4}, 0 , \sqrt{2} e^{-j\pi/4}]siendo:
x[0] = \frac{1}{4} \Big( X[0] e^{j(2\pi/4) (0) (0)} + X[1] e^{j(2\pi/4) (1) (0)} + X[2] e^{j(2\pi/4) (2) (0)} + X[3] e^{j(2\pi/4) (3) (0)} \Big) = \frac{1}{4} \Big( 2 e^{j0} + \sqrt{2} e^{-j\pi/4} e^{j0} + 0 e^{j0} + \sqrt{2} e^{-j\pi/4} e^{j0} \Big) = \frac{1}{4} \Big( 2 +(1-j)+0+(1+j) \Big) = 1 x[1] = \frac{1}{4} \Big( X[0] e^{j(2\pi/4) (0) (1)} + X[1] e^{j(2\pi/4) (1) (1)} + X[2] e^{j(2\pi/4) (2) (1)} + X[3] e^{j(2\pi/4) (3) (1)} \Big) = \frac{1}{4} \Big( 2 e^{j0} + \sqrt{2} e^{-j\pi/4} e^{j\pi/2} + 0 e^{j\pi/2} + \sqrt{2} e^{-j\pi} e^{j3\pi/2} \Big) = \frac{1}{4} \Big( 2 +(1+j)+0+(1-j) \Big) = 1 x[2] = \frac{1}{4} \Big( X[0] e^{j(2\pi/4) (0) (2)} + X[1] e^{j(2\pi/4) (1) (2)} + X[2] e^{j(2\pi/4) (2) (2)} + X[3] e^{j(2\pi/4) (3) (2)} \Big) = \frac{1}{4} \Big( 2 e^{j0} + \sqrt{2} e^{-j\pi/4} e^{j\pi} + 0 e^{j2\pi} + \sqrt{2} e^{-j\pi} e^{j3\pi} \Big) = \frac{1}{4} \Big( 2 +(-1+j)+0+(-1-j) \Big) = 0 x[3] = \frac{1}{4} \Big( X[0] e^{j(2\pi/4) (0) (3)} + X[1] e^{j(2\pi/4) (1) (3)} + X[2] e^{j(2\pi/4) (2) (3)} + X[3] e^{j(2\pi/4) (3) (3)} \Big) = \frac{1}{4} \Big( 2 e^{j0} + \sqrt{2} e^{-j\pi/4} e^{j3\pi/2} + 0 e^{j3\pi} + \sqrt{2} e^{-j\pi} e^{j9\pi/2} \Big) = \frac{1}{4} \Big( 2 +(-1-j)+0+(-1+j) \Big) = 0Coeficientes resultantes en el dominio del tiempo:
x[n] = [1, 1, 0,0]
Con lo que se verifica que es la inversa del ejercicio anterior.
[ DFT ] [ Algoritmo DFT ] [ IDFT ] [ Algoritmo IDFT ]
2.2 Algoritmo IDFT con Python
Para el ejercicio, la secuencia de entrada es X[k] = [2, 1 + j, 0, 1 - j]. Usando la librería Numpy, la parte compleja de un número se expresa como 1j el vector de ingreso se expresa como:
# INGRESO
Xk = [2, 1 - 1j, 0, 1 + 1j]
el resultado del algoritmo obtenido es:
x[n]: [1. 1. 0. 0.]
Las instrucciones se desarrollan de forma semejante a las usadas para DFT. La inversa de la transformada, se obtiene con:
# ejemplo 8.2 p306 IDFT de X[k] # telg1034 DSP fiec-espol edelros@espol.edu.ec import numpy as np # INGRESO Xk = [2, 1 - 1j, 0, 1 + 1j] # PROCEDIMIENTO xn = np.fft.ifft(Xk) # simplifica xn si es solo real xn_re = np.real(xn) xn_im = np.imag(xn) if np.sum(xn_im)==0: xn= xn_re # SALIDA print('x[n]:') print(xn)
[ DFT ] [ Algoritmo DFT ] [ IDFT ] [ Algoritmo IDFT ]
