gpt4 book ai didi

c - 如何理解DFT结果

转载 作者:太空狗 更新时间:2023-10-29 15:35:12 25 4
gpt4 key购买 nike

我使用 DFT 的这个实现:

/*
Direct fourier transform
*/
int DFT(int dir,int m,double *x1,double *y1)
{
long i,k;
double arg;
double cosarg,sinarg;
double *x2=NULL,*y2=NULL;

x2 = malloc(m*sizeof(double));
y2 = malloc(m*sizeof(double));
if (x2 == NULL || y2 == NULL)
return(FALSE);

for (i=0;i<m;i++) {
x2[i] = 0;
y2[i] = 0;
arg = - dir * 2.0 * 3.141592654 * (double)i / (double)m;
for (k=0;k<m;k++) {
cosarg = cos(k * arg);
sinarg = sin(k * arg);
x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
}
}

/* Copy the data back */
if (dir == 1) {
for (i=0;i<m;i++) {
x1[i] = x2[i] / (double)m;
y1[i] = y2[i] / (double)m;
}
} else {
for (i=0;i<m;i++) {
x1[i] = x2[i];
y1[i] = y2[i];
}
}

free(x2);
free(y2);
return(TRUE);
}

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

第一个问题是为什么在应用直接变换(dir=1)之后我们应该缩放值?我阅读了一些关于 DFT 实现的想法,但没有找到任何相关信息。

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

#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;
}
}

为了绘图,我删除了我上面询问的缩放比例,因为输出值变得非常小并且无法绘制图形。

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

如您所见,相位始终为 0,振幅谱反转。为什么?

下面是我没有缩放的更具可读性的版本,它产生了相同的结果:

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;
}
}
}

最佳答案

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

工作原理

DFT Formulas

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

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

我得到的一些图表。

罪100HZ。

Sin 100Hz

正弦 100HZ + 余弦 200HZ。 sin(100x)+cos(200x)

正弦 100HZ + (余弦 200HZ)/2 sin(100x)+cos(200x)/2

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

感谢@PaulR

关于c - 如何理解DFT结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33013558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com