MATLAB: mise à l'échelle et

11

Dans MATLAB, les sorties des fonctions fftet / ou ifftnécessitent souvent un traitement supplémentaire avant d'être prises en compte pour l'analyse.

J'ai entendu de nombreuses opinions divergentes sur ce qui est correct:

  • Mise à l'échelle

    Mathworks indique que les fonctions fftet ifftsont basées sur les équations suivantes:

    X[k]=11n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
  • Mise à l'échelle en fonction de la longueur du signal

    Mes pairs mettent généralement à l'échelle les données par immédiatement après le traitement de . (Nous ne considérons pas les données brutes avant la mise à l'échelle.)1Nfft
    fft

    %% Effectuer fft
    X_f = fft (x, n_sample, 1) / n_sample; % fft doit être normalisé par le nombre d'échantillons dans les données. % Cette convention a été définie par le développeur du logiciel (Mathworks).

    Est-ce correct?

    1. Si oui, pourquoi la ifftfonction MATLAB s'attend-elle à ce que nous n'ayons pas déjà été mis à l'échelle par ?1/N
    2. Existe-t-il une ifftfonction MATLAB ou une option de fonction qui ne se redimensionne pas automatiquement de ?1/N

    Sinon, existe-t-il une meilleure convention que nous devrions utiliser pour placer le ? Par exemple, placer le dans le plutôt que le , ou placer un dans les deux équations, au lieu d'un ?1/N1/Nfftifft1/N1/N

  • Mise à l'échelle par période d'échantillonnage

    J'ai entendu dire que les fonctions fftet ifftsupposent que la période d'échantillonnage , et que pour que les fonctions soient vraies, les éléments suivants devraient s'appliquer:Tsampling=1/fsampling=1

X[k]=1Tsamplingn=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=TsamplingNk=1NX[k]e+j2π(k1)(n1)N,where1nN

