perplexo com o espectro de fase fft!

9

Um experimento muito simples do MATLAB:

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

E aqui está a saída: insira a descrição da imagem aqui

Agora, fez uma pequena alteração no snippet de código acima; reduzindo a duração do tempo em apenas 1 amostra, da seguinte maneira:

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

E o espectro de fases fica totalmente louco:

insira a descrição da imagem aqui

Questões:

  1. No primeiro gráfico, eu esperava ver uma fase zero no compartimento 700, que corresponde à frequência positiva de 200 neste exemplo. Esse não parece ser o caso. Em segundo lugar, não entendo as partes lineares do gráfico no gráfico 1. Aprecio componentes de fase que poderiam existir devido ao chamado ruído numérico, mas como esse ruído pode ser tão 'linear' na fase?

  2. No segundo gráfico, por que remover apenas uma amostra teria um impacto tão drástico no gráfico de fase?

  3. Estou fazendo algo fundamentalmente errado aqui?

user4673
fonte

Respostas:

18

Você não está fazendo nada de errado, mas também não está pensando cuidadosamente sobre o que deveria esperar, e é por isso que está surpreso com o resultado. Para a pergunta 1, sua conjectura está próxima, mas você realmente tem coisas ao contrário; é o ruído numérico que está atormentando o seu segundo, não o primeiro.

As imagens podem ajudar. Aqui estão gráficos da magnitude e da fase do primeiro teste:

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

insira a descrição da imagem aqui

insira a descrição da imagem aqui

E o 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]

insira a descrição da imagem aqui

insira a descrição da imagem aqui

k/10000 0k999

k/10010 0k1000200/1000k/1001

Em geral, acho que os gráficos apenas do ângulo de fase são uma péssima ideia para transmitir informações, precisamente por esse motivo; primeiro, você não pode dizer se está olhando para a fase do lixo de baixa amplitude ou do sinal real; segundo, não é invariável à tradução e é fácil obter gráficos totalmente desconcertantes para entradas simples. Muito melhor, se você ainda está procurando algo que transmita informações de fase, é um gráfico que retrata simultaneamente as informações de fase e amplitude da mesma maneira visual, como um gráfico em que a fase é codificada como matiz e a magnitude como brilho.

ADENDO: Aqui estão algumas fotos do Mathematica que ilustram o princípio que afirmei no parágrafo 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]

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Todas as três imagens são transformadas 2D de Fourier do mesmo sinal de entrada (um quadrado de de 1 preenchido com zeros para um comprimento de ), mas as entradas foram rotacionadas ciclicamente por 5, 4 e 0 e 200 pontos de dados. Os espectros de magnitude (codificados pelo brilho do pixel) são idênticos, mas os espectros de fase são completamente diferentes! A codificação de fase é feita para que 1 mapeie para vermelho, mapeie para verde, mapeie para ciano e11×11500×500Eu-1 1-Eumapeia para roxo. É isso que quero dizer quando digo que os espectros de fase são invariantes sem mudança de turno e, portanto, não são passíveis de compreensão visual humana. Por exemplo, com um deslocamento cíclico de 200 pontos de dados, é completamente impossível dizer o que está acontecendo na fase, pois parece apenas estático, mas o sinal de entrada não é mais complicado do que os outros casos de entrada.

DumpsterDoofus
fonte
0

Se você deseja variar a frequência de um sinal ou o comprimento da FFT, para que o sinal varie entre exatamente periódico e não exatamente periódico na abertura da FFT, e não deseja ver a fase do compartimento de magnitude de pico para essa alteração de sinal, pode-se referenciar a fase inicial do sinal ao centro se a abertura da FFT em vez do início (para um pecado gerado (t), coloque t = 0 no centro da matriz da FFT).

hotpaw2
fonte
-1

O site Gaussian Waves detalha a parte sobre a fase e seu comportamento aleatório: apenas uma questão de erro de ponto flutuante, como disse DumpsterDoofus.

Gim
fonte