dérouté par le spectre de phase fft!

9

Une expérience MATLAB très simple:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

Et voici la sortie: entrez la description de l'image ici

Maintenant, apporté une modification mineure à l'extrait de code ci-dessus; en réduisant la durée d'un seul échantillon, comme suit:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

Et le spectre de phase devient totalement fou:

entrez la description de l'image ici

Des questions:

  1. Dans le premier tracé, j'espérais voir une phase nulle au bac 700 qui correspond à la fréquence positive de 200 dans cet exemple. Cela ne semble pas être le cas. Deuxièmement, je ne comprends pas les parties linéaires du graphique dans le graphique 1. J'apprécie les composantes de phase qui pourraient potentiellement exister en raison du bruit dit numérique, mais alors comment ce bruit pourrait-il être si «linéaire» en phase?

  2. Dans le deuxième graphique, pourquoi le retrait d'un seul échantillon aurait un impact aussi drastique sur le graphique de phase?

  3. Suis-je en train de faire quelque chose de fondamentalement mauvais ici?

user4673
la source

Réponses:

18

Vous ne faites rien de mal, mais vous ne réfléchissez pas non plus à ce que vous devriez vous attendre à voir, c'est pourquoi vous êtes surpris du résultat. Pour la question 1, votre conjecture est proche, mais vous avez en fait des choses en arrière; c'est le bruit numérique qui afflige votre deuxième, pas votre premier.

Les photos peuvent aider. Voici des graphiques de l'ampleur et de la phase du premier essai:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

entrez la description de l'image ici

entrez la description de l'image ici

Et le second:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

entrez la description de l'image ici

entrez la description de l'image ici

k/10000k999

k/10010k1000200/1000k/1001

En général, je pense que les graphiques de l'angle de phase seuls sont une très mauvaise idée pour transmettre des informations, précisément pour cette raison; premièrement, vous ne pouvez pas dire si vous regardez la phase de déchets de faible amplitude ou de signal réel, et deuxièmement, ce n'est pas invariant à la traduction, et il est facile d'obtenir des graphiques complètement déroutants pour des entrées simples. Beaucoup mieux, si vous cherchez toujours quelque chose qui transmet des informations de phase, est un graphique qui représente simultanément les informations de phase et d'amplitude de la même manière visuelle, comme un tracé où la phase est codée en teinte et l'amplitude est codée en luminosité.

ADDENDA: Voici quelques photos de Mathematica qui illustrent le principe que j'ai énoncé dans le paragraphe précédent:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

11×11500×500i1icorrespond au violet. C'est ce que je veux dire quand je dis que les spectres de phase sont invariants sans décalage, et donc ne se prêtent pas à la compréhension visuelle humaine. Par exemple, avec un décalage cyclique de 200 points de données, il est complètement impossible de dire ce qui se passe dans la phase, car cela ressemble à de la statique, mais le signal d'entrée n'est pas plus compliqué que les autres cas d'entrée.

DumpsterDoofus
la source
0

Si vous souhaitez faire varier la fréquence d'un signal ou la longueur de la FFT de sorte que le signal varie entre exactement périodique et pas exactement périodique dans l'ouverture FFT, et que vous ne voulez pas voir la phase de la plage d'amplitude de crête pour ce changement de signal, on peut référencer la phase initiale du signal au centre si l'ouverture FFT au lieu du début (pour un sin généré (t), mettre t = 0 au centre du réseau FFT).

hotpaw2
la source
-1

Le site Gaussian Waves détaille la partie sur la phase et son comportement aléatoire: juste une question d'erreur en virgule flottante comme l'a dit DumpsterDoofus

Gim
la source