用c语言编程实现fourier变换.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用c语言编程实现fourier变换

用C语言编程实现Fourier变换一、源程序://项目名称:离散信号的fourier分解与合成 //本程序针对的原始离散序列为实序列,采样前的原始时域信号为x=sin(2*pi*t)+0.5*(2*pi*5*t)//即将振幅为1的1Hz正弦波和振幅为0.5的5Hz的正弦波相加后进行Fourier分析,研究能否从中分析出这两种频率的信号。 #include stdio.h#include stdlib.h#include math.h#define N 64 //数据的个数#define dt 0.02 //采样间隔#define PI 3.141592 void main(int argc, char *argv[]) {FILE *p1,*p2,*p3; int i,k; double x[N]={}; //用此数组存储时域的采样信号 double y[N]={}; //用此数组存储还原后的信号 double re[N]={}; //用此数组存储频域中的实数分量 double im[N]={}; //用此数组存储频域中的虚数分量 double c[N]={}; //用此数组存储频域中频谱函数 double t;int n; //采样序列p1=fopen(C:\\Users\\Administrator\\Desktop\\time domain signal_1.txt,w); //指定时域信号的存储路径及文件for(n=0;nN;n++){t=n*dt; //时间序列x[n]=sin(2*PI*t)+0.5*sin(2*PI*5*t);//产生时域序列 fprintf(p1,%lf\t%lf\n,t,x[n]);//格式化输出到p1指针所指的文件 }printf(采样点\t\t振幅\n);//显示傅里叶变换前的时域信号 for(n=0;nN;n++){printf(%d\t\t%lf\n,n,x[n]);} //********************傅里叶变换开始 *********************** for(k=0;kN/2;k++)for(i=0;iN;i++){re[k]=re[k]+x[i]*cos(2*PI*k*i/N); //实数分量 im[k]=im[k]+x[i]*sin(2*PI*k*i/N); //虚数分量 } p2=fopen(C:\\Users\\Administrator\\Desktop\\frequency domain signal.txt,w); //指定频域信号的存储文件 for(k=0;kN/2;k++){c[k]=sqrt((re[k]*re[k])+(im[k]*im[k])); //产生频域信号 fprintf(p2,%lf\t%lf\n,k/(N*dt),c[k]); //格式化输出到p2指针所指的文件 } printf(\n\n傅里叶变换结果为:\n);//显示傅里叶变换后的频域信号 printf(\n\n谐波次数\t振幅\n);for(k=0;kN;k++){printf(%d\t\t%lf\n,k,c[k]); } //*******************傅里叶反变换开始*********************p3=fopen(C:\\Users\\Administrator\\Desktop\\time domain signal_2.txt,w); //指定还原的原始信号的存储路径及文件for(i=0;iN;i++){t=i*dt;for(k=0;kN/2;k++){y[i]=y[i]+(re[k]*cos(2*PI*k*i/N)+im[k]*sin(2*PI*k*i/N))/N; }fprintf(p3,%lf\t%lf\n,t,y[i]);//格式化输出到p3指针所指的文件 }printf(\n\n);printf(\n\n傅里叶反变换结果为:\n);//显示傅里叶反变换后的频域信号 printf(\n\n采样点\t\t振幅\n);for(i=0;iN;i++){printf(%d\t\t%lf\n,i,y[i]); //显示傅里叶反变换后的时域信号 } }二、程序运行得到的数据文件如下:原始时域信号采样结果为:0.0000000.0000000.0200000.4192260.0400000.7242180.0600000.8436530.0800000.7756460.1000000.5877850.1

文档评论(0)

wdjp11801 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档