2013-10-08 4 views
0

나는이 DFT에서 벽에 머리를 때려왔다. 그것은 출력해야합니다 : 8,0000000하지만 대신 8 매우 작은 숫자를 얻을. 이러한 반올림 오류가 있습니까? 내가 할 수 있는게 있습니까? Radix2 FFT를 사용하면 정확한 결과를 얻을 수 있습니다. DFT가 작동하지 않을 수 있습니다.DFT에서 부정확 한 결과를 나타내는 반올림 오류가 있습니까?

나는 복잡한 비트로 시작 했으므로 좋은 비트가 누락되었음을 알고 있으므로 문제를 설명하기 위해 스트립을 제거하려고했습니다. 적은 산술 작전은 일반적으로 축적 산술 양자화 오류에 대한 더 적은 기회를 허용하는

#include <cstdlib> 
#include <math.h> 
#include <iostream> 
#include <complex> 
#include <cassert> 

#define SIZE 8 
#define M_PI 3.14159265358979323846 

void fft(const double src[], double dst[], const unsigned int n) 
{ 
    for(int i=0; i < SIZE; i++) 
    { 
     const double ph = -(2*M_PI)/n; 
     const int gid = i; 

     double res = 0.0f; 
     for (int k = 0; k < n; k++) { 

      double t = src[k]; 

      const double val = ph * k * gid; 
      double cs = cos(val); 
      double sn = sin(val); 

      res += ((t * cs) - (t * sn)); 
      int a = 1; 
     } 

     dst[i] = res; 
     std::cout << dst[i] << std::endl; 
    } 
} 

int main(void) 
{ 
    double array1[SIZE]; 
    double array2[SIZE]; 

    for(int i=0; i < SIZE; i++){ 
     array1[i] = 1; 
     array2[i] = 0; 
    } 

    fft(array1, array2, SIZE); 

    return 666; 
} 
+0

얼마나 작은 숫자입니까? –

+0

@PaulR 1e-16의 순서로 – molbdnilo

+0

오른쪽으로 소리가 들린다 - 소수점 이하 16 자리 또는 17 자리는 배정도 한계 근처에있다. 참고로 실제로는 에서 M_PI를 사용해야하지만이 경우에는 별다른 차이가 없다고 생각합니다. –

답변

1

사용 FFT는 실제로 직선 DFT 계산보다 더 정확한 결과를 생성 할 수 있습니다. 이 주제에 대해 FFTW 저자 중 한 명이 작성한 논문이 있습니다.

DFT/FFT는 초월적인 기초 함수를 다루기 때문에, 결과는 절대로 비 상징적이고 유한 한 컴퓨터 숫자 형식을 사용하여 정확하게 될 수 없습니다 (특별한 경우 또는 행운을 제외하고). 그러므로 0에 가까운 (LSB에서) 아주 가까운 값은 단순히 잡음으로 무시되거나 0과 동일한 것으로 간주되어야합니다.

+0

예, 지금하고 있습니다 : int tmp = res * 100; dst [i] = tmp/100.0f; 더 효율적인 방법이 있습니까? 기수 2 FFT가 있지만 그들은 나를 잘하지 않는 2^N 크기의 데이터 세트에서만 작동합니다. – lazy8s