sconcertato dallo spettro di fase fft!


9

Un esperimento MATLAB molto semplice:

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

Ed ecco l'output: inserisci qui la descrizione dell'immagine

Ora, ho apportato una piccola modifica allo snippet di codice sopra riportato; ridurre la durata del tempo di solo 1 campione, come segue:

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

E lo spettro di fase diventa totalmente pazzo:

inserisci qui la descrizione dell'immagine

Domande:

  1. Nella prima trama, speravo di vedere una fase zero nel bin 700 che corrisponde alla frequenza positiva di 200 in questo esempio. Questo non sembra essere il caso. In secondo luogo, non capisco le parti lineari del grafico nella trama 1. Apprezzo i componenti di fase che potrebbero potenzialmente esistere a causa del cosiddetto rumore numerico, ma come potrebbe essere tale rumore in fase "lineare"?

  2. Nel secondo diagramma, perché rimuovere solo un campione avrebbe un impatto così drastico sul diagramma delle fasi?

  3. Sto facendo qualcosa di fondamentalmente sbagliato qui?

Risposte:


18

Non stai facendo nulla di male, ma non stai anche pensando attentamente a cosa dovresti aspettarti di vedere, motivo per cui sei sorpreso del risultato. Per la domanda 1, la tua congettura è vicina, ma in realtà hai le cose al contrario; è il rumore numerico che affligge il tuo secondo, non il tuo primo.

Le foto possono aiutare. Ecco i grafici della grandezza e della fase per la prima prova:

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

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

E il secondo:

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]

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

K/10000K999

K/10010K1000200/1000K/1001

In generale, penso che i grafici del solo angolo di fase siano una pessima idea per trasmettere informazioni, proprio per questo motivo; in primo luogo, non si può dire se si sta osservando la fase di immondizia a bassa ampiezza o segnale effettivo, e in secondo luogo, non è invariante per la traduzione ed è facile ottenere grafici assolutamente sconcertanti per input semplici. Molto meglio, se stai ancora cercando qualcosa che trasmetta informazioni di fase, è un grafico che ritrae simultaneamente informazioni di fase e ampiezza nello stesso modo visivo, come un diagramma in cui la fase è codificata come tonalità e la grandezza è codificata come luminosità.

ADDENDUM: Ecco un paio di foto di Mathematica che illustrano il principio che ho affermato nel paragrafo precedente:

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]

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

11×11500×500io-1-ioè mappato al viola. Questo è ciò che intendo quando dico che gli spettri di fase sono invarianti non-shift e quindi non suscettibili alla comprensione visiva umana. Ad esempio, con uno spostamento ciclico di 200 punti dati, è completamente impossibile dire cosa sta succedendo nella fase, dato che sembra solo statico, ma il segnale di ingresso non è più complicato rispetto agli altri casi di input.


0

Se si desidera variare la frequenza di un segnale o la lunghezza della FFT in modo che il segnale vari tra esattamente periodica e non esattamente periodica nell'apertura della FFT e non si desidera vedere la fase del contenitore della magnitudine di picco per quel cambiamento di segnale, si può fare riferimento alla fase iniziale del segnale al centro se l'apertura FFT anziché l'inizio (per un sin generato (t), mettere t = 0 al centro dell'array FFT).


-1

Il sito Gaussian Waves descrive in dettaglio la parte relativa alla fase e il suo comportamento simile a quello casuale: solo una questione di errore in virgola mobile come ha detto DumpsterDoofus

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.