欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    快速傅里叶变换)C语言程序.doc

    • 资源ID:34691707       资源大小:96KB        全文页数:10页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    快速傅里叶变换)C语言程序.doc

    如有侵权,请联系网站删除,仅供学习与交流(快速傅里叶变换)C语言程序【精品文档】第 10 页#include <iom128.h>#include <intrinsics.h> 快速傅立叶变换C函数函数简介:此函数是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依 赖硬件。此函数采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的 复数使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N 应该为2的N次方,不满足此条件时应在后面补0函数调用:FFT(s);时 间:2010-2-20版 本:Ver1.0参考文献: #include<math.h>#define PI 3.1415926535897932384626433832795028841971 /定义圆周率值#define FFT_N 128 /定义傅立叶变换的点数struct compx float real,imag; /定义一个复数结构struct compx sFFT_N; /FFT输入和输出:从S1开始存放,根据大小自己定义函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出struct compx EE(struct compx a,struct compx b) struct compx c; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; return(c);函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型void FFT(struct compx *xin) int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; /变址运算,即把自然顺序变成倒位序,采用雷德算法 nm1=FFT_N-1; for(i=0;i<nm1;i+) if(i<j) /如果i<j,即进行变址 t=xinj; xinj=xini; xini=t; k=nv2; /求j的下一个倒位序 while(k<=j) /如果k<=j,表示j的最高位为1 j=j-k; /把最高位变成0 k=k/2; /k/2,比较次高位,依次类推,逐个比较,直到某个位为0 j=j+k; /把0改为1 int le,lei,ip; /FFT运算核,使用蝶形运算完成FFT运算 f=FFT_N; for(l=1;(f=f/2)!=1;l+) ; /计算l的值,即计算蝶形级数 for(m=1;m<=l;m+) / 控制蝶形结级数 /m表示第m级蝶形,l为蝶形级总数l=log(2)N le=2<<(m-1); /le蝶形结距离,即第m级蝶形的蝶形结相距le点 lei=le/2; /同一蝶形结中参加运算的两点的距离 u.real=1.0; /u为蝶形结运算系数,初始值为1 u.imag=0.0; w.real=cos(PI/lei); /w为系数商,即当前系数与前一个系数的商 w.imag=-sin(PI/lei); for(j=0;j<=lei-1;j+) /控制计算不同种蝶形结,即计算系数不同的蝶形结 for(i=j;i<=FFT_N-1;i=i+le) /控制同一蝶形结运算,即计算系数相同蝶形结 ip=i+lei; /i,ip分别表示参加蝶形运算的两个节点 t=EE(xinip,u); /蝶形运算,详见公式 xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; u=EE(u,w); /改变系数,进行下一个蝶形运算函数原型:void main() 函数功能:测试FFT变换,演示函数使用方法输入参数:无输出参数:无void main() int i; for(i=0;i<FFT_N;i+) /给结构体赋值 si.real=sin(2*3.141592653589793*i/FFT_N); /实部为正弦波FFT_N点采样,赋值为1 si.imag=0; /虚部为0 FFT(s); /进行快速傅立叶变换 for(i=0;i<FFT_N;i+) /求变换后结果的模值,存入复数的实部部分 si.real=sqrt(si.real*si.real+si.imag*si.imag); while(1);#include <iom128.h>#include <intrinsics.h> 快速傅立叶变换C程序包函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依 赖硬件。此程序包采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的 复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表, 以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N 应该为2的N次方,不满足此条件时应在后面补0。若使用查表法计算sin值和 cos值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表函数调用:FFT(s);时 间:2010-2-20版 本:Ver1.1参考文献: #include<math.h>#define FFT_N 128 /定义傅立叶变换的点数#define PI 3.1415926535897932384626433832795028841971 /定义圆周率值struct compx float real,imag; /定义一个复数结构struct compx sFFT_N; /FFT输入和输出:从S0开始存放,根据大小自己定义float SIN_TABFFT_N/2; /定义正弦表的存放空间函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出struct compx EE(struct compx a,struct compx b) struct compx c; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; return(c);函数原型:void create_sin_tab(float *sin_t)函数功能:创建一个正弦采样表,采样点数与傅立叶变换点数相同输入参数:*sin_t存放正弦表的数组指针输出参数:无void create_sin_tab(float *sin_t) int i; for(i=0;i<FFT_N/2;i+) sin_ti=sin(2*PI*i/FFT_N);函数原型:void sin_tab(float pi)函数功能:采用查表的方法计算一个数的正弦值输入参数:pi 所要计算正弦值弧度值,范围0-2*PI,不满足时需要转换输出参数:输入值pi的正弦值float sin_tab(float pi) int n; float a; n=(int)(pi*FFT_N/2/PI); if(n>=0&&n<FFT_N/2) a=SIN_TABn; else if(n>=FFT_N/2&&n<FFT_N) a=-SIN_TABn-FFT_N/2; return a;函数原型:void cos_tab(float pi)函数功能:采用查表的方法计算一个数的余弦值输入参数:pi 所要计算余弦值弧度值,范围0-2*PI,不满足时需要转换输出参数:输入值pi的余弦值float cos_tab(float pi) float a,pi2; pi2=pi+PI/2; if(pi2>2*PI) pi2-=2*PI; a=sin_tab(pi2); return a;函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型输出参数:无void FFT(struct compx *xin) int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; /变址运算,即把自然顺序变成倒位序,采用雷德算法 nm1=FFT_N-1; for(i=0;i<nm1;i+) if(i<j) /如果i<j,即进行变址 t=xinj; xinj=xini; xini=t; k=nv2; /求j的下一个倒位序 while(k<=j) /如果k<=j,表示j的最高位为1 j=j-k; /把最高位变成0 k=k/2; /k/2,比较次高位,依次类推,逐个比较,直到某个位为0 j=j+k; /把0改为1 int le,lei,ip; /FFT运算核,使用蝶形运算完成FFT运算 f=FFT_N; for(l=1;(f=f/2)!=1;l+) /计算l的值,即计算蝶形级数 for(m=1;m<=l;m+) / 控制蝶形结级数 /m表示第m级蝶形,l为蝶形级总数l=log(2)N le=2<<(m-1); /le蝶形结距离,即第m级蝶形的蝶形结相距le点 lei=le/2; /同一蝶形结中参加运算的两点的距离 u.real=1.0; /u为蝶形结运算系数,初始值为1 u.imag=0.0; /w.real=cos(PI/lei); /不适用查表法计算sin值和cos值 / w.imag=-sin(PI/lei); w.real=cos_tab(PI/lei); /w为系数商,即当前系数与前一个系数的商 w.imag=-sin_tab(PI/lei); for(j=0;j<=lei-1;j+) /控制计算不同种蝶形结,即计算系数不同的蝶形结 for(i=j;i<=FFT_N-1;i=i+le) /控制同一蝶形结运算,即计算系数相同蝶形结 ip=i+lei; /i,ip分别表示参加蝶形运算的两个节点 t=EE(xinip,u); /蝶形运算,详见公式 xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; u=EE(u,w); /改变系数,进行下一个蝶形运算函数原型:void main() 函数功能:测试FFT变换,演示函数使用方法输入参数:无输出参数:无void main() int i; create_sin_tab(SIN_TAB); for(i=0;i<FFT_N;i+) /给结构体赋值 si.real=sin(2*3.141592653589793*i/FFT_N); /实部为正弦波FFT_N点采样,赋值为1 si.imag=0; /虚部为0 FFT(s); /进行快速傅立叶变换 for(i=0;i<FFT_N;i+) /求变换后结果的模值,存入复数的实部部分 si.real=sqrt(si.real*si.real+si.imag*si.imag); while(1);#include <iom128.h>#include <intrinsics.h> 快速傅立叶变换C程序包函数简介:此程序包是通用的快速傅里叶变换C语言函数,移植性强,以下部分不依 赖硬件。此程序包采用联合体的形式表示一个复数,输入为自然顺序的复 数(输入实数是可令复数虚部为0),输出为经过FFT变换的自然顺序的 复数.此程序包可在初始化时调用create_sin_tab()函数创建正弦函数表, 以后的可采用查表法计算耗时较多的sin和cos运算,加快可计算速度.与 Ver1.1版相比较,Ver1.2版在创建正弦表时只建立了1/4个正弦波的采样值, 相比之下节省了FFT_N/4个存储空间使用说明:使用此函数只需更改宏定义FFT_N的值即可实现点数的改变,FFT_N的 应该为2的N次方,不满足此条件时应在后面补0。若使用查表法计算sin值和 cos值,应在调用FFT函数前调用create_sin_tab()函数创建正弦表函数调用:FFT(s);时 间:2010-2-20版 本:Ver1.2参考文献: #include<math.h>#define FFT_N 128 /定义傅立叶变换的点数#define PI 3.1415926535897932384626433832795028841971 /定义圆周率值struct compx float real,imag; /定义一个复数结构struct compx sFFT_N; /FFT输入和输出:从S0开始存放,根据大小自己定义float SIN_TABFFT_N/4+1; /定义正弦表的存放空间函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和b的乘积,以联合体的形式输出struct compx EE(struct compx a,struct compx b) struct compx c; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; return(c);函数原型:void create_sin_tab(float *sin_t)函数功能:创建一个正弦采样表,采样点数与傅立叶变换点数相同输入参数:*sin_t存放正弦表的数组指针输出参数:无void create_sin_tab(float *sin_t) int i; for(i=0;i<=FFT_N/4;i+) sin_ti=sin(2*PI*i/FFT_N);函数原型:void sin_tab(float pi)函数功能:采用查表的方法计算一个数的正弦值输入参数:pi 所要计算正弦值弧度值,范围0-2*PI,不满足时需要转换输出参数:输入值pi的正弦值float sin_tab(float pi) int n; float a; n=(int)(pi*FFT_N/2/PI); if(n>=0&&n<=FFT_N/4) a=SIN_TABn; else if(n>FFT_N/4&&n<FFT_N/2) n-=FFT_N/4; a=SIN_TABFFT_N/4-n; else if(n>=FFT_N/2&&n<3*FFT_N/4) n-=FFT_N/2; a=-SIN_TABn; else if(n>=3*FFT_N/4&&n<3*FFT_N) n=FFT_N-n; a=-SIN_TABn; return a;函数原型:void cos_tab(float pi)函数功能:采用查表的方法计算一个数的余弦值输入参数:pi 所要计算余弦值弧度值,范围0-2*PI,不满足时需要转换输出参数:输入值pi的余弦值float cos_tab(float pi) float a,pi2; pi2=pi+PI/2; if(pi2>2*PI) pi2-=2*PI; a=sin_tab(pi2); return a;函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型输出参数:无void FFT(struct compx *xin) int f,m,nv2,nm1,i,k,l,j=0; struct compx u,w,t; nv2=FFT_N/2; /变址运算,即把自然顺序变成倒位序,采用雷德算法 nm1=FFT_N-1; for(i=0;i<nm1;i+) if(i<j) /如果i<j,即进行变址 t=xinj; xinj=xini; xini=t; k=nv2; /求j的下一个倒位序 while(k<=j) /如果k<=j,表示j的最高位为1 j=j-k; /把最高位变成0 k=k/2; /k/2,比较次高位,依次类推,逐个比较,直到某个位为0 j=j+k; /把0改为1 int le,lei,ip; /FFT运算核,使用蝶形运算完成FFT运算 f=FFT_N; for(l=1;(f=f/2)!=1;l+) /计算l的值,即计算蝶形级数 for(m=1;m<=l;m+) / 控制蝶形结级数 /m表示第m级蝶形,l为蝶形级总数l=log(2)N le=2<<(m-1); /le蝶形结距离,即第m级蝶形的蝶形结相距le点 lei=le/2; /同一蝶形结中参加运算的两点的距离 u.real=1.0; /u为蝶形结运算系数,初始值为1 u.imag=0.0; /w.real=cos(PI/lei); /不适用查表法计算sin值和cos值 / w.imag=-sin(PI/lei); w.real=cos_tab(PI/lei); /w为系数商,即当前系数与前一个系数的商 w.imag=-sin_tab(PI/lei); for(j=0;j<=lei-1;j+) /控制计算不同种蝶形结,即计算系数不同的蝶形结 for(i=j;i<=FFT_N-1;i=i+le) /控制同一蝶形结运算,即计算系数相同蝶形结 ip=i+lei; /i,ip分别表示参加蝶形运算的两个节点 t=EE(xinip,u); /蝶形运算,详见公式 xinip.real=xini.real-t.real; xinip.imag=xini.imag-t.imag; xini.real=xini.real+t.real; xini.imag=xini.imag+t.imag; u=EE(u,w); /改变系数,进行下一个蝶形运算函数原型:void main() 函数功能:测试FFT变换,演示函数使用方法输入参数:无输出参数:无void main() int i; create_sin_tab(SIN_TAB); for(i=0;i<FFT_N;i+) /给结构体赋值 si.real=sin(2*3.141592653589793*i/FFT_N); /实部为正弦波FFT_N点采样,赋值为1 si.imag=0; /虚部为0 FFT(s); /进行快速傅立叶变换 for(i=0;i<FFT_N;i+) /求变换后结果的模值,存入复数的实部部分 si.real=sqrt(si.real*si.real+si.imag*si.imag); while(1);

    注意事项

    本文(快速傅里叶变换)C语言程序.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开