DFT与IDFT
【转】https://blog.csdn.net/mingzhuo_126/article/details/88044390
二.编程实现
考滤到DFT和IDFT算法过程中有部分相似,可以把它们合成到一个算法。
/* x-存放要变换数据的实部 y-存放要变换数据的虚部 a-存放变换结果的实部 b-存放变换结果的虚部 n-数据长度 sign-为1时执行DFT,为-1时执行IDFT */ #include "math.h" void dft(x,y,a,b,n,sign) int n, sign; double x[],y[],a[],b[]; { int i,k; double c,d,q,w,s; q = 6.28318530718/n; for (k=0;k<n;k++) { w=k*q; a[k]=b[k]=0.0; for(i=0;i<n;i++) { d=i*w; c=cos(d); s=sin(d)*sign; a[k]+=c*x[i] + s*y[i]; b[k]+=c*y[i] - s*x[i]; } } if(sign == -1) { c=1.0/n; for (k=0;k<n;k++) { a[k]=c*a[k]; b[k]=c*b[k]; } } }
下面验证此算法,对X(n)=(0,1,2,3,4,5,6,7),做DFT和IDFT算法
dft_d.c
#include "stdio.h" #include "math.h" #include "dft.c" #define N 4 static double x[N],y[N],a[N],b[N],c[N]; main(){ int k; int i=0; for(i=0; i<N; i++) { x[i]=i; y[i]=0; } dft(x,y,a,b,N,1); //DFT变换 for(i=0; i<N; i++) { c[i]=sqrt(a[i]*a[i]+b[i]*b[i]); //算出模 printf("%lf + j %lf \n",a[i],b[i]);//输出变换后结果 printf("%lf \n",c[i]); //输出模值 printf("\n"); } dft(a,b,x,y,N,-1); //IDFT变换 for(i=0; i<N; i++) { printf("%lf \n",x[i]); //输出x(n)的实部 } }
运行结果:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!