Quel est le problème à la fin de ma FFT dans LTSPICE?


8

Pourquoi les FFT ont-elles du courrier indésirable à l'extrémité haute fréquence? Supposons que je vais simuler ce circuit dans LTSPICE:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Où les paramètres sinus et simulation LTSPICE sont:

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

Ensuite, je demande à LTSPICE de me donner une FFT sans fenêtre et 1 000 000 de points: FFT

À quoi servent tous ces déchets à la fin? Je m'attendrais à un seul pic à 1 KHz, pas à un autre à 3 KHz, etc. Cela se produit-il pour toutes les FFT? Qu'est-ce qui contrôle les pointes que vous obtenez après votre fondamental?


Pouvez-vous vraiment localiser les autres fréquences? Se trouvent-ils tous des multiples impairs de 1 kHz? Dans ce cas, quelque chose déforme votre sinus "parfait" pour avoir l'air plus "rectangulaire", et cela pourrait être juste la précision numérique que ltspice utilise en interne.
Marcus Müller

1
Je ne regarderais pas en dessous de -100 dB mais commencer avec la 3ème harmonique, aucune fenêtre ne semble être un problème
Tony Stewart Sunnyskyguy EE75

1
Pourrait avoir quelque chose à voir avec la compression de forme d'onde. Voir cette autre question pour plus de détails et comment vérifier si c'est le cas. electronics.stackexchange.com/questions/338292/…
mkeith

Je ne peux pas reproduire ces données, ma version de LTspice veut plus de 1e6 points simulés pour obtenir une FFT de 1e6 points, soit un pas de temps maximum de 1e-6.
loudnoises

Avez-vous besoin de Quasi Peak pour correspondre au spectre audio pour la modulation BW ??
Tony Stewart Sunnyskyguy EE75

Réponses:


4

@ La réponse de D.Brown est déjà très bonne, donc je n'ajouterai que quelques petites choses. L'algorithme de LTspice est personnalisé et accepte un nombre de points sans puissance de deux. Cela ne signifie pas que la résolution n'est pas importante. Pourtant, 1 kHz sur 1 s signifie un nombre entier de périodes, il n'y a donc pas besoin de fenêtrage ou de lissage binomial pour réduire le bruit (paramètres dans la fenêtre FFT). Cependant, c'est ce que @mkeith a mentionné, et c'est-à-dire que par défaut, LTspice utilise une compression de forme d'onde (300 points par écran, IIRC), ce qui signifie que tous les autres points sont réduits et que la résolution de la forme d'onde en souffre. La solution à cela est soit un pas de temps plus serré, soit .option plotwinsize=0le dernier qui élimine la compression de la forme d'onde. Voici ce qui se passe lorsque cette option est ajoutée, mais aucun pas de temps n'est imposé:

défaut

C'est probablement ce que vous voyez, plus ou moins, alors quelle est l'option pour? Vous simulez une forme d'onde de 1 kHz sur une période de 1 s . Le circuit, si on peut l'appeler ainsi, est une source et une charge simples, et la source est une harmonique, une tâche minable pour le solveur de matrice, donc LTspice, comme tous les moteurs SPICE, s'il sent que le dérivé est lisse, il doublera son pas de temps pour ne pas ralentir la simulation, et il continuera de le doubler jusqu'à ce qu'il atteigne une limite interne, auquel cas il survolera la simulation. Le résultat est une forme d'onde grossière, qui ne plotwinsizepeut même pas trop s'améliorer.

L'autre remède, le pas de temps imposé, est désormais nécessaire pour améliorer la résolution. Voici le résultat avec un 1μs timestep:

10u

C'est mieux, mais vous effectuez une FFT de 1 million de points, ce qui nécessite, peut-être sans surprise, 1 million de points de temps, donc le pas de temps maximum doit être défini sur 1μs. De plus, l'option numdgtest définie sur une valeur> 7 qui, selon le livre, permet une double précision:

ultra

