0

私はこの DFT で壁に頭をぶつけています。8,0,0,0,0,0,0,0 と出力されますが、代わりに 8 と非常に小さな数字が表示されます。これらは丸め誤差ですか? 何か私にできることはありますか?私のRadix2 FFTは正しい結果をもたらします.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;
}
4

1 に答える 1

1

FFT は実際には、単純な DFT 計算よりも正確な結果を生成できます。通常、算術演算が少ないほど、算術量子化エラーが累積する機会が少なくなるからです。このトピックに関する FFTW の作成者の 1 人による論文があります。

DFT/FFT は超越基底関数を扱うため、非シンボリックで有限のコンピューター数値形式を使用した場合、結果が正確に正確になることはありません (おそらくいくつかの特殊なケースや幸運な偶然を除く)。そのため、ゼロに非常に近い値 (数 LSB 以内) は、単にノイズとして無視するか、ゼロと同じと見なす必要があります。

于 2013-10-08T19:15:34.517 に答える