Voir les liens:

  • Lien 1 (voir le commentaire de Matt Szelistowski par le Dr Seis)
  • Lien 2 (voir la réponse de Rick Rosson vs celle du Dr Seis)
  • Lien 3 (voir commentaire de Matt (Message: 7/16) et commentaire de Poorya (14/16)
  • Lien 4 (voir p. 10, diapositive [1,1])
  • Lien 5 (voir p. 8 + 9) [il semble qu'il utilise la convention inverse pour fft et ifft].

Est-ce vrai?

Je suis particulièrement piqué parce que je ne trouve aucune équation DFT ou DTFT sur Wikipedia qui inclut la période d'échantillonnage.

kando
la source
2
BTW, kando le déclare tel quel (avec MATLAB): mais je dois dire que cette convention câblée de MATLAB pour mettre DC dans le bac # 1 (ou l'amplitude de la composante de fréquence dans le bac ) me pousse putain de nutz !!!! kk+1
X[k]=n=1Nx[n]ej2π(k1)(n1)N,where1kNx[n]=1Nk=1NX[k]e+j2π(k1)(n1)N,where1nN
kk+1
robert bristow-johnson

Réponses:

6

La mise à l'échelle ou non de la FFT avant de 1 / N dépend du résultat que vous souhaitez approfondir: énergie (préservation de l'identité de Parseval) ou amplitude (mesure de la hauteur ou des volts, etc.).

Si vous souhaitez mesurer ou analyser l'énergie, alors ne pas mettre à l'échelle par 1 / N, et une sinusoïde plus longue de la même amplitude produira un résultat FFT plus grand, proportionnel à la plus grande énergie d'un signal plus long.

Un peu plus souvent, si vous souhaitez mesurer ou analyser des amplitudes, puis pour obtenir une sinusoïde plus longue (donc avec plus d'énergie totale à la même amplitude exacte) pour produire environ le même résultat FFT qu'un signal plus court, vous devrez réduire l'échelle de la Addition FFT par un rapport proportionnel à la longueur. Le rapport pourrait être reference_length / N, qui est parfois 1 / N si le gain d'entrée du système est de 1,0 pour toutes les dimensions ou unités, y compris les dimensions d'intervalle de temps, que vous choisissez d'utiliser dans votre analyse ultérieure. Vous devez réduire proportionnellement parce qu'un DFT est une somme: plus vous résumez des éléments similaires, plus le résultat est grand.

Alors. Énergie ou amplitude. Lequel veux-tu?

Maintenant, si vous réduisez la FFT vers l'avant, vous ne devez pas redimensionner l'inverse de sorte que IFFT (FFT (x)) == x. Ou vice versa.

Le 1 / sqrt (N) pour la mise à l'échelle me semble être pour soit quand on a besoin d'une symétrie formelle pour une preuve, soit lors de la construction d'une sorte de pipeline matériel où la latence et / ou le nombre d'unités / portes arithmétiques pour la DFT et pour l'IDFT doit être identique. Mais vous n'obtenez ni une bonne mesure directe ni de l'énergie ni de l'amplitude pour tout type d'analyse technique typique.

hotpaw2
la source
Quand vous dites "si vous voulez mesurer l'énergie, alors ne pas mettre à l'échelle par " ... n'aurais-je pas besoin de mettre à l'échelle par pour que la transformation soit unitaire et préserve l'énergie? Ou est-ce parce que j'ai besoin de quadriller le signal entier pour obtenir l'énergie qui donne efficacement? Si c'est vrai, cependant, quel est le spectre mis à l'échelle par me montrant alors? 1 / 1/N 1/N1/1/N1/N1/N
LCsa
De plus, lorsque vous dites "donc avec plus d'énergie à la même amplitude exacte" ... ne voudriez-vous pas plutôt dire "fréquence"?
LCsa
7

La convention de mise à l'échelle utilisée par Matlab est courante dans DSP. Vous pouvez également utiliser la DFT unitaire où la DFT et l'IDFT sont mises à l'échelle par un facteur de . Vous pouvez également utiliser le facteur pour le DFT et le facteur pour l'IDFT. Tant que vous êtes cohérent, cela n'a pas vraiment d'importance (à part des considérations numériques, en particulier lors de l'utilisation d'implémentations à virgule fixe). Il n'y a donc pas de "meilleures" conventions, il n'y a que des "conventions", et il vous suffit de vous mettre d'accord sur celle que vous utilisez. 1/N11/N1/N1

Le commentaire

% fft doit être normalisé par le nombre d'échantillons dans les données.
% Cette convention a été définie par le développeur du logiciel (Mathworks).

est faux. Personne ne dit que vous devez normaliser le résultat de la FFT. Si vous le souhaitez, vous êtes libre de le faire.

En outre, la FFT ne suppose rien sur la période d'échantillonnage . Notez que la DFT peut être utilisée pour des données qui sont discrètes par nature sans aucun échantillonnage impliqué. En fonction de vos données et de ce que vous voulez faire avec le résultat, vous devez tenir compte de en conséquence. Par exemple, si vous souhaitez utiliser la DFT (implémentée par la FFT) pour approximer la transformée de Fourier à temps continu, vous obtenez l'expression suivante:TTT

(1)X(2πkNT)Tn=0N1x(nT)ej2πkn/N,0k<N

où est la période d'échantillonnage, est la longueur DFT, est le signal à temps continu et est sa transformée de Fourier à temps continu. Le côté droit de est juste la DFT de échantillons de , mis à l'échelle par , où nous supposons que la partie pertinente de est dans la plage . Plus de détails sur l'utilisation de la DFT pour approximer la transformée de Fourier en temps continu peuvent être trouvés dans cette réponse .N x ( t ) X ( ω ) ( 1 ) N x ( t ) T x ( t ) t [ 0 , N T ]TNx(t)X(ω)(1)Nx(t)Tx(t)t[0,NT]

Matt L.
la source
2
À quoi sert le downvote? Commentez s'il vous plaît.
Matt L.
1
je vote habituellement au scrutin secret, mais je vais faire une exception cette fois. en fonction de ce que l'on fait avec la DFT, il existe certainement de "meilleures" conventions que les autres. (mais aucune convention n'est meilleure que les autres en toutes circonstances.)
robert bristow-johnson
5

d'autant plus qu'il s'agit d'une question de convention, je ne renforcerai pas la convention ridicule de MATLAB et ne répondrai qu'avec la ou les bonne (s) convention (s). c'est-à-dire que l'indexation de MATLAB pour la DFT n'est pas juste et appropriée, mais je suis à peu près agnostique quant à laquelle des trois conventions de mise à l'échelle courantes.

aussi, je ne restreins pas ni , ils peuvent être des entiers car je suis assez fasciné par la signification fondamentale de la transformation de Fourier discrète: la TFD et la série de Fourier discrète sont une et le même. La DFT mappe une séquence périodique avec la période à une autre séquence périodique également avec la période et l'iDFT la mappe en arrière.0n<N0k<Nx[n]NX[k]N

donc

x[n+N]=x[n] nZ
X[k+N]=X[k] kZ

aussi, la convolution circulaire dans le "domaine temporel" ( ) ou le "domaine fréquentiel" ( ) est définie de manière cohérente avec toutes les conventions:x[n]X[k]

h[n]x[n]i=0N1h[i]x[ni]=i=0N1x[i]h[ni]
W[k]X[k]i=0N1W[i]X[ki]=i=0N1X[i]W[ki]

le seul avantage d'une convention par rapport à l'autre (en supposant que les deux conventions sont valides) peut donc concerner la simplicité d'expression de certains des théorèmes.


la convention d'échelle la plus courante pour la DFT:

DFT{x[n]}X[k]n=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

présente l'avantage de la simplicité concernant la convolution circulaire dans le "domaine temporel"

DFT{h[n]x[n]}=H[k]X[k]

mais il y a un facteur d'échelle dont vous devez vous soucier si vous vous retrouvez dans le "domaine fréquentiel" :

iDFT{W[k]X[k]}=1Nw[n]x[n]

Le théorème de Parseval a aussi un facteur d'échelle à craindre.

n=0N1|x[n]|2=1Nk=0N1|X[k]|2

et le théorème de la dualité:

DFT{X[n]}=Nx[k]
iDFT{x[k]}=1NX[n]

l'autre convention d'échelle commune pour la DFT:

iDFT{X[k]}x[n]k=0N1X[k]e+j2πkn/NDFT{x[n]}X[k]=1Nn=0N1x[n]ej2πkn/N

a l'avantage d'être un peu plus proche, conceptuellement, de la série de Fourier, où sont les fonctions de base de Fourier et sont les coefficients de Fourier. donc si vous regardez des données brutes du domaine temporel, , et voyez une sinusoïde avec cycles dans le tampon de échantillons et avec (zéro à crête) l'amplitude , cela signifierait que .ejωknej(2πk/N)nX[k]x[n]kNA|X[k]|=|X[k]|=|X[Nk]|=A2

il a également plus de simplicité concernant la convolution circulaire dans le domaine fréquentiel

iDFT{W[k]X[k]}=w[n]x[n]

mais il y a un facteur d'échelle dont vous devez vous soucier si vous vous retrouvez dans le domaine temporel :

DFT{h[n]x[n]}=1NH[k]X[k]

Le théorème de Parseval a aussi un facteur d'échelle à craindre.

1Nn=0N1|x[n]|2=k=0N1|X[k]|2

et le théorème de la dualité:

DFT{X[n]}=1Nx[k]
iDFT{x[k]}=NX[n]

la convention de mise à l'échelle unitaire pour la DFT est identique en mise à l'échelle avec son inverse et préserve l'énergie à travers la transformée ou la transformation inverse:

DFT{x[n]}X[k]1Nn=0N1x[n]ej2πkn/NiDFT{X[k]}x[n]=1Nk=0N1X[k]e+j2πkn/N

la convolution dans le domaine temporel ou le domaine fréquentiel a le même facteur d'échelle à prendre en compte:

DFT{h[n]x[n]}=1NH[k]X[k]

iDFT{W[k]X[k]}=1Nw[n]x[n]

mais le théorème de Parseval n'a pas de facteur d'échelle à craindre.

n=0N1|x[n]|2=k=0N1|X[k]|2

le théorème de la dualité non plus:

DFT{X[n]}=x[k]
iDFT{x[k]}=X[n]

robert bristow-johnson
la source
Lorsque l'on parle de conventions DFT, il s'agit généralement uniquement des facteurs de mise à l'échelle, et non du problème de l'indexation. Si vous pensiez que je faisais référence à l'indexation lorsque j'ai dit que c'était la convention DSP commune, c'était un malentendu. Bien sûr, j'ai fait référence à la mise à l'échelle; l'indexation est totalement hors de propos, car elle n'a rien à voir avec la définition de la DFT (et la mise à l'échelle a).
Matt L.
ce n'est pas un putain de "non-problème" quand, dans MATLAB, vous utilisez la max(abs(X))fonction pour trouver où se trouve un pic spectral et vous oubliez de soustraire 1de l'index renvoyé et vous allez faire des calculs dessus. c'est un problème. et triste à cela. l'origine de l'indexation a autant à voir avec la " définition de la DFT" que la mise à l'échelle. il s'agit de savoir quelle comptabilité est requise ou non.
robert bristow-johnson
aurait pu être moi, mais cette fois ce n'est pas le cas :) Mais quand même, je ne suis pas d'accord avec l'importance que vous attachez à l'indexation, mais j'apprécie que ce soit personnel. Encore une fois, aucun vote négatif parce que j'apprécie le temps que vous consacrez à la réponse.
Matt L.