当前位置:首页 >> 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; }


赞助商链接
相关文章:
FFT用C语言实现
FFTC语言实现_电子/电路_工程科技_专业资料 暂无评价|0人阅读|0次下载|举报文档 FFTC语言实现_电子/电路_工程科技_专业资料。#include<stc12c5a60s2.h>...
C语言实现FFT变换
C语言实现FFT变换_计算机软件及应用_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 C语言实现FFT变换_计算机软件及应用_IT/计算机_专业资料。#include <...
用C语言编写FFT算法
C语言编写FFT算法_数学_自然科学_专业资料。用 C 语言编写 FFT 算法 用 simulink 建模的方法实现 FFT 的问题特别多,还不如手工编写,也不是很复杂。 以下是 ...
实序列FFT算法的C语言实现
实序列FFT算法的C语言实现_数学_自然科学_专业资料 暂无评价|0人阅读|0次下载|举报文档 实序列FFT算法的C语言实现_数学_自然科学_专业资料。...
用c语言实现的FFT
c语言实现的FFT - 一、对 FFT 的介绍 1. FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散 傅里叶变换的快速算法,它是根据离散傅里叶变换...
FFT的C语言算法实现
FFT的C语言算法实现_信息与通信_工程科技_专业资料。一个用C语言写的简易的FFT的算法,FFT 的 C 语言算法实现程序如下: /***FFT***/ #include <stdio.h> ...
C语言实现FFT(快速傅里叶变换)
C语言实现FFT(快速傅里叶变换)_信息与通信_工程科技_专业资料。C语言实现FFT(快速傅里叶变换) #include <iom128.h> #include <intrinsics.h> /*** 快速福利...
C语言实现FFT
FFT_N 128 //定义福利叶变换的点数 struct compx {float real,imag;}; //...C语言及Matlab实现fft 6页 免费 C语言写的FFT代码 4页 免费 DSP课程设计-...
C语言FFT
C语言FFT程序 5页 2下载券 C语言写的FFT代码 4页 免费 FFT算法研究与实现(C语言... 3页 1下载券 FFT的C语言算法实现 4页 免费 FFT的c语言实现编程 6页...
FFT的C语言编程
C语言写的FFT代码 4页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 FFT的C语言编程 如题如题隐藏>> FFT 的 ...
更多相关标签: