声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3012|回复: 5

[FFT] C语言实现FFT

[复制链接]
发表于 2008-5-8 15:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
哪位大虾知道在DSP平台上能实现的有C语言编的FFT
谢谢!
回复
分享到:

使用道具 举报

发表于 2008-5-8 17:26 | 显示全部楼层
C语言编的FFT,代码网上有很多啊,你可以搜搜,可以移植到DSP上啊,记得TI有这方面的库吧。

我给你个网上收集的C语言FFT代码,不过本人没有亲自验证,仅供参考把

[ 本帖最后由 eight 于 2008-5-8 22:00 编辑 ]

fft1.txt

910 Bytes, 下载次数: 81

C语言FFT代码1

fft2.txt

5.79 KB, 下载次数: 60

C语言FFT代码2

评分

1

查看全部评分

发表于 2008-5-9 20:46 | 显示全部楼层
  1. //x--双精度实型一维数组,长度的n。开始时存在要变换数据的实部,最后
  2. //存放变换变换结果的实部
  3. //y--双精度实型一维数组,长度的n。开始时存在要变换数据的虚部,最后
  4. //存放变换变换结果的虚部
  5. //n--整型变量,数据长度如果是2的整数次幂,即n=(2的m次方);
  6. //数据长度如果不是2的整数次幂,即(2的m次方)<n<(2的m+1次方),
  7. //取前(2的m次方)个数据进行fft
  8. //sign--整型变量。sign=1时,子函数fft()计算离散傅立叶正变换(dft);
  9. //sign=-1时,子函数fft()计算离散傅立叶反变换(idft)
  10. void time2fft(float x[],float y[],int n,int sign)//时间抽样基2fft
  11. {
  12.     int i,j,m,k,l,n1,n2,q;
  13.     float ui1,ur1,c1,e,ui,ur,s1,t,tr,ti;
  14.     q=n;
  15.       for(j=1,i=1;i<n;i++)//取m值
  16.     {
  17.      m=i;
  18.      j=2*j;
  19.    if(j<n&&2*j>n)
  20.    {
  21.       n=j;
  22.      break;
  23.     }
  24.      if(j==n)
  25.       break;
  26.     }
  27.      n1=n-1;
  28.        for(j=0,i=0;i<n1;i++)//变换
  29. {
  30.   if (i<j)
  31.   {
  32.    tr=x[j];  
  33.                  ti=y[j];
  34.                  x[j]=x[i];
  35.                  y[j]=y[i];
  36.                  x[i]=tr;
  37.    y[i]=ti;
  38.   }
  39.       k=n/2;
  40.       while(k<=j)
  41.      {
  42.    j=j-k;
  43.    k=k/2;
  44.      }
  45.       j=j+k;
  46. }
  47. n1=1;
  48.    for(l=1;l<=m;l++)
  49.     {
  50.       n1=2*n1;
  51.         n2=n1/2;
  52.       
  53.         ur=1;
  54.         ui=0;
  55. c1=cos(3.1415926/n2);
  56. s1=-sign*sin(3.1415926/n2);
  57.            for(j=0;j<n2;j++)
  58.      {
  59.        for(i=j;i<n;i=i+n1)
  60.   {
  61.              k=i+n2;
  62.                    tr=ur*x[k]-ui*y[k];
  63.                    ti=ur*y[k]+ui*x[k];
  64.                    x[k]=x[i]-tr;
  65.                    y[k]=y[i]-ti;
  66.                    x[i]=x[i]+tr;
  67.                    y[i]=y[i]+ti;
  68.   }
  69.             
  70.                ur1=ur*c1-ui*s1;
  71.                ui1=ur*s1+ui*c1;
  72.                ur=ur1;
  73.                ui=ui1;
  74.       }
  75.       }

  76.    if(sign==-1)
  77.    {
  78.       for(i=0;i<n;i++)
  79.       {
  80.         x[i]/=n;
  81.            y[i]/=n;
  82.       }
  83.    }
复制代码


自己以前花了不少时间编出来的,可以正确运行
发表于 2008-5-10 10:04 | 显示全部楼层
赞楼上,
向你学习,
呵呵。
发表于 2008-5-16 01:39 | 显示全部楼层
if(j<n&&2*j>n)
&&没看懂  是"或"吗
发表于 2008-5-16 06:47 | 显示全部楼层
本帖最后由 wdhd 于 2016-9-10 14:10 编辑
原帖由 jxby022089 于 2008-5-16 01:39 发表
if(jn)
&&没看懂  是"或"吗

“!”是逻辑非运算符
“&&”是逻辑与运算符
“||”是逻辑或运算符
上面这是C语言的逻辑运算符,和Matlab语言的不同(下面)
“~”是逻辑非运算符
“&”是逻辑与运算符
“|”是逻辑或运算符
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 07:36 , Processed in 0.095948 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表