基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,向前每推進一列,間距減少一半。