fft 위상 스펙트럼으로 당황합니다!


9

매우 간단한 MATLAB 실험 :

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

출력은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

이제 위의 코드 스 니펫을 약간 변경했습니다. 다음과 같이 하나의 샘플만으로 시간을 줄입니다.

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

그리고 위상 스펙트럼은 완전히 미쳐갑니다.

여기에 이미지 설명을 입력하십시오

질문 :

  1. 첫 번째 줄거리에서, 나는이 예에서 양의 주파수 200에 해당하는 빈 700에서 제로 위상을보기를 바랐습니다. 그것은 사실이 아닌 것 같습니다. 둘째, 도표 1에서 그래프의 선형 부분을 이해하지 못합니다. 소위 수치 잡음으로 인해 잠재적으로 존재할 수있는 위상 성분을 이해하지만 그 잡음이 어떻게 위상에서 '선형 적'일 수 있습니까?

  2. 두 번째 플롯에서 왜 단 하나의 샘플 만 제거하면 위상 플롯에 큰 영향을 미칩니 까?

  3. 나는 근본적으로 잘못된 일을하고 있습니까?

답변:


18

당신은 잘못된 일을하고 있지는 않지만, 당신이 볼 것으로 예상되는 것에 대해 신중하게 생각하고 있지 않기 때문에 결과에 놀랐습니다. 1 번 문제는 추측이 가까워 지지만 실제로는 거꾸로 있습니다. 그것은 첫 번째 것이 아니라 두 번째 것을 괴롭히는 수치 노이즈입니다.

사진이 도움이 될 수 있습니다. 첫 번째 시도의 규모와 단계에 대한 도표는 다음과 같습니다.

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

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

그리고 두 번째 것 :

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]

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

무슨 일이야? 두 번째는 가장 쉬운 설명입니다. 첫째, 두 번째 FFT는 크기 스펙트럼에서 볼 수있는 두 개의 피크를 제외하고 어디에서나 진폭이 0입니다. 1,000 개의 데이터 포인트를 사용하여 FFT를 정의하면 형식의 주파수가 반환되므로케이/1000 ...에 대한 0케이999따라서 신호가 주파수 빈에 정확하게 떨어 집니다 . 결과적으로 다른 998 포인트에서 신호는 전적으로 부동 소수점 오류로 인한 기계 노이즈로 인한 것이므로 위상 스펙트럼은 말 그대로 의사 난수의 위상이기 때문에 넌센스입니다.

그러나 첫 번째 경우 FFT의 정의에는 다음과 같은 형식의 주파수가 포함됩니다. 케이/1001 ...에 대한 0케이1000신호 주파수는 200/1000형식이 아닙니다. 케이/1001. 결과적으로 신호가 스펙트럼 누출에 의해 넓어지고 거의 모든 곳에서 0이 아닙니다. 위상 플롯의 물리적 형태에 대해서는 언급하지 않지만 닫힌 분석 형태를 허용한다고 말할 것입니다.

일반적으로, 위상 각 그래프만으로는 정보를 전달하기에 정말 나쁜 생각이라고 생각합니다. 첫째, 저 진폭 가비지 또는 실제 신호의 위상을보고 있는지 여부를 알 수 없으며 둘째, 변환 불변성이 아니며 간단한 입력을 위해 완전히 어리둥절한 그래프를 쉽게 얻을 수 있습니다. 위상 정보를 전달하는 것을 찾고 있다면 위상과 진폭 정보를 동일한 시각적 방식으로 동시에 나타내는 그래프 (예 : 색조가 색조로 인코딩되고 크기가 밝기로 인코딩 된 플롯)가 훨씬 더 좋습니다.

부록 : 다음은 Mathematica의 몇 가지 그림으로, 이전 단락에서 언급 한 원칙을 보여줍니다.

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]

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

세 이미지 모두 동일한 입력 신호의 2D 푸리에 변환입니다 ( 11×11 1의 제곱은 0에서 길이로 채워집니다. 500×500), 입력은 5, 4, 0 및 200 데이터 포인트 씩 주기적으로 회전되었습니다. 크기 스펙트럼 (픽셀 밝기로 인코딩)은 동일하지만 위상 스펙트럼은 완전히 다릅니다! 위상 인코딩은 1이 빨간색으로 매핑되도록 수행됩니다.나는 녹색으로 매핑 1 청록색에 매핑하고 나는자주색으로 매핑됩니다. 이것이 위상 스펙트럼이 변하지 않고 변하지 않기 때문에 인간의 시각적 이해가 불가능하다는 것을 의미합니다. 예를 들어, 200 개의 데이터 포인트를 주기적으로 이동 시키면 위상이 어떻게 진행되는지 알 수 없습니다. 정적 인 것처럼 보이지만 입력 신호는 다른 입력 사례보다 더 복잡하지 않습니다.


0

신호의 주파수 또는 FFT 길이를 변경하여 신호가 FFT 조리개에서 정기주기와 정기주기가 서로 다르고 해당 신호 변화에 대한 피크 크기 구간의 위상을보고 싶지 않은 경우, 시작 대신 FFT 조리개가 발생하는 경우 신호의 초기 위상을 중심으로 참조 할 수 있습니다 (생성 된 sin (t)의 경우 FFT 배열의 중심에 t = 0을 넣음).


-1

Gaussian Waves 사이트 는 위상과 임의의 유사 행동에 대한 부분을 자세히 설명합니다. DumpsterDoofus가 말한 것처럼 부동 소수점 오류 문제

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.