Il y a toujours un plancher de bruit légèrement bancal, mais le niveau est maintenant inférieur à -250 dB. C'est proche de la précision de la machine. Faire le pas de temps 1/1048576 (2 ^ -20) n'améliore pas les résultats (vous pouvez vérifier par vous-même).

En fin de compte, cela dépend du niveau de bruit que vous êtes prêt à accepter. Le commentaire de @Tony Stewart est d'une sensibilité pratique, en dessous de 100 ~ 120dB signifie moins de 1 ~ 10μV à 1V, ce qui est tout un exploit.


Merci d'avoir mis le travail pour cette réponse. En passant, il m'a souligné que LTspice fonctionne de manière radicalement différente sur macOS par rapport à Windows. (Je suppose que c'est la version Windows)
loudnoises

@loudnoises Oui, bien que sous Wine, ce n'est pas important. J'ai vu quelques points, ici et là, dans le groupe Yahoo LTspice, mais comme je ne suis pas un utilisateur Mac, je n'y ai pas insisté. Il se pourrait que ce soit aussi une question de réglages, cachée sous les différents capots, mais vraiment, je ne suis pas sûr.
un citoyen concerné

Excellent! Maintenant, en regardant le fichier d'aide LTSPICE, j'aurais dû remarquer ceci: "LTspice utilise un algorithme FFT propriétaire qui autorise un nombre arbitraire de points de données, c'est-à-dire, sans se limiter à une puissance de 2. Lorsque vous prévoyez de faire des FFT de votre simulation données, vous souhaiterez probablement désactiver la compression de forme d'onde, stipuler un pas de temps maximum et peut-être même utiliser un format de fichier de forme d'onde double précision pour réduire le bruit de fond numérique. "
watkipet

@un citoyen inquiet: Lorsque vous avez déclaré: "Voici le résultat avec un pas de temps de 1 μs", vouliez-vous dire, "Voici le résultat avec un pas de temps de 10 μs"?
watkipet

@loudnoises J'utilise la version native de macOS. Mais je vois les mêmes résultats que @un citoyen concerné.
watkipet

15

Cette réponse comporte plusieurs parties. Je base cette réponse sur les caractéristiques de l'algorithme FFT. Je ne connais pas l'implémentation spécifique de LTSpice, mais le comportement que vous signalez est exactement ce à quoi je m'attendrais.

Les implémentations FFT les plus courantes fonctionnent sur une puissance entière de 2 points de données. Ainsi, la plupart des implémentations remplissent vos 1 000 000 points de données à 1 048 576 points de données et effectuent la FFT à ce sujet. Notez que cette longueur n'est pas un nombre entier d'ondes sinusoïdales.

Il existe d'autres méthodes de transformation de Fourier qui décomposent les données différemment. Celles-ci portent généralement le nom de méthodes de transformation de Fourier discrète (DFT) et sont à la fois plus lentes et beaucoup plus complexes à mettre en œuvre. Je ne les ai presque jamais rencontrés dans des applications pratiques. La FFT est une implémentation DFT spécifique qui nécessite que le nombre de points de données soit une puissance entière de 2 (ou parfois une puissance entière de 4).

Donc, je suppose que LTSpice remplit vos données à 1 048 576 points de données, les 48 576 valeurs de données ajoutées à la fin contenant une constante.

Vous pouvez maintenant voir le problème: votre tampon de 1 048 576 échantillons a 1 000 ondes sinusoïdales, chacun de 1 000 échantillons, suivis de 48 576 valeurs constantes. Cela ne peut pas être représenté par une somme d'ondes sinusoïdales de fréquence 1 kHz. Au lieu de cela, les résultats FFT montrent les valeurs haute fréquence supplémentaires nécessaires pour reconstruire votre signal.

Pour déterminer si c'est le problème, créez un tampon de 1 048 576 échantillons contenant une onde sinusoïdale avec une période de 1 024 échantillons. Les hautes fréquences devraient être considérablement réduites en amplitude.

Maintenant, quant à l'effet de l'application d'une fenêtre:

L'algorithme FFT «enveloppe» conceptuellement les données, de sorte que le dernier point des données d'entrée est suivi du premier point des données d'entrée. Autrement dit, la FFT est calculée comme si les données étaient infinies, répétées circulairement, comme un vecteur avec la séquence: x [0], x [1], ..., x [1048574], x [1048575], x [ 0], x [1], ...

Cet habillage peut entraîner une transition par étapes entre le dernier point du tampon de données et le premier point. Cette transition par étapes génère des résultats FFT avec de grandes contributions (parasites) à partir des hautes fréquences. Le but d'une fenêtre est d'éliminer ce problème. La fonction de fenêtre passe à zéro aux deux extrémités, donc dans votre cas, w [0] et w [999999] seraient tous deux nuls. Lorsque les données sont multipliées par la fenêtre, les valeurs deviennent nulles au début et à la fin, il n'y a donc pas de transition par étapes au niveau de l'habillage.

La fonction de fenêtre que vous appliquez modifie le contenu fréquentiel du tampon, vous choisissez une fonction qui présente un compromis acceptable. Un gaussien est un bon point de départ. Pour toute application pratique dans laquelle vous ne pouvez pas contrôler précisément le contenu en fréquence des données, vous devrez appliquer une fonction de fenêtre pour éliminer la transition d'étape implicite en raison de la longueur des données.

Problèmes résiduels:

Il existe une autre source potentielle de bruit spectral à haute fréquence dans la FFT. L'effet augmente avec la longueur de la FFT, et cela peut être quelque chose que vous pouvez voir dans certains cas à 1 000 000 points de données.

La boucle interne de l'algorithme FFT utilise les points autour d'un cercle dans le plan complexe: e ^ (i * theta), où l'algorithme itère 'theta' de 0 à 2 * pi en étapes successivement plus fines, jusqu'au nombre de points dans le FFT. Autrement dit, si vous calculez une FFT sur 1 048 576 échantillons, dans l'une des itérations de la boucle externe, la boucle interne calculera e ^ (i * thêta), où thêta = 2 * pi * n / N, où N est 1 048 576 , itérant n de 0 à 1 048 575. Cela se fait par la méthode évidente de multiplication successive par e ^ (i * 2 * pi / N).

Vous pouvez voir le problème: lorsque N devient grand, e ^ (i * 2 * pi / N) devient très proche de 1, et il est multiplié N fois. Avec la virgule flottante double précision, les erreurs sont faibles, mais je pense que vous pouvez voir le bruit de fond résultant si vous regardez attentivement. Avec la virgule flottante simple précision, à 1 000 000 points de données, le calcul FFT produit lui-même un bruit de fond important.

Il existe des techniques alternatives pour calculer e ^ (i * theta) qui éliminent ce problème, mais la mise en œuvre est plus complexe. Je n'ai eu à créer une telle implémentation qu'une seule fois.


En ce qui concerne DFT contre FFT, le menu contextuel de LTSPICE l'appelle "FFT" tandis que la boîte de dialogue de configuration l'appelle "DFFT". Maintenant, en lisant le fichier d'aide, je vois ce que @un citoyen inquiet a mentionné au sujet de l'acceptation par LTSPICE d'un nombre de points sans puissance de deux.
watkipet

0

Raison possible: -

Lorsque vous dessinez une onde transitoire dans un simulateur, elle interpole entre les calculs réels afin de minimiser le travail acharné effectué et de permettre un résultat plus rapide à afficher à l'écran.

Le paramètre par défaut pour le pas de temps maximal dans LTSpice peut être de 100 us et donc entre ces points, vous avez des résultats interpolés, c'est-à-dire qu'ils ne sont pas parfaits et contribuent à la distorsion considérée comme des harmoniques dans la FFT.

Essayez de définir votre pas de temps maximum pour qu'il soit beaucoup plus petit que ce qu'il est actuellement et voyez ce qui se passe.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.