3.1 DFT/IDFT - Transformada de Fourier Discreta con Python

[ 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+j

Coeficientes 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) = 0

Coeficientes 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 ]