如何理解DFT结果

时间:2015-10-08 10:44:44

标签: c algorithm fft dft

我使用DFT的这种实现:

dir=1

这里放置http://paulbourke.net/miscellaneous/dft/

第一个问题是应用直接变换(#define SAMPLES 2048 #define ZEROES_NUMBER 512 double step = PI_2/(SAMPLES-2*ZEROES_NUMBER); for(int i=0; i<SAMPLES; i++) { /* * Fill in the beginning and end with zeroes */ if(i<ZEROES_NUMBER || i > SAMPLES-ZEROES_NUMBER) { samplesReal[i] = 0; samplesImag[i] = 0; } /* * Generate one period cos with 1024 samples */ else { samplesReal[i] = cos(step*(double)(i-ZEROES_NUMBER)); samplesImag[i] = 0; } } )后我们应该缩放值的原因吗?我读了一些关于DFT实现的想法,但没有找到任何关于它的信息。

作为输入,我使用带有1024采样频率的cos

void DFT_transform(double complex* samples, int num, double complex*   res)
{
    for(int k=0; k<num; k++)
    {
        res[k] = 0;
        for(int n=0; n<num; n++)
        {
            double complex Wkn = cos(PI_2*(double)k*(double)n/(double)num) -
            I*sin(PI_2*(double)k*(double)n/(double)num);

            res[k] += samples[n]*Wkn;
        }
    }
}

对于绘图我删除了上面提到的缩放比例因为输出值变得非常小而且无法绘制图形。

我得到了振幅和相位的图表: enter image description here enter image description here

正如您所见,相位始终为0且幅度谱相反。为什么?

下面是我更易读的版本,没有缩放产生相同的结果:

$arr = array(

 'H1' => array(
            "name" => "A",
            "title" => "T1",
      ),
 'H2' => array(
           "name" => "B",
           "title" => "B1",
      )
);

// Generate a new array with 'keys' and values in 'name'
$new = array_combine(array_keys($arr), array_column($arr, 'name'));

// Search in that new array
$search = array_search('A', $new);

var_dump($search);

1 个答案:

答案 0 :(得分:3)

好的,伙计们。我很高兴地说这个实现有效。 问题是绘制图形和缺乏理解公式的错误方法。

如何运作

DFT Formulas

正如您所看到的,k变量用于改变频率。 因此频率ν= k / T 其中T是获取样本所花费的时间段。 T = N / S 其中S是您的采样频率。然后,您可以将频率设为 v = S * k / N

因此,当您得到结果时,您应该计算每个点的频率并删除 S / 2 以上的所有内容,然后才能绘制图表幅度=幅度(频率)。这是我以前不理解的。希望它对某人有所帮助。

我得到的一些图表。

Sin 100HZ。

Sin 100Hz

Sin 100HZ + Cos 200HZ。 sin(100x)+cos(200x)

Sin 100HZ +(Cos 200HZ)/ 2 sin(100x)+cos(200x)/2

如您所见,显示频率和相关幅度。缩放存在问题,但是如果我们想要确定信号中出现的频率则无关紧要。

感谢@PaulR