desconcertado por el espectro de fase fft!

9

Un experimento MATLAB muy simple:

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

Y aquí está el resultado: ingrese la descripción de la imagen aquí

Ahora, realizó un pequeño cambio en el fragmento de código anterior; reduciendo la duración del tiempo en solo 1 muestra, de la siguiente manera:

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

Y el espectro de fase se vuelve totalmente loco:

ingrese la descripción de la imagen aquí

Preguntas:

  1. En la primera gráfica, esperaba ver una fase cero en el contenedor 700 que corresponde a la frecuencia positiva de 200 en este ejemplo. Ese no parece ser el caso. En segundo lugar, no entiendo las partes lineales del gráfico en la gráfica 1. Aprecio los componentes de fase que podrían existir debido al llamado ruido numérico, pero entonces, ¿cómo podría ese ruido ser tan 'lineal' en fase?

  2. En la segunda gráfica, ¿por qué eliminar solo una muestra tendría un impacto tan drástico en la gráfica de fase?

  3. ¿Estoy haciendo algo fundamentalmente mal aquí?

usuario4673
fuente

Respuestas:

18

No está haciendo nada malo, pero tampoco está pensando cuidadosamente sobre lo que debe esperar ver, por lo que está sorprendido por el resultado. Para la pregunta 1, su conjetura está cerca, pero en realidad tiene las cosas al revés; Es el ruido numérico el que afecta a su segundo, no al primero.

Las imágenes pueden ayudar. Aquí hay gráficos de la magnitud y fase para la primera prueba:

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

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Y el segundo:

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]

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

k/ /10000 0k999

Sin embargo, para el primero, la definición de la FFT abarca frecuencias de la forma para , mientras que la frecuencia de su señal es , que no es de la forma . Como resultado, su señal se amplía por la fuga espectral y será distinta de cero en casi todas partes. No comentaré la forma física del diagrama de fase, pero diré que admite una forma analítica cerrada.k/ /10010 0k1000200/ /1000k/ /1001

En general, creo que los gráficos de ángulo de fase por sí solos son una muy mala idea para transmitir información, precisamente por esta razón; primero, no puede saber si está viendo la fase de basura de baja amplitud o señal real, y segundo, no es invariante de traducción, y es fácil obtener gráficos completamente desconcertantes para entradas simples. Mucho mejor, si todavía está buscando algo que transmita información de fase, es un gráfico que retrata simultáneamente la información de fase y amplitud de la misma manera visual, como un gráfico donde la fase se codifica como tono y la magnitud se codifica como brillo.

ADENDA: Aquí hay un par de imágenes de Mathematica que ilustran el principio que dije en el párrafo anterior:

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]

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

11×11500×500yo-1-yomapas a púrpura. Esto es a lo que me refiero cuando digo que los espectros de fase son invariables sin desplazamiento y, por lo tanto, no son susceptibles de comprensión visual humana. Por ejemplo, con un desplazamiento cíclico de 200 puntos de datos, es completamente imposible saber qué está pasando en la fase, ya que solo parece estático, pero la señal de entrada no es más complicada que los otros casos de entrada.

ContenedorDoofus
fuente
0

Si desea variar la frecuencia de una señal o la longitud de FFT de modo que la señal varíe entre exactamente periódica y no exactamente periódica en la apertura de FFT, y no desea ver la fase del bin de magnitud pico para ese cambio de señal, se puede hacer referencia a la fase inicial de la señal al centro si la apertura FFT en lugar del comienzo (para un sin generado (t), coloque t = 0 en el centro de la matriz FFT).

hotpaw2
fuente
-1

El sitio de Gaussian Waves detalla la parte sobre la fase y su comportamiento aleatorio: solo una cuestión de error de coma flotante, como dijo DumpsterDoofus

Gim
fuente