¿Qué es la basura al final de mi FFT en LTSPICE?

8

¿Por qué las FFT tienen basura en el extremo de alta frecuencia? Supongamos que voy a simular este circuito en LTSPICE:

simular este circuito : esquema creado usando CircuitLab

Donde los parámetros de seno y simulación de LTSPICE son:

SINE(0 1 1K 0 0 0 1000)
.tran 1 startup

Luego le pido a LTSPICE que me dé un FFT sin ventana y 1,000,000 de puntos:

¿Para qué es toda la basura al final? Yo esperaría solo un pico a 1KHz, no uno adicional a 3KHz, etc. ¿Esto le sucede a todos los FFT? ¿Qué controla los picos que obtienes después de tu fundamental?

    
pregunta watkipet

3 respuestas

4

La respuesta de @ D.Brown ya es muy buena, así que solo añadiré algunas cosas menores. El algoritmo de LTspice es personalizado y acepta un número de puntos de no poder de dos. Esto no significa que la resolución no sea importante. Aún así, 1kHz a lo largo de 1 s significa un número entero de períodos, por lo que no hay necesidad de ventanas o suavizado binomial para reducir el ruido (configuración en la ventana FFT). Sin embargo, lo que mencionó @mkeith, es que, de forma predeterminada, LTspice utiliza una compresión de forma de onda (300 puntos por pantalla, IIRC), lo que significa que cualquier otro punto se reduce y la resolución de la forma de onda sufre. La solución para esto es un paso de tiempo más estricto, o .option plotwinsize=0 , el último que elimina la compresión de la forma de onda. Esto es lo que sucede cuando se agrega esta opción, pero no se impone un paso de tiempo:

Estoesprobablementeloqueves,másomenos,asíque,¿cuáleslaopción?EstássimulandounaformadeondakHzde1kHzduranteunperíododetiempode1s.Elcircuito,sisepuedellamarasí,esunafuenteycargasimple,ylafuenteesunafuentearmónica,unatareamiserableparaelsolucionadordematrices,porloqueLTespecia,comotodoslosmotoresSPICE,sisientequeladerivadaessuave,doblarásupasodetiempoparanoralentizarlasimulación,yseguiráduplicándolahastaquellegueaalgúnlímiteinterno,momentoenelquevolarásobrelasimulación.Elresultadoesunaformadeondagruesa,quenisiquieraplotwinsizepuedemejorardemasiado.

Laotracura,elpasodeltiempoimpuesto,ahorasenecesitaparamejorarlaresolución.Aquíestáelresultadoconunpasodetiempode1\$\mu\$s:

Esmejor,peroestárealizandounaFFTde1millóndepuntos,loquerequiere,talveznosorprendentemente,1millóndepuntosdetiempo,porloqueelpasodetiempomáximodebeestablecerseen1\$\mu\$s.Además,laopciónnumdgtseestableceenunvalor>7que,segúnellibro,permiteunadobleprecisión:

Todavía hay un piso de ruido ligeramente inestable, pero el nivel ahora es inferior a -250dB. Esto está cerca de la precisión de la máquina. Hacer el paso de tiempo 1/1048576 (2 ^ -20) no mejora los resultados (puede comprobarlo usted mismo).

Al final, depende de la cantidad de ruido que esté dispuesto a aceptar. El comentario de @Tony Stewart es de una sensibilidad práctica, por debajo de 100 ~ 120dB significa menos de 1 ~ 10 \ $ \ mu \ $ V a 1V, lo cual es un gran logro.

    
respondido por el a concerned citizen
14

Esta respuesta tiene varias partes. Baso esta respuesta en las características del algoritmo FFT. No estoy familiarizado con la implementación específica de LTSpice, pero el comportamiento que informa es exactamente lo que esperaría.

Las implementaciones FFT más comunes operan con una potencia entera de 2 puntos de datos. Entonces, la mayoría de las implementaciones pondrían sus puntos de datos 1,000,000 a 1,048,576 puntos de datos, y realizarían la FFT en eso. Tenga en cuenta que esta longitud no es un número entero de ondas sinusoidales.

