資源簡介
本人親寫親測的DSP 基2 FFT算法代碼帶詳細注釋,有問題可聯系QQ 179958414。
代碼片段和文件信息
#include?“DSP2833x_Device.h“
#include?“DSP2833x_Examples.h“
#include??
/*********************************************************
傅里葉變換:???????????(?∫為積分符號,從負無窮到正無窮)
F(w)=?????????∫f(t)exp(-i*w*t)dt
f(t)=?(1/2*pi)∫F(w)exp(i*w*t)dw
F(s)=?∫f(t)exp(-i*2*pi*s*t)dt
f(t)=?∫F(s)exp(i*2*pi*s*t)ds
?
離散傅里葉變換(DFT)???(?∑為連加符??WN=exp(-i*2*pi/N))
F(sj)?=?????∑k?Ak*(WN)^(jk)
Ak?=?(1/N)*?j∑?F(sj)*(WN)^(-jk)
Ak=[f(t(k-N))?+?f(tk)]?*?delta_t
delta_t為采樣時域間隔tk=k*delta_t???????????????????????????????
????????delta_s為F(sj)頻譜對應頻率sj的間隔sj=j*delta_s
????????上式中Ak并不是原時序序列,故頻譜也不是頻譜序列,再經變換,可得
F(sj)=(1/N)*∑k?f(tk)WN^(jk)?
f(tk)=??????∑j?F(sj)WN^(-jk)?
???????
????這里f(tk)即為原輸入時間序列,F(sj)為對應頻譜
為了計算方便,假設如下
????????F(j)=?∑k?f(tk)WN^(jk)
????????計算完F(j)后,再乘以(1/N)即得到F(sj)??
???????
*********************************************************/
?
#define?pi?3.141593???????//?float小數點后6位
#define?N_SIGN?512????????//?信號合成和采樣點數直接影響delta_t
#define?N_COMPOUND?10?????//?合成諧波的數量
#define?TIMES_T????10?????//?完整信號周期個數與合成信號頻率無關,只會影響采樣速率和視窗
??????????????????????????//?周期越數越多,采樣速度越低,采樣時域間隔越大。
??//?當采樣速率?f?不滿足奈奎斯特定律(f?>=?2?*?max?frequence?of?signal)時,無法還原
int?N_FFT=N_SIGN;?????????//?FFT點數(頻域和時域點數一樣)
float?input[N_SIGN];??????//?輸入的實信號序列
float?output[N_SIGN];?????//?輸出的實FFT幅值(復數的模)
//合成信號的正弦頻率分布
int?s_compound[10]={135791113151719};??
//合成信號的正弦幅值分布?????
float?Fs_compound[10]={(float)10/(float)1?(float)10/(float)3?(float)10/(float)5
???(float)10/(float)7?(float)10/(float)9?(float)10/(float)11
???(float)10/(float)13(float)10/(float)15(float)10/(float)17
???(float)10/(float)19};???
struct?Complex ??????//?定義復數結構體
{
??? float?realimag;
};
struct?Complex?WNP;???????????????????//?定義蝶形旋轉因子
struct?Complex?WNP_XJB;???????????????//?存放旋轉因子與F(J+B)(即蝶形的下方入口)的乘積
struct?Complex?input_complex[N_SIGN];?//?采樣輸入的實數轉化為復數
/************?????復乘函數??************/
struct?Complex?MUL_Complex(struct?Complex?astruct?Complex?b)
{
??? struct?Complex?c;
??? c.real=a.real*b.real-a.imag*b.imag;
??? c.imag=a.real*b.imag+a.imag*b.real;
??? return(c);
}
/********************************
功能:計算復數的模
形參:*sample指向需要取模的復數結構體
??????N為取模點數
??*output存放取模后數值的數組
*********************************/
void?ModelComplex(struct?Complex?*sampleint?Nfloat?*output)
{
??? int?i;
??? for(i=0;i ????{
output[i]=(float)0;
//?乘2因為正負譜的需要,乘(1/N)是因為要從F(j)求F(sj)F(sj)才為真實的頻譜
???? output[i]=sqrt(sample[i].real*sample[i].real+sample[i].imag*sample[i].imag)*2/N;
}
}
/****************???Cyrus?Cheung的基2FFT算法解析???*************
基2FFT原理:
對于N=2^M個點的FFT,共有L=M級運算,每級有2^(M-1)即N/2個蝶形運算組成;
旋轉因子為WNPWNP=exp(-i*2*pi*p/N);
P=J*2^(M-L)J=01......2^(L-1)-1,即每級有?2^(L-1)個不同的旋轉因子;
對于同一P,參與本級蝶形運算的次數為2^M-L,B=2^(L-1)為同一蝶形的兩輸入點間的距離,即距離B等于不同旋轉因子的個數;
每級第一次調用WNP的蝶形結第一個輸入節點的位置為J第二個輸入節點的位置為J+B=J+2^(L-1);
每級第二次調用WNP的蝶形結第一個輸入節點的位置為J+2^L第
- 上一篇:openmp實現快速排序
- 下一篇:帶服務端的IM即時通訊安卓APP應用
評論
共有 條評論