2011-09-28 4 views
26

현재 푸리에 변환 알고리즘을 쓰려고합니다. 이산 푸리에 변환

public class DFT { 
    public static Complex[] Transform(Complex[] input) { 
     int N = input.Length; 

     Complex[] output = new Complex[N]; 

     double arg = -2.0 * Math.PI/(double)N; 
     for (int n = 0; n < N; n++) { 
      output[n] = new Complex(); 
      for (int k = 0; k < N; k++) 
       output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k); 
     } 
     return output; 
    } 
} 

그래서 나는 다음과 같은 코드를 사용하여이 알고리즘을 테스트 : 수학적 정의에 설명 된대로 나는 간단한 DFT 알고리즘을 시작

private int samplingFrequency = 120; 
    private int numberValues = 240; 

    private void doCalc(object sender, EventArgs e) { 
     Complex[] input = new Complex[numberValues]; 
     Complex[] output = new Complex[numberValues]; 

     double t = 0; 
     double y = 0; 
     for (int i = 0; i < numberValues; i++) { 
      t = (double)i/(double)samplingFrequency; 
      y = Math.Sin(2 * Math.PI * t); 
      input[i] = new Complex(y, 0); 
     } 

     output = DFT.Transform(input); 

     printFunc(input); 
     printAbs(output); 
    } 

변환은 잘 작동하지만 numberValues ​​경우 배수 samplingFrequency의 번호 (이 경우 : 120, 240, 360, ...). (240 개) 값에 대한 내 결과 그게 전부 :

http://s1.directupload.net/images/110928/n3m8hqg6.jpg

변환은 잘했다. 내 계산 값의 수를 변경하는 경우

http://s7.directupload.net/images/110928/qizoiqbt.jpg

왜 내가 잘못된 결과를 얻고있다 : 나는이 결과를 얻을 수 (280 개) 값을 계산하려고하면

? 여기 내 문제가 내 코드에 문제가 있거나 DFT의 수학적 정의에 대한 오해가 있는지 확실하지 않습니다. 어느 쪽이든, 아무도 내 문제를 도와 줄 수 있습니까? 감사.

+0

변환 기능의 입력이 복잡한 배열 인 이유를 알려주십시오.확실히 표준 음파 (시간 영역)에서 변환하는 경우 단일 이중 배열일까요? –

+2

좋아요, 알 겠어요. 허수 부분이 0으로 설정 되었으니, 그것은 단지 하나의 더블이라면 본질적으로 같습니다. 그런데 코드에서 'Complex.Polar'는 'Complex.FromPolarCoordinates'여야합니다. –

+2

플롯에 무엇을 사용합니까? – GorillaApe

답변

28

겪고있는 것을 Spectral Leakage이라고합니다.

이것은 푸리에 변환의 기본 수학이 -infinity에서 + infinity까지의 연속 함수를 가정하기 때문에 발생합니다. 따라서 제공하는 표본의 범위는 효과적으로 무한 반복됩니다. 창에 파형의 전체 사이클 수가없는 경우 끝이 정렬되지 않으며 불연속이 발생하여 어느 한쪽으로 주파수가 번지면서 자체를 나타냅니다.

정상적인 처리 방법은 Windowing입니다. 그러나 이것은 진폭이 약간 벗어나게되므로 단점이 있습니다. 이것은 처리 할 샘플의 전체 창을 윈도우의 양 끝에서 0쪽으로 기울여서 끝이 늘어나지 만 약간의 진폭 왜곡이있는 일부 함수로 곱하는 프로세스입니다.이 프로세스로 인해 총 신호 전력이 낮아지기 때문입니다.

요약하면 코드에는 오류가 없으므로 결과는 예상대로입니다. 인공물은 창 함수를 사용하여 줄일 수 있지만 진폭의 정확도에 영향을 미칩니다. 프로젝트의 요구 사항에 가장 적합한 솔루션을 조사하고 결정해야합니다.

4

비표준 사인 곡선에 대해 잘못된 결과가 표시되지 않습니다. 그리고 그것들은 단지 "유물"이 아닙니다. 결과는 실제로주기적인 정현파로는 볼 수없는 더 완전한 DFT 결과입니다. 그 밖의 0이 아닌 값에는 예를 들어 단일 비주기 누설 사인 곡선의 주파수를 보간하는 데 사용할 수있는 유용한 정보가 들어 있습니다.

DFT는 직사각형 창을 사인파와 컨벌루션하는 것으로 생각할 수 있습니다. 이것은 무한 범위의 Sinc 함수를 생성하지만, DFT 빈에 정확히 위치하는 사인 곡선의 중앙 DFT 빈 이외의 모든 DFT 빈 빈도에서 0이됩니다. 이것은 주파수가 FFT 조리개에서 정확히 주기적 일 때만 발생합니다. Sinc 함수는 첫 번째 플롯에서 모두 숨겨지는 많은 "혹"을 가지고 있습니다.