Pourquoi les FFT ont-elles du courrier indésirable à l'extrémité haute fréquence? Supposons que je vais simuler ce circuit dans LTSPICE:
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:
À 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?
Réponses:
@ 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=0
le 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é: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
plotwinsize
peut 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:
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
numdgt
est définie sur une valeur> 7 qui, selon le livre, permet une double précision: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.
la source
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.
la source
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.
la source