快速傅立叶c语言函数
求基2、基4、基8FFT(快速傅里叶变换)的c语言程序,要能运行得出来的
①FFT://?data为输入和输出的数据,N为长度
bool?CFFT::Forward(complex?*const?Data,?const?unsigned?int?N)
{
if?(!Data?||?N?1?||?N?(N?-?1))
?return?false;
//?排序
Rearrange(Data,?N);
//?FFT计算:const?bool?Inverse?=?false
Perform(Data,?N);
return?true;
}
//?Scale?为是否缩放
bool?CFFT::Inverse(complex?*const?Data,?const?unsigned?int?N,
const?bool?Scale?/*?=?true?*/)
//?FFT计算,ture表示是逆运算
Perform(Data,?N,?true);
//?对结果进行缩放
if?(Scale)
?CFFT::Scale(Data,?N);
void?CFFT::Rearrange(complex?*const?Data,?const?unsigned?int?N)
//?Swap?position
unsigned?int?Target?=?0;
//?Process?all?positions?of?input?signal
for?(unsigned?int?Position?=?0;?Position?N;?++Position)
?//?Only?for?not?yet?swapped?entries
?if?(Target?Position)
?{
?//?Swap?entries
?const?complex?Temp(Data[Target]);
?Data[Target]?=?Data[Position];
?Data[Position]?=?Temp;
?}
?//?Bit?mask
?unsigned?int?Mask?=?N;
?//?While?bit?is?set
?while?(Target?(Mask?=?1))
?//?Drop?bit
?Target?=?~Mask;
?//?The?current?bit?is?0?-?set?it
?Target?|=?Mask;
void?CFFT::Perform(complex?*const?Data,?const?unsigned?int?N,
const?bool?Inverse?/*?=?false?*/)
//?Iteration?through?dyads,?quadruples,?octads?and?so?on...
for?(unsigned?int?Step?=?1;?Step?N;?Step?=?1)
?//?Jump?to?the?next?entry?of?the?same?transform?factor
?const?unsigned?int?Jump?=?Step?1;
?//?Angle?increment
?const?double?delta?=?pi?/?double(Step);
?//?Multiplier?for?trigonometric?recurrence
?//?Start?value?for?transform?factor,?fi?=?0
?complex?Factor(1.);
?//?Iteration?through?groups?of?different?transform?factor
?for?(unsigned?int?Group?=?0;?Group?Step;?++Group)
?//?Iteration?within?group?
?for?(unsigned?int?Pair?=?Group;?Pair?N;?Pair?+=?Jump)
?{
??//?Match?position
??const?unsigned?int?Match?=?Pair?+?Step;
??//?Second?term?of?two-point?transform
??const?complex?Product(Factor?*?Data[Match]);
??//?Transform?for?fi?+?pi
??Data[Match]?=?Data[Pair]?-?Product;
??//?Transform?for?fi
??Data[Pair]?+=?Product;
?}
?//?Successive?transform?factor?via?trigonometric?recurrence
?Factor?=?Multiplier?*?Factor?+?Factor;
void?CFFT::Scale(complex?*const?Data,?const?unsigned?int?N)
const?double?Factor?=?1.?/?double(N);
//?Scale?all?data?entries
?Data[Position]?*=?Factor;
一个关于128点的快速傅立叶的C语言程序
double
B[1100]={0};
改成
void
FFT(double
data[],
int
nn,
isign)
具体程序如下:
#include
iostream.h
"math.h"
#includestdio.h
#includestring.h
stdlib.h
fstream.h
afx.h
//复数的快速傅里叶变换
n,j,i,m,mmax,istep;
tempr,tempi,theta,wpr,wpi,wr,wi,wtemp;
n
=
*
nn;
j
for
(i
i=n
;
//这个循环进行的是码位倒置.
if(
i)
tempr
data[j];
tempi
data[j
+
①.];
data[j]
data[i];
data[i
data[i]
tempr;
tempi;
m
/
while
(m
m)
-
m;
mmax
while(
)
istep
mmax;
theta
(isign
mmax);
wpr
theta);
wpi
sin(theta);
wr
①0;wi
0.0;
for(
m=mmax;
i=n;
i=i+istep)
i
tempr=double(wr)*data[j]-double(wi)*data[j+1];//这两句表示蝶形因子的下一个数乘以W因子所得的实部和虚部.
tempi=double(wr)*data[j+1]+double(wi)*data[j];
//蝶形单元计算后下面单元的实部,下面为虚部,注意其变换之后的数组序号与书上蝶形单元是一致的
wtemp
wr;
wi;
istep;
main()
//本程序已经和MATLAB运算结果对比,准确无误,需要注意的的是,计算中数组都是从1开始取得,丢弃了A[0]等数据
char
ij;
CString
ij=1;
其中的数据格式见该文件
FILE
*fp
if(!fp)
cout"Open
file
is
failing!"endl;
return;
while(!feof(fp))
//feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0.
//清空为0
//函数的功能是从fp所指文件中读入n-1个字符放入line为起始地址的空间内
sscanf(line,
"%s%s",
dataA,
dataB);
//dataA读入第一列,dataB读入第二列
B[ij]=atof(dataA);
//将字符型的dataA值转化为float型
ij++;
(int
//*******************************************正式计算FFT
//********************************************写入数据到workout.txt文件中
*pFile=fopen("workout.txt","a+");
//?a+只能在文件最后补充,光标在结尾.没有则创建
if
(A[k+1]=0)
else
strl1=strlen(str1);
//
用
法:fwrite(buffer,size,count,fp);
buffer:是一个指针,对fwrite来说,是要输出数据的地址.
size:要写入的字节数;
count:要进行写入size字节的数据项的个数;
fp:目标文件指针.
fwrite(str1,1,strl1,pFile);
fclose(pFile);
cout"计算完毕,到fft_test\workout.txt查看结果"endl;
快速傅立叶变换在c中怎么实现?
快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的.它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步.
傅里叶变换(Transformée de Fourier)是一种积分变换.因其基本思想首先由法国学者傅里叶系统地提出,所以以其名字来命名以示纪念.
应用
傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用(例如在信号处理中,傅里叶变换的典型用途是将信号分解成幅值分量和频率分量).
概要介绍
傅里叶变换属于谐波分析.
傅里叶变换的逆变换容易求出,而且形式与正变换非常类似;
正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;
卷积定理指出:傅里叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;
离散形式的傅里叶变换可以利用数字计算机快速的算出(其算法称为快速傅里叶变换算法(FFT)).
以上就是思力网小编为大家整理的快速傅立叶c语言函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!
