Tengo 10 segundos de datos muestreados. La frecuencia de muestreo es de 1 kHz. Cargué el archivo de texto que es un tiempo de dos columnas frente a datos de voltaje; se puede descargar aquí .
Realicé FFT en MATLAB, Python y LTspice. MATLAB y Python están de acuerdo cuando trazo pero obtengo un resultado diferente en LTspice.
Aquí debajo está el código que uso y la trama con MATLAB:
ts = 0.001; %sampling interval (sec)
Fs = 1./ts; %sampling frequency (Hz)
L = length(y); %number of samples
complex = fft(y)/L; % complex signals
f = 0 : Fs/L : Fs/2; % frequency bins
amplitude = 2*abs(complex(1:L/2+1)); % amplitudes
pow = (amplitude).^2/2*(L/Fs); % power
semilogx(f,20*log10(amplitude),'-b');
grid on;
xlabel('Frequency [Hz]')
ylabel('dB')
A continuación se muestra el código que uso y la trama con Python:
plt.figure()
y = v_in
T = 1/sampling_rate
N = len(y)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
amplitude = 2.0/N * np.abs(yf[:N//2])
pow = (N/sampling_rate)*amplitude*amplitude/2
plt.semilogx(xf, 20*np.log10(amplitude),'b')
plt.grid()
plt.xlabel('Frequency [Hz]')
plt.ylabel('dB')
Y finalmente alimenté la señal del archivo de texto al generador de señal en LTspice (usando la opción de archivo PWL) y realicé FFT y obtuve el siguiente gráfico:
MATLAB y Python muestran el punto máximo de db como -46.2dB pero Ltspice muestra este punto como -49.3dB. Esta no es una diferencia muy pequeña.
¿A qué puede deberse esta diferencia? ¿Estoy haciendo algo mal en MATLAB y Python al evaluar FFT o LTspice está mal?
A pesar de los tiempos fijos proporcionados por el archivo PWL, LTspice es un motor SPICE, un simulador analógico, lo que significa que la simulación no tendrá pasos uniformes. En Matlab y Python, puede dar cuenta correctamente de las muestras exactas que se describen en la definición. LTspice necesita simularlo, por lo que, como todos los motores SPICE analógicos, tiene un tiempo desigual.
Puede aumentar el intervalo de tiempo y/o agregar .opt plotwinsize=0
, numdgt=15
lo que mejorará el resultado. A ver si eso ayuda.
[editar] Sin embargo, no importa lo que haga, LTspice mostrará valores RMS en la ventana FFT (a diferencia del .four
comando). [/editar]
Aquí está mi intento usando lo anterior (paso de tiempo 25u):
Parece bastante cerca de la versión de Python. En LTspice FFT utilicé 24000 puntos y establecí "Número de puntos" en 1 (suavizado polinomial).
sqrt(2)
. El resto son para una mejor resolución, eso es todo..four
comando calcula las amplitudes máximas. Imagínate...sqrt(2)
en Matlab o Python, es en LTspice que debe multiplicar por sqrt(2)
.En mi opinión, la FFT de LTSpice toma el valor RMS para calcular el espectro de una señal. Esta es la razón por la que tiene una discrepancia de 3dB
Neil_ES
un ciudadano preocupado
el fotón
cm64
cm64