FFT快速傅立叶算法纯C语言版本

原创 2015年07月08日 16:03:33
</pre><p>快速离散傅立叶变换FFT利用DFT计算的对称性实现的,具体的介绍网上一大堆。这次自己写了个定点FFT头文件,直接用C语言写的很容易移植。</p><p></p><p><pre name="code" class="cpp">/*
     快速离散傅立叶算法V1.0
	   含有:FFT,IFFT
         made by xyt
		  2015/7/8
		   C语言
*/
#ifndef _FFT_H
#define _FFT_H
#include<math.h>

#define FFT_N 8  //点数,要求2的次方

#define PI 3.14159265354
struct fft_complex{
	double r,i;
};
int fft_fi(double in){  //四舍五入转整
	if((in-(int)in)>0.5) return (int)in+1;
	else return (int)in;
}
int fft_fac2(int n){   //返回log2(n)
	int count=0;
	while(n/2!=0){
		n/=2;count++;
	}
	return count;
}
int fft_turndat(int n,int num){ 
	int g=n,m,r=0;
	int count=0;
	while(num/2!=0){
		num/=2;count++;
	} 
	while(count>=0){
		m=g%2;
		r+=m*pow(2,--count);
		g/=2;
	}
	return r;
}
fft_complex fft_t(fft_complex a){
	fft_complex tmp;
	tmp.i=-1*a.i;
	tmp.r=-1*a.r;
	return tmp;
}
fft_complex fft_multi(fft_complex a,fft_complex b){
	fft_complex tmp;
	tmp.r=a.r*b.r-a.i*b.i;
	tmp.i=a.r*b.i+a.i*b.r;
	return tmp;
}
fft_complex fft_add(fft_complex a,fft_complex b){
	fft_complex tmp;
	tmp.r=a.r+b.r;
	tmp.i=a.i+b.i;
	return tmp;
}
/* 定点FFT,返回两个double型数组分别是实部和虚部 */
void FFT(int *in,double *outr,double *outi) 
{
	int i,j;
	int deep;
	const int N=FFT_N/2;
	fft_complex W[N];
	W[0].r=1;W[0].i=0;
	W[1].r=cos(2.0*PI/FFT_N);
	W[1].i=sin(2.0*PI/FFT_N);
	for(i=2;i<N;i++){
		W[i]=fft_multi(W[1],W[i-1]);
	}
	deep=fft_fac2(FFT_N);
	int g=1;
	int ne=0,ge=0;

	fft_complex left[FFT_N];
	fft_complex right[FFT_N];
	for(i=0;i<FFT_N;i++){
		left[i].r=in[fft_turndat(i,FFT_N)];
		left[i].i=0;
	}
	fft_complex tpp;
	int mggtmp;
	while(1)
	{
		if(deep==0) break;
		int adt=pow(2,deep-1);
		mggtmp=pow(2,g);
		for(i=0;i<FFT_N;i+=mggtmp){ 
			ne=0;ge=0;
			for(j=0;j<mggtmp;j++){
				if(j<mggtmp/2){
					tpp=fft_multi(left[i+j+mggtmp/2],W[ne]);
					right[i+j]=fft_add(left[i+j],tpp);ne+=adt;
				}else{
					tpp=fft_t(fft_multi(left[i+j],W[ge]));
					right[i+j]=fft_add(left[i+j-mggtmp/2],tpp);ge+=adt;
				}
			}
		}
		for(i=0;i<FFT_N;i++){
			left[i]=right[i];
		}
		deep--;g++;
	}
	for(i=0;i<FFT_N;i++){
		outr[i]=left[i].r;
		outi[i]=-1*left[i].i;
	}
}
/* 定点IFFT,输入实部和虚部,返回时域int类型 */
void IFFT(double *inr,double *ini,int *out) 
{
	int i,j;
	int deep;
	const int N=FFT_N/2;
	fft_complex W[N];
	W[0].r=1;W[0].i=0;
	W[1].r=cos(2.0*PI/FFT_N);
	W[1].i=-1*sin(2.0*PI/FFT_N);
	for(i=2;i<N;i++){
		W[i]=fft_multi(W[1],W[i-1]);
	}
	deep=fft_fac2(FFT_N);
	int g=1;
	int ne=0,ge=0;

	fft_complex left[FFT_N];
	fft_complex right[FFT_N];
	for(i=0;i<FFT_N;i++){
		left[i].r=inr[fft_turndat(i,FFT_N)];
		left[i].i=-1*ini[fft_turndat(i,FFT_N)];
	}
	fft_complex tpp;
	int mggtmp;
	while(1)
	{
		if(deep==0) break;
		int adt=pow(2,deep-1);
		mggtmp=pow(2,g);
		for(i=0;i<FFT_N;i+=mggtmp){ 
			ne=0;ge=0;
			for(j=0;j<mggtmp;j++){
				if(j<mggtmp/2){
					tpp=fft_multi(left[i+j+mggtmp/2],W[ne]);
					right[i+j]=fft_add(left[i+j],tpp);ne+=adt;
				}else{
					tpp=fft_t(fft_multi(left[i+j],W[ge]));
					right[i+j]=fft_add(left[i+j-mggtmp/2],tpp);ge+=adt;
				}
			}
		}
		for(i=0;i<FFT_N;i++){
			left[i]=right[i];
		}
		deep--;g++;
	}
	for(i=0;i<FFT_N;i++){
		out[i]=fft_fi(left[i].r/FFT_N);
	}
}
#endif



版权声明:本文为博主原创文章,未经博主允许不得转载。

FFT算法理解与c语言的实现

FFT算法分析与c语言实现

FFT快速算法及C语言实现

在word上编辑的文本,上传时发现公式传不上来,我又懒得再敲一遍,截个图传上来。...

用c语言实现的FFT

一、对FFT的介绍 1. FFT(Fast Fourier Transformation),即为快速傅里叶变换,是离散傅里叶变换的快速算法,它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变...

网上找的纯C实现的FFT,与matlab计算结果完全一样

直接上代码了 fft.c
  • cp1300
  • cp1300
  • 2014年06月06日 08:20
  • 19056

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

快速傅立叶变换(FFT)C语言函数

/********************************************************************* 快速福利叶变换C函数 函数简介:此函数是通用的快速...

FFT的详细解释,通俗易懂

看到的跟大家分享一 本文转自  http://www.ilovematlab.cn/thread-119939-1-1.html FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号...
  • FjunT
  • FjunT
  • 2015年11月25日 13:53
  • 2457

浅谈Matlab中的快速傅里叶变换(fft)

对Matlab中fft计算式作了简要介绍,并给出了实际频率值的计算公式

FFT快速傅立叶算法纯C语言版本【转】

来自:http://blog.csdn.net/calcular/article/details/46804643 快速离散傅立叶变换FFT利用DFT计算的对称性实现的,具体的介绍网上一大堆。这次自...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FFT快速傅立叶算法纯C语言版本
举报原因:
原因补充:

(最多只允许输入30个字)