Obtener diferentes resultados de FFT en LTspice en comparación con MATLAB y Python

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')

ingrese la descripción de la imagen aquí


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')

ingrese la descripción de la imagen aquí


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:

ingrese la descripción de la imagen aquí

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?

La diferencia es sospechosamente cercana a 3dB. ¿Hay alguna suposición diferente sobre si el poder es de un solo lado o de dos lados? Siempre desconfío del escalado en cualquier FFT que hago, y ejecuto una calibración con datos sintéticos solo para verificar qué suposiciones está haciendo la FFT.
@Neil_UK Agregué un comentario a continuación que aborda este problema.
¿Qué función de ventana usó al hacer LTSpice FFT?
Función de ventana establecida en "ninguna"
Como busco dB (relación de potencia), ¿debería convertir la amplitud a rms siempre en una fórmula de 20 * log10 (amplitud)? Si acopla una onda sinusoidal de amplitud de 1 V a un osciloscopio, ¿el punto máximo de FFT del osciloscopio mostraría 1 V o Vrms = 0,7 V?

Respuestas (2)

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=15lo 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 .fourcomando). [/editar]


Aquí está mi intento usando lo anterior (paso de tiempo 25u):

fft

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).

Estos no hicieron ningún cambio en el mío. Agregué .opt plotwinsize=0, numdgt=15 y establecí "Número de puntos" en 1 en el suavizado binomial.
Si todo lo que necesita tener en cuenta es la diferencia de 3dB, entonces mi primer comentario debería funcionar: simplemente multiplique con sqrt(2). El resto son para una mejor resolución, eso es todo.
Sí, cuando hago amplitud = amplitud / sqrt (2) en MATLAB y Python, coincide con LTspice. Pero no entiendo por qué. Algo relacionado con RMS. Pero, ¿dónde está el error que no pude averiguar?
@ cm64 Bueno, ahora sabes por qué. No sé por qué Mike decidió hacerlo así, pero es así. No parece ser gran cosa. Después de todo, el .fourcomando calcula las amplitudes máximas. Imagínate...
Por favor, escríbalos en su respuesta para que pueda seleccionar. Por favor, si sabe, agregue también lo que mostraría un alcance real Vrms o Vamp. Gracias
@ cm64 Dependería del alcance, supongo. Aún así, debo agregar que no necesita dividir sqrt(2)en Matlab o Python, es en LTspice que debe multiplicar por sqrt(2).
Gracias por votar, pero si la respuesta le resultó útil, selecciónela para que otros puedan encontrarla más fácil. Aunque no es obligatorio.

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

Si lee la respuesta y los comentarios, esto se ha abordado. Por lo tanto, lo que escribió sería más apropiado como comentario que como respuesta.