没有合适的资源?快使用搜索试试~ 我知道了~
首页C语言实现FFT(快速傅里叶变换)
C语言实现FFT(快速傅里叶变换)
5星 · 超过95%的资源 需积分: 45 98 下载量 188 浏览量
更新于2023-03-16
评论 5
收藏 68KB DOC 举报
C语言实现FFT(快速傅里叶变换),在比赛的时候做音频信号分析仪用到了,分享一下。
资源详情
资源评论
资源推荐
#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 s[FFT_N]; //FFT 输入和输出:从 S[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 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=xin[j];
xin[j]=xin[i];
xin[i]=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(xin[ip],u); //蝶形运算,详见公式
xin[ip].real=xin[i].real-t.real;
xin[ip].imag=xin[i].imag-t.imag;
xin[i].real=xin[i].real+t.real;
xin[i].imag=xin[i].imag+t.imag;
}
u=EE(u,w); //改变系数,进行下一个蝶形运算
}
}
}
}
/************************************************************
函数原型:void main()
函数功能:测试 FFT 变换,演示函数使用方法
输入参数:无
输出参数:无
************************************************************/
void main()
{
int i;
for(i=0;i<FFT_N;i++) //给结构体赋值
{
s[i].real=sin(2*3.141592653589793*i/FFT_N); //实部为正弦波 FFT_N 点采样,赋值为 1
s[i].imag=0; //虚部为 0
}
FFT(s); //进行快速福利叶变换
for(i=0;i<FFT_N;i++) //求变换后结果的模值,存入复数的实部部分
s[i].real=sqrt(s[i].real*s[i].real+s[i].imag*s[i].imag);
while(1);
}
剩余11页未读,继续阅读
loves6036
- 粉丝: 1
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1