基4算法
Ⅰ 求基2、基4、基8FFT(快速傅里叶变换)的c语言程序,要能运行得出来的
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct{
double r;
double i;
}my_complex
;
//检查a是否为2的整数次方数
#define NOT2POW(a) (((a)-1)&(a)||(a)<=0)
//pi
#define MYPI 3.14159265358979323846
my_complex* fft(const my_complex* x, unsigned int len){
unsigned int ex=0,t=len;
unsigned int i,j,k;
my_complex *y;
double tr,ti,rr,ri,yr,yi;
if(NOT2POW(len)) return NULL; //如果失败,返回空指针
for(;!(t&1);t>>=1) ex++; //len应该等于2的ex次方
y=(my_complex*)malloc(len*sizeof(my_complex));
if(!y) return NULL;
//变址计算,库里-图基算法
for(i=0;i<len;i++){
k=i;
j=0;
t=ex;
while((t--)>0){
j<<=1;
j|=k&1;
k>>=1;
}
if(j>=i){
y[i]=x[j];
y[j]=x[i];
}
}
//用变址后的y向量进行计算
for(i=0;i<ex;i++){
t=1<<i;
for(j=0;j<len;j+=t<<1){
for(k=0;k<t;k++){
ti=-MYPI*k/t;
rr=cos(ti);
ri=sin(ti);
tr=y[j+k+t].r;
ti=y[j+k+t].i;
yr=rr*tr-ri*ti;
yi=rr*ti+ri*tr;
tr=y[j+k].r;
ti=y[j+k].i;
y[j+k].r=tr+yr;
y[j+k].i=ti+yi;
y[j+k+t].r=tr-yr;
y[j+k+t].i=ti-yi;
}
}
}
return y;
}
//以下为测试
int main()
{
int i,DATA_LEN;
my_complex *x,*y;
printf("基二FFT测试\n输入生成序列长度:");
scanf("%d",&DATA_LEN);
x=(my_complex*)malloc(DATA_LEN*sizeof(my_complex));
for(i=0;i<DATA_LEN;i++){
x[i].r=i;
x[i].i=i-1;
}
printf("处理前...\n实部\t\t虚部\n");
for(i=0;i<DATA_LEN;i++)
printf("%lf\t%lf\n",x[i].r,x[i].i);
y=fft(x,DATA_LEN);
if(!y){
printf("序列长度不为2的整数次方!\n");
return 0;
}
printf("处理后...\n实部\t\t虚部\n");
for(i=0;i<DATA_LEN;i++)
printf("%lf\t%lf\n",y[i].r,y[i].i);
free(y);
free(x);
return 0;
}
Ⅱ audition中的FFT大小到底啥意思
FFT是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换。
此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。它们的共同特点是,当N是素数时,可以将DFT算转化为求循环卷积,从而更进一步减少乘法次数,提高速度。
(2)基4算法扩展阅读:
在这些算法中,基2算法用得最普遍。通常按序列在时域或在频域分解过程的不同,又可分为两种:一种是时间抽取FFT算法(DIT),将N点DFT输入序列x(n)、在时域分解成2个N/2点序列而x1(n)和x2(n)。前者是从原序列中按偶数序号抽取而成,而后者则按奇数序号抽取而成。DIT就是这样有规律地按奇、偶次序逐次进行分解所构成的一种快速算法。
分裂基算法(RSFFT) 1984年由P.杜哈美尔和H.赫尔曼等导出的一种比库利图基算法更加有效的改进算法,其基本思想是在变换式的偶部采用基2算法,在变换式的奇部采用基4算法。优点是具有相对简单的结构,非常适用于实对称数据,对长度N=2能获得最少的运算量(乘法和加法),所以是选用固定基算法中的一种最佳折衷算法。
Ⅲ 蝶形运算的基本介绍
1. 2点DFT运算称为蝶形运算,而整个FFT就是由若干级迭代的蝶形运算组成,而且这种算法采用原位运算,故只需N个存储单元2. ∑∑(2)式(2)是FFT基4频域抽取算法的基本运算单元,一般称为蝶形运算.下一步再将X(4m+i),i=0,1,2,3分解成4个N42序列,迭代r次后完成计算,整个算法的复杂度减少为O(Nlog4N)
第一列蝶形运算只有一种类型:系数,参加运算的两个数据点间距为1。第二列有两种类型的蝶形运算:系数分别为 ,参加蝶形运算的两个数据点的间距等于2。第三列有4种类型的蝶形运算:系数分别是 ,参加蝶形运算的两个数据点的间距等于4。可见,每一列的蝶形类型比前一列增加一倍,参加蝶形运算的两个数据点的间距也增大一倍,最后一列系数用得最多,为4个,即 ,而前一列只用到它偶序号的那一半,即,第一列只有一个系数,即。
上诉结论可以推广到N=的一般情况,规律是第一列只有一种类型的蝶形运算,系数是 ,以后每列的蝶形类型,比前一列增加一倍,到第是N/2个蝶形类型,系数是,共N/2个。由后向前每推进一列,则用上述系数中偶数序号的那一半,例如第列的系数则为参加蝶形运算的两个数据点的间距,则是最末一级最大,其值为N/2,向前每推进一列,间距减少一半。