Hay métodos alternativos de transformación de Fourier que descomponen los datos de manera diferente. Estos usualmente se conocen con el nombre de métodos de Transformación Discreta de Fourier (DFT), y son más lentos y mucho más complejos de implementar. Casi nunca los he encontrado en aplicaciones prácticas. La FFT es una implementación específica de DFT que requiere que la cantidad de puntos de datos sea una potencia entera de 2 (o, a veces, una potencia entera de 4).

Entonces, asumo que LTSpice está rellenando sus datos a 1,048,576 puntos de datos, los 48,576 valores de datos agregados al final contienen una constante.

Ahora puede ver el problema: su búfer de 1,048,576 muestras tiene 1,000 ondas sinusoidales, cada una de 1,000 muestras, seguidas de 48,576 valores constantes. Esto no puede ser representado por una suma de ondas sinusoidales de frecuencia 1kHz. En cambio, los resultados de FFT muestran los valores adicionales de alta frecuencia necesarios para reconstruir su señal.

Para determinar si este es el problema, cree un búfer de 1,048,576 muestras que contengan una onda sinusoidal con un período de 1,024 muestras. Las altas frecuencias deben reducirse considerablemente en magnitud.

Ahora, en cuanto al efecto de aplicar una ventana:

El algoritmo FFT 'envuelve' conceptualmente los datos, por lo que el último punto de los datos de entrada es seguido por el primer punto de los datos de entrada. Es decir, la FFT se calcula como si los datos fueran infinitos, repetidos circularmente, como un vector con la secuencia: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...

Este ajuste puede dar como resultado una transición escalonada entre el último punto en el búfer de datos y el primer punto. Esta transición de paso genera resultados de FFT con grandes contribuciones (no esenciales) de altas frecuencias. El propósito de una ventana es eliminar este problema. La función de la ventana va a cero en ambos extremos, por lo que en su caso, w [0] yw [999999] serían ambos cero. Cuando los datos se multiplican por la ventana, los valores se vuelven cero al principio y al final, por lo que no hay transición de pasos en el ajuste.

La función de ventana que aplica modifica el contenido de frecuencia del búfer, usted elige una función que presenta una compensación aceptable. Un gaussiano es un buen punto de partida. Para cualquier aplicación práctica en la que no pueda controlar con precisión el contenido de frecuencia de los datos, deberá aplicar una función de ventana para eliminar la transición de pasos implícita debido a la longitud de los datos.

Problemas residuales:

Hay otra fuente potencial de ruido espectral de alta frecuencia en la FFT. El efecto aumenta con la longitud de FFT, y puede ser algo que se puede ver en algunos casos en 1,000,000 puntos de datos.

El bucle interno del algoritmo FFT usa los puntos alrededor de un círculo en el plano complejo: e ^ (i * theta), donde el algoritmo itera 'theta' de 0 a 2 * pi en pasos sucesivamente más finos, hasta el número de puntos en la FFT. Es decir, si calcula una FFT en 1,048,576 muestras, en una de las iteraciones del bucle externo, el bucle interno computará e ^ (i * theta), donde theta = 2 * pi * n / N, donde N es 1,048,576 , iterando n desde 0 hasta 1,048,575. Esto se hace mediante el método obvio de multiplicar sucesivamente por e ^ (i * 2 * pi / N).

Puede ver el problema: a medida que N crece, e ^ (i * 2 * pi / N) se acerca mucho a 1, y se multiplica N veces. Con el punto flotante de doble precisión, los errores son pequeños, pero creo que se puede ver el piso de ruido resultante si se observa con cuidado. Con un punto flotante de precisión simple, con 1,000,000 puntos de datos, el cálculo de FFT produce un piso de ruido significativo.

Existen técnicas alternativas para calcular e ^ (i * theta) que eliminan este problema, pero la implementación es más compleja. Solo he tenido que crear tal implementación una vez.

    
respondido por el D. Brown
0

Posible razón: -

Al dibujar una onda transitoria en un simulador, se interpola entre los cálculos reales para minimizar el trabajo duro que se está realizando y permitir que se muestre un resultado más rápido en la pantalla.

La configuración predeterminada para el paso de tiempo máximo en LTSpice podría ser 100 y, por lo tanto, entre estos puntos se han interpolado los resultados, es decir, no son perfectos y contribuyen a la distorsión que se ve como armónicos en la FFT.

Intente configurar su tiempo máximo para que sea mucho más pequeño de lo que es actualmente y vea qué sucede.

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas