当前位置:首页 >> IT/计算机 >>

C语言写的FFT代码


FFT 代码
#include <stdio.h> #include <math.h> #include <stdlib.h> #define N 8 //64 输入样本总数 #define M 3 //DFT 运算层数 //2^m=N #define PI 3.1415926 float twiddle[N/2] = {1.0, 0.707, 0.0, -0.707}; float x_r[N] = {1, 1, 1, 1, 0, 0, 0, 0}; //输入数据,此处设为 8 个 float x_i[N]; //N=8

/** * 初始化输出虚部 */ static void fft_init( void ) { int i; for(i=0; i<N; i++) x_i[i] = 0.0; } /** * 反转算法.将时域信号重新排序. * 这个算法有改进的空间 */ static void bitrev( void ) { int p=1, q, i; int bit_rev[ N ]; float xx_r[ N ]; bit_rev[ 0 ] = 0; while( p < N ) { for(q=0; q<p; q++) { bit_rev[ q ] = bit_rev[ q ] * 2; bit_rev[ q + p ] = bit_rev[ q ] + 1; } p *= 2; }

for(i=0; i<N; i++) xx_r[ i ] = x_r[ i ]; for(i=0; i<N; i++) x_r[i] = xx_r[ bit_rev[i] ]; } void fft( void ) { fp = fopen("log2.txt", "a+");//此处 int cur_layer, gr_num, i, k, p; //cur_layer 代表正要计算的当前层, gr_num 代表当前层 的颗粒数 float tmp_real, tmp_imag, temp; // 临时变量, 记录实部 float tw1, tw2;// 旋转因子,tw1 为旋转因子的实部 cos 部分, tw2 为旋转因子的虚部 sin 部 分. int int step; // 步进 sample_num; // 颗粒的样本总数(各层不同, 因为各层颗粒的输入不同)

/* 对层循环 */ for(cur_layer=1; cur_layer<=M; cur_layer++) { /* 求当前层拥有多少个颗粒(gr_num) */ gr_num = 1; i = M - cur_layer; while(i > 0) { i--; gr_num *= 2; } /* 每个颗粒的输入样本数 N' */ sample_num = (int)pow(2, cur_layer); /* 步进. 步进是 N'/2 */ step = sample_num/2; /* */ k = 0; /* 对颗粒进行循环 */ for(i=0; i<gr_num; i++) { /* * 对样本点进行循环, 注意上限和步进 */ for(p=0; p<sample_num/2; p++)

{ // 旋转因子, 需要优化... tw1 = cos(2*PI*p/pow(2, cur_layer)); tw2 = -sin(2*PI*p/pow(2, cur_layer)); tmp_real = x_r[k+p]; tmp_imag = x_i[k+p]; temp = x_r[k+p+step]; /* 蝶形算法 */ x_r[k+p] = tmp_real + ( tw1*x_r[k+p+step] - tw2*x_i[k+p+step] ); x_i[k+p] = tmp_imag + ( tw2*x_r[k+p+step] + tw1*x_i[k+p+step] ); /* X[k] = A(k)+WB(k) * X[k+N/2] = A(k)-WB(k) 的性质可以优化这里*/ /*旋转因子, 需要优化... tw1 = cos(2*PI*(p+step)/pow(2, cur_layer)); tw2 = -sin(2*PI*(p+step)/pow(2, cur_layer)); x_r[k+p+step] = tmp_real + ( tw1*temp - tw2*x_i[k+p+step] ); x_i[k+p+step] = tmp_imag + ( tw2*temp + tw1*x_i[k+p+step] );*/ x_r[k+p+step] = tmp_real - ( tw1* temp - tw2*x_i[k+p+step] ); x_i[k+p+step] = tmp_imag - ( tw2* temp + tw1*x_i[k+p+step] ); printf("k=%d, x_r[k]=%f, x_i[k]=%f\n", k+p, x_r[k+p], x_i[k+p]); printf("k=%d, x_r[k]=%f, x_i[k]=%f\n", k+p+step, x_r[k+p+step], x_i[k+p+step]); } /* 开跳!:) */ k += 2*step; } } } void display( void ) { printf("\n\n"); int i; for(i=0; i<N; i++) printf("%f\t%f\n", x_r[i], x_i[i]); } int main( void ) { fft_init( ); //初始化 bitrev( ); //将输入直接按 FFT 计算要求排序,如 8 点 FFT 计算,排序为 x[0]、x[4]、 x[2]、x[6]、x[1]、x[5]、x[3]、x[7]

fft( ); display( );

//进行 FFT 计算 //显示计算结果

system( "pause" ); return 1; }


赞助商链接
相关文章:
第5题:用C语言编写FFT程序
第5题:用C语言编写FFT程序 - 用 C 语言编写 FFT 程序 在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征。尽管 传统的 DFT 算法能够...
FFT算法C语言程序代码
FFT算法C语言程序代码 - DIT-基 2FFT 的浮点 C 语言程序: 1、 生成旋转因子,复数结构,旋转因子 Wn=exp(-j*2*pi/N) //twiFactor——指向旋转因子矩阵...
实序列FFT算法的C语言实现
实序列FFT算法的C语言实现 - 实序列 FFT 算法的 C 语言实现 学生:XX 指导教师:XX 内容摘要:DFT 和 IDFT 是数字信号分析与处理中的一种重要运算和变换,但直接...
FFT用C语言实现
FFTC语言实现 - #include<stc12c5a60s2.h> #include<math.h> #define uchar unsigned char #define uint un...
FFT算法研究及基2-FFT算法的C语言实现
FFT算法研究及基2-FFT算法的C语言实现 - 毕业设计 [ 论文] 题学专姓学 目:FFT 算法研究及基 2-FFT 算法的 C 语言实现 院: 业: 名: 号: 电气与...
C语言实现FFT(快速傅里叶变换)
C语言实现FFT(快速傅里叶变换)_数学_自然科学_专业资料 暂无评价|0人阅读|0次下载|举报文档 C语言实现FFT(快速傅里叶变换)_数学_自然科学_专业资料。#include ...
C语言实现FFT(快速傅里叶变换)
C语言实现FFT(快速傅里叶变换)_信息与通信_工程科技_专业资料。C语言实现FFT(快速傅里叶变换) #include <iom128.h> #include <intrinsics.h> /*** 快速福利...
C语言实现FFT
C语言实现FFT - #include myapp.h #include ICETEK-VC5509-EDU.h #include scancode.h #include <math.h> #d...
CCS上FFT的C语言实现
CCS上FFT的C语言实现 - 从两个文件分别读入复数的实部和虚部,然后进行FFT运算。... CCS上FFT的C语言实现_电脑基础知识_IT/计算机_专业资料。从两个文件分别读入复...
快速傅里叶变换FFT的C语言实现及应用
快速傅里叶变换 FFTC 语言实现及应用快速傅里叶变换简介计算离散傅里叶变换的一种快速算法,简称 FFT。快速傅里叶变换是 1965 年由 J.W. 库利和 T.W....
更多相关标签: