es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué es diferente el resultado de numpy fft en comparación con matlab fft?

Estaba usando los parámetros y formulaciones debajo para generar señales.

Código en python:

import numpy as np

fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=np.arange(0,pri,dt)
i=64
fd=5/(i*pri)
xt=0.1*np.exp(2j*np.pi*f0*t)
xf=np.fft.fft(xt)

El código en matlab es muy similar al código en python:

fs=15e6
dt=1/fs
f0=1e6
pri=400e-6
t=0:dt:pri-dt
i=64
fd=5/(i*pri)
xt=0.1*exp(2j*pi*f0*t)
xf=fft(xt)

Estos códigos generarán un array de longitud 6000 para realizar la transformada de Fourier. Luego calculo el resultado en matlab usando el mismo método. El resultado es absolutamente el mismo cuando la longitud de la transformada es inferior a 6000. Pero se convierte en un poco diferente cuando la longitud de la transformada es 6000.

El resultado de xf en python es:

xf[:5] = [4.68819428e-12-2.53650626e-12j,
          6.55886345e-12+4.51937973e-13j,
          5.91758655e-12+4.48215898e-12j,
          2.07297400e-12+6.37992397e-12j,
          -1.44454940e-12+5.60550355e-12j]

El resultado de xf en matlab es:

xf(1:5) = 5.165829569664382e-12+1.503743771929872e-12j
          4.389776854811194e-12+5.127317569216533e-12j
          1.067288620484369e-12+7.191186166371298e-12j
          -3.058138112418996e-12+6.189531470616248e-12j
          -5.288313073640339e-12+2.908982377132765e-12j

Si uso una longitud de 5999 para realizar la transformada de Fourier, como en este caso en python:

xf=np.fft.fft(xt, 5999)

o en matlab:

xf=fft(xt, 5999)

El resultado es absolutamente idéntico. En python:

xf[:5] = [-0.09135455+0.04067366j,
          -0.09160153+0.04072616j,
          -0.09184974+0.04077892j,
          -0.09209917+0.04083194j,
          -0.09234986+0.04088522j]

En matlab:

xf(1:5) = -9.135455e-02+4.067366e-2j
          -9.160153e-02+4.072616e-2j
          -9.184974e-02+4.077892e-2j
          -9.209917e-02+4.083194e-2j
          -9.234986e-02+4.088522e-2j

Estaba confundido. ¿Alguien puede ilustrar este fenómeno? Gracias por su ayuda.
PD: python 3.8.5, numpy 1.19.2, matlab 2014

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La diferencia en los resultados se debe probablemente al hecho de que las configuraciones predeterminadas para el algoritmo FFT en Python y MATLAB son distintas. Específicamente, en MATLAB la longitud predeterminada de FFT es frecuentemente una potencia de 2 o 3, mientras que en Python es la menor potencia de 2 mayor o igual a la longitud de entrada.

    En este caso, la longitud de la señal de entrada (6000) no es una potencia de 2 o 3, por lo que la longitud predeterminada de FFT en MATLAB puede ser distinta de la utilizada en Python, lo que lleva a resultados ligeramente diferentes.

    Cuando la longitud de FFT se reduce a 5999, ambos Python y MATLAB usan la misma longitud de FFT, lo que explica por qué los resultados son idénticos en este caso.

    Para investigar más en profundidad y asegurar resultados consistentes, se puede establecer explícitamente una longitud de FFT común tanto en Python como en MATLAB. Por ejemplo, establecer la longitud de FFT en 6000 en ambos lenguajes debería producir resultados idénticos.

Comments are closed.