DFT C 语言
目錄
- DFT的計算公式
- 代碼
- gnuplot畫圖和matlab仿真結果
DFT的計算公式
公式評論說有錯
X(k)=∑n=0N?1x(n)exp(?j2Π/N?n?k)X(k)=\sum_{n=0}^{N-1}{x(n)}exp(-j2\Pi/N*n*k)X(k)=∑n=0N?1?x(n)exp(?j2Π/N?n?k)
根據公式以及歐拉定理
eix=cos(x)+i?sin(x)e^{ix}=cos(x)+i*sin(x)eix=cos(x)+i?sin(x)
所以有
X(k)=∑n=0N?1x(n)?(cos(2?Π/N?n?k)+i?sin(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?1?x(n)?(cos(2?Π/N?n?k)+i?sin(2?Π/N?n?k))
有
z=a+i?b=a2+b2z=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:
總結
- 上一篇: java:数字转string 报空指针_
- 下一篇: java毕设用的框架_分享四个Java低