DFT的计算公式
公式评论说有错
X ( k ) = ∑ n = 0 N − 1 x ( n ) e x p ( − j 2 Π / N ∗ n ∗ k ) X(k)=\sum_{n=0}^{N-1}{x(n)}exp(-j2\Pi/N*n*k) X(k)=∑n=0N−1x(n)exp(−j2Π/N∗n∗k)
根据公式以及欧拉定理
e i x = c o s ( x ) + i ∗ s i n ( x ) e^{ix}=cos(x)+i*sin(x) eix=cos(x)+i∗sin(x)
所以有
X ( k ) = ∑ n = 0 N − 1 x ( n ) ∗ ( c o s ( 2 ∗ Π / N ∗ n ∗ k ) + i ∗ s i n ( 2 ∗ Π / N ∗ n ∗ k ) ) X(k)=\sum_{n=0}^{N-1}x(n)*(cos(2*\Pi/N*n*k)+i*sin(2*\Pi/N*n*k)) X(k)=∑n=0N−1x(n)∗(cos(2∗Π/N∗n∗k)+i∗sin(2∗Π/N∗n∗k))
有
z = a + i ∗ b = a 2 + b 2 z=a+i*b=\sqrt{a^2+b^2} z=a+i∗b=a2+b2
代码
#include <stdio.h>//标准输入输出头文
#include<math.h>//声明了常用的一些数学运算
#define pi 3.1415
#define N 32//32个点
typedef struct
{
double real,imag;
} complex;//复数 结构
complex dft_out[100];//单个点计算k
complex dft_one[100];//单个点计算n
double amp[N];//DFT后的结果
int main()
{
int n,k;
double xn;
for(k=0; k<N; k++)//k循环
{
for(n=0; n<N; n++)//n循环
{
xn=cos(n*pi/6);//要DFT的信号
dft_one[n].real=xn*cos(2*pi/N*n*k);//实部信号
dft_one[n].imag=xn*sin(2*pi/N*n*k);//虚部信号
dft_out[k].real+=dft_one[n].real;
dft_out[k].imag+=dft_one[n].imag;//DFT后的实部,虚部相加
}
amp[k]=sqrt(dft_out[k].real*dft_out[k].real+dft_out[k].imag*dft_out[k].imag);//欧拉公式
printf("%d %f\n",k,amp[k]);
}
}
gnuplot画图和matlab仿真结果
C:
matlab: