freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于dsp數(shù)字信號處理器的快速傅里葉變換程序設(shè)計(jì)(編輯修改稿)

2024-12-13 22:04 本頁面
 

【文章內(nèi)容簡介】 /*開中斷 */ IER |= M_INT14。 // 使能第 14 組中斷( CPU 定時器 2( RTOS))?。? //已經(jīng)定義 define M_INT14 0x2020 。 IER 是 CPU 中斷使能寄存器 EINT。 InitAdc()。 for(。){ //等待 AD 采樣結(jié)束?。?! if (adconvover==1){ //adconvover==1 表示 AD 采樣 // 結(jié)束!??!見 ad 中斷子程序 for(i=0。i128。i++){ INPUT[i]=Ad_data[i]。} for(i=0。iN。i++) //i128 { fWaveR[i]=INPUT[i]。 fWaveI[i]=。 w[i]=。 } Mum=(int)(+log(N)/log(2))。 //N=2^Mum FFT(fWaveR,fWaveI)。 for(i=0。iN。i++)DATA[i]=w[i]。//功率譜 } adconvover=0。 } } 一般而言,編寫一個能運(yùn)行在操作系統(tǒng)上的程序,都需要一個主函數(shù)。主函數(shù)意味著建立一個獨(dú)立進(jìn)程,且該進(jìn)程成為了程序的入口,對其它各快速傅里葉變換程序設(shè)計(jì) 10 函數(shù)進(jìn)行調(diào)用,當(dāng)然其它被調(diào)用函數(shù)也可以再去調(diào)用更多函數(shù),這樣整個程序的運(yùn)行軌跡就像一種棧,有時我們稱之為調(diào)用棧。 主函數(shù)既是程序的入口,又是程序的出口 。 由于主函數(shù)肩負(fù)著入口和出口的重任,所以最好不要把太多的細(xì)節(jié)方面的邏輯直接放在主函數(shù)內(nèi),這樣不利于維護(hù)和擴(kuò)展。主函數(shù)應(yīng)該盡量簡潔,具體的實(shí)現(xiàn)細(xì)節(jié)應(yīng)該封裝到被調(diào)用的子函數(shù)里面去。 在這個主程序中,可以調(diào)用后續(xù)的 FFT 初始化函數(shù)程序,時間抽取法 FFT程序,以及倒序運(yùn)算函數(shù)程序,是整個程序的中轉(zhuǎn)站。 旋轉(zhuǎn)因子的軟件實(shí)現(xiàn) for(m=1。m=Mum。m++) { B=(int)(pow(2,m1)+)。 //B=2^(m1) for(j=0。jB。j++) //每級需要進(jìn)行 B種蝶 形運(yùn)算 {S=j*(int)(pow(2,Mumm)+)。 for(k=j。k=N1。k+=(int)(pow(2,m)+)) { X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S]。//采用循環(huán)尋址方式對正弦 Y=Xi[k+B]*cos_tab[S]Xr[k+B]*sin_tab[S]。//表和余弦表進(jìn)行尋址 Xr[k+B]=Xr[k]X。 Xi[k+B]=Xi[k]Y。 Xr[k]=Xr[k]+X。 Xi[k]=Xi[k]+Y。 } } } 旋轉(zhuǎn)因子是復(fù)數(shù),可表示為: 2/ c os ( 2 / ) sin ( 2 / )k j k NNW e k N j k N? ???? ? ? ( 41) 由式( 41)可以看出旋轉(zhuǎn)因子的實(shí)部為余弦函數(shù),虛部為正弦函數(shù)。為了獲得FFT 運(yùn)算中需要的全部旋轉(zhuǎn)因子,需要分別存儲正弦表和余弦表,且每個表長度為 N ,對應(yīng)于 0176。~ 180176。,同時,采用循環(huán)尋址方式對正弦表和余弦表進(jìn)行尋址。 FFT 初始化 void InitForFFT() //FFT 初始化函數(shù),建立正余弦函數(shù)表 { int i。 for(i=0。iN。i++) 快速傅里葉變換程序設(shè)計(jì) 11 { sin_tab[i]=sin(PI*2*i/N)。//建立正余弦函數(shù)表 cos_tab[i]=cos(PI*2*i/N)。 } } 為了獲得 FFT 運(yùn)算中需要的全部旋轉(zhuǎn)因子,需要分別存儲正弦表和余弦表,且每個表長度為 N ,對應(yīng)于 0176?!?180176。 按時間抽取法的 FFT 程序 void FFT(float Xr[N],float Xi[N]) //時間抽取法 FFT 程序,要求采樣 //點(diǎn)數(shù) N為 2的整數(shù)冪次方 { //Xr[], Xi[]分別為輸入序列的實(shí) //部和虛部 int S,B。 //S 為旋轉(zhuǎn)因子的冪數(shù), B為蝶形運(yùn)算輸入數(shù)據(jù)的距離,也即各 //旋轉(zhuǎn)因子的個數(shù) int m,j,k。 float X,Y。 finv(N,Xr,Xi)。 //倒序運(yùn)算函數(shù),對輸入序列倒序 for(m=1。m=Mum。m++) { B=(int)(pow(2,m1)+)。 //B=2^(m1) for(j=0。jB。j++) //每級需要進(jìn)行 B種蝶形運(yùn)算 {S=j*(int)(pow(2,Mumm)+)。 for(k=j。k=N1。k+=(int)(pow(2,m)+)) { //結(jié)果的實(shí)部和虛部分別存儲在原實(shí)部和虛部位置 X=Xr[k+B]*cos_tab[S]+Xi[k+B]*sin_tab[S]。 Y=Xi[k+B]*cos_tab[S]Xr[k+B]*sin_tab[S]。 Xr[k+B]=Xr[k]X。 Xi[k+B]=Xi[k]Y。 Xr[k]=Xr[k]+X。 Xi[k]=Xi[k]+Y。 } } } 在這個時間抽取法 FFT 程序中,要求采樣點(diǎn)數(shù) N 為 2 的整數(shù)冪次方,每級需要進(jìn)行 B種蝶形運(yùn)算,每種蝶形運(yùn)算在某一級中需要進(jìn)行 N/pow(2,m)次蝶形運(yùn)算,結(jié)果的實(shí)部和虛部分別存儲在原實(shí)部和虛部位置。 快速傅里葉變換程序設(shè)計(jì) 12 對于任何一個 2的整數(shù)冪 N=2M,總是可以通過 M次分解最后完全成為 2點(diǎn)的DFT 運(yùn)算。這樣的 M次分解,就構(gòu)成從 x(n)到 X(k)的 M 級運(yùn)算過程。從上面的 流圖可看到,每一級運(yùn)算都由 N/2 個蝶形運(yùn)算構(gòu)成。因此每一級運(yùn)算都需要 次 復(fù)乘和 N 次復(fù)加 (每個結(jié)作加、減各一次 ),這樣,經(jīng)過時間抽取后 M級運(yùn)算總共需要的運(yùn)算: 復(fù)乘 復(fù)加 N 當(dāng)然,實(shí)際情況與這個數(shù)字稍有出入,因?yàn)? 這幾個系數(shù)實(shí)際上都不用乘法運(yùn)算,因此在上面 N=8 的例子中,實(shí)際上只有兩個系數(shù) W 及 W 是需要乘法運(yùn)算的。 用時間抽取法所需的計(jì)算量,不論是復(fù)乘還是復(fù)加都與 Nlog2N成正比,而直接運(yùn)算時則與 N2成正比。 例 N=2048, N2=4194304, (N/2)log2N=11264, N2/[(N/2)log2N]=。 FFT顯然要比直接法快得多。 功率譜的計(jì)算實(shí)現(xiàn) for(m=0。mN/2。m++) { w[m]=sqrt(Xr[m]*Xr[m]+Xi[m]*Xi[m])。 //計(jì)算功率譜 } 為了便于觀察 FFT 的運(yùn)算結(jié)果,需要求出信號的頻譜。經(jīng)過第三級到最后一級蝶形運(yùn)算之后,已經(jīng)得到式( 42)所示: ( ) ( ) ( )A k AR k AI k j?? ( 42) 故功率譜可以通過式( 43)計(jì)算得到 : 22( ) ( )AR k AI k? ( 43) 通過軟件仿真,可以觀察到輸入信號的時間波形和頻譜波形以及輸出信號的功率譜波形。 倒序運(yùn)算函數(shù) void finv(int N1,float *xr,float *xi) { int m,n,N2,k。 //m 為正序數(shù); n為倒序數(shù); k 為各個權(quán)值; N2為最高位的權(quán)值 快速傅里葉變換程序設(shè)計(jì) 13 float T。 //臨時變量 T N2=N1/2。 //最高位加 1 相當(dāng)于十進(jìn)制加上最高位的權(quán) N1/2 n=N2。 //第一個倒序值 for(m=1。m=N12。m++) //第 0 個和最后一個不倒序 { if(mn) //為了避免再次調(diào)換,只需對 mn 的部分調(diào)換順序 { T=xr[m]。xr[m]=xr[n]。xr[n]=T。 T=xi[m]。xi[m]=xi[n]。xi[n]=T。 } k=N2。 //最高位權(quán)值 while(n=k) { n=nk。 //次高位位 1,繼續(xù)上下進(jìn)位,滿 2 置 0 k=(int)(k/2+)。 //向下權(quán)值依次比上級減半 } n=n+k。 //得到下一倒序值 } } 倒序運(yùn)算函數(shù) finv( N1,Xr,Xi),對輸入序列倒序, N1 為序列長度, Xr[],Xi[]分別為輸入序列的實(shí)部和虛部。 倒序原理:倒序數(shù)的加 1是在最高位加 1,滿 2向次高位進(jìn) 1,最高位變 0,依次往下。 從當(dāng)前倒序值可求下一倒序值。 定時器 2 中斷子程序及 AD轉(zhuǎn)換子程序 interrupt void ad(void) { IFR=0x0000。 //CPU 級中斷標(biāo)志寄存器 IFR=0,即無 CPU 級中斷請求 =0xffff。//PIEACK 置 1,禁止外部中斷向 CPU 發(fā)起中斷 //請求 if(adconvover==0){ Ad_data[convcount] = 。 // 將結(jié)果寄存器中的 AD //轉(zhuǎn) 換結(jié)果放到 Ad_data 數(shù)組中 convcount++。 //convcount 的初始值為 0 } if (convcount==(128)) //即 convcount=128,即 Ad_data 包含采樣值的最 //后一位為 Ad_data[128] { convcount=0。 adconvover=1。//接滿標(biāo)志 ,即 AD采樣結(jié)束 快速傅里葉變換程序設(shè)計(jì) 14 } } interrupt void ISRTimer2(void) { =1。 //清除 INT SEQ1 標(biāo)志 //位 ,SEQ1 轉(zhuǎn)換結(jié)束時 INT_SEQ1 中斷標(biāo)志位置 1 =1。 //啟動 SEQ1,觸發(fā)模數(shù)轉(zhuǎn)換! } 通過“ ConfigCpuTimer(amp。CpuTimer2, 150, 22)?!痹O(shè)定定時器 2產(chǎn)生中斷的時間。當(dāng)進(jìn)入定時器 2 中斷子程序后,啟動 SEQ1,觸發(fā)模數(shù)轉(zhuǎn)換,進(jìn)入 AD 中斷子程 序。 快速傅里葉變換程序設(shè)計(jì) 15 5 工作過程分析 程序調(diào)試 在 CCS 下調(diào)試程序步驟 ( 1)點(diǎn)擊 CCS 圖標(biāo)啟動 CCS。 ( 2) 打開 工程。將已編好的匯編源文件 及其他相關(guān)源文件和命令文件 等文件添加到工程中編譯,鏈接產(chǎn)生 文件。 ( 3)下載 文件到目標(biāo)板中。 ( 4)顯示示輸入信號的時域波形。首先,通過設(shè)置實(shí)驗(yàn)箱的函數(shù)信號發(fā)生器,使 AD 采集波形為 0通道的標(biāo)準(zhǔn)正弦波。 ( 5) 顯示輸入信號的頻域波形。 ( 6)顯示信號功率譜。由配置文件可知,經(jīng)程序計(jì)算得到的信號功率譜放在 DATA 數(shù)組中。顯示經(jīng)程序計(jì)算得到的信號功率譜。 ( 7)改變輸入信號,如改為方波,三角波等等。并重復(fù)( 4)( 5)( 6)三個步驟。 輸入信號時域波形 當(dāng)輸入信號為正弦波時,其時域波形如圖 所示。 當(dāng)輸入信號為方波時,其時域波形如圖 所示。 當(dāng)輸入信號為三角波時,其時域波形如圖 所示。
點(diǎn)擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1