C55x_Lab_12

  • 格式:pdf
  • 大小:311.63 KB
  • 文档页数:15

DSP程式設計與實驗實驗講義2004 FallLab (12)授課:胡竹生教授2004.12.14Lab-12 FFT 程式與應用練習 1Exp18: FFT 程式與應用練習♦目的瞭解FFT 演算原理來製作濾波器,並練習在C55x 編譯環境中呼叫函式庫以實現之。

♦ 說明下面說明如何製作16-bit fixed-point radix-2 decimation-in-time FFT ,分析N -point DFT 的“放大倍率"如下:N k x Max ek x Max ek x n X N k N k N k Nkn N k Nkn ×≤≤=−=−=∑∑−=−−=−)()()()(1~01~01212ππ因此N -point DFT 從訊號處理的角度而言,其放大倍率為N 。

假設,為使定點數(Fixed Point) 之計算結果不至於溢位,2v N =首先想到的作法是將輸入訊號或係數(即正餘弦函數值)做大小為N 的Scaling ,但是這將導致計算精準度降低或輸入動態範圍(Dynamic Range)縮小;相反地,另一作法是將Scaling Factor N 分散至各項計算中。

以radix-2 decimation-in-time FFT 為例,其計算分成v 個階段,倘若在每個階段除2,則其結果會與Scaled by N 相同,但是其中只犧牲一個位元精準度或輸入動態範圍(約6dB),並與 N 無關。

此外,在C55x 程式撰寫方面,德州儀器(Texas Instruments TM )提供一包含訊號處理及數學運算的函式庫—DSPLIB 。

該函式庫附有許多FFT 相關操作函式且可由C 程式語言呼叫使用之。

如欲對此有更深入的瞭解,請參閱TI 技術手冊“TMS320C55x DSP Library Programmer’s Reference ”。

Lab-12 FFT程式與應用練習 2表18-1 DSPLIB函式庫參數協定表18-2 FFT相關呼叫函式列表Lab-12 FFT程式與應用練習 3表18-3 cfft函式架構及參數意義表18-3所使用的SCALE旗標,其作用在致能本實驗講義一開始所說FFT計算之Scaling功能(如:每個Butterfly層級scaling by 2)。

與cfft( )相類似的為傅立葉反轉函式cifft()。

表18-4 cifft函式架構及參數意義Lab-12 FFT程式與應用練習 4 ♦ 範例程式範例程式說明如何呼叫C55x函式庫製作一FFT濾波器。

函式庫呼叫設定:Step1:在程式起始時,引入dsplib.h檔。

( #include “dsplib.h” )Step2:在CCS主視窗選取Project Build Options路徑,並選擇彈跳視窗左下方「Preprocessor」分類項後,於”Include Search Path”格內鍵入” . ; C:\ti\c5500\dsplib\include”。

Step3:與step2相同視窗,選擇視窗上方「Linker」選項後,於底部”Library Search Path”格內新增”C:\ti\c5500\dsplib”;另外於”Include Libraries”格內新增”dsp5510bslx.lib; 55xdspx.lib”。

note:與dsk5510bslx.lib以”;”分號區隔。

Step4:設定完成,按「確定」。

之後,直接於撰寫之C程式語言中使用函式呼叫即可,如cfft( )、cifft( )…等。

圖18-1 於C程式起始引入dsilib.h檔函式庫Lab-12 FFT程式與應用練習 5圖18-2 CCS編譯環境之鏈結設定Lab-12 FFT程式與應用練習 6FFT動態繪圖設定:Step1:於程式尾端”i=0;” 處,設定Probe-point及Breakpoint。

圖18-3 設定Probe Point及Break PointStep2:輸入訊號繪圖設定。

於CCS主視窗選取「View」 「Graph」 「Time/Frequency..」路徑,修改彈跳視窗內的設定值如下:Start Address:0x000820 (用戶端inputbuf22起始位址)Acquisition Buffer Size:256 (用戶端FFT取樣點數)Index Increament:2Display Data Size:256 (用戶端FFT取樣點數)DSP Data Type:16-bit signed integerStep3:重複step2動作,設定訊號輸出繪圖,但下列兩設定值有異:Start Address:0x000F20 (用戶端temp_result2起始位址)Index Increament:1Lab-12 FFT程式與應用練習7圖18-4 繪圖基本設定Step4:再以上設定皆完成後,回至CCS主視窗選取Debug Animate 路徑(或按F12),程式即開始執行並繪圖。

範例程式:square.asm**************************************************************************** square.asm*--------------------------------------------------------------------------------------* Objective:* 1) Calculate the square of the real and imaginary parts.Lab-12 FFT程式與應用練習8*--------------------------------------------------------------------------------------* By Jwusheng Hu, Tzung-Min Su, Wei-Han Liu, Ming-Chien Tsai* CopyRight 2004/08/03**************************************************************************_square.global.mmregs.data.text.c54cm_off_squareloop:C54CMBCLRFRCTBSETMOV T0,BRC0endblock-1RPTBMPYM *AR0, *AR0, AC0 ; AC0 = square of (*AR0)AMAR *AR0+ ; shift the pointerAC0,-16,AC0SFTSMOV AC0,*AR2+ ; store the resultMPYM *AR1, *AR1, AC0 ; AC0 = (*AR1)^2AMAR *AR1+ ; shift the pointerAC0,-16,AC0SFTSMOV AC0,*AR3+ ; store the resultendblock:RET.endLab-12 FFT程式與應用練習9範例程式:fft.c/*************************************************************************** fft.c*--------------------------------------------------------------------------------------* Objective:* 1) Practice FFT coding and DSPLIB calling.*Graph properties:* Start Address : 0x000F20 (Default temp_result2 address)* Buffer Size : 256 (Default FFT number)* Display Data Size : 256* DSP Data Type : 16-bit signed integer*--------------------------------------------------------------------------------------* By Jwusheng Hu, Tzung-Min Su, Wei-Han Liu, Ming-Chien Tsai* CopyRight 2004/08/03**************************************************************************/#include <stdio.h>#include "fftcfg.h"#include "dsk5510.h"#include "dsk5510_aic23.h"/* Include TMS320vc55x Functions-Library: DSPLIB */#include "dsplib.h"#define fftlength 256/* Codec configuration settings */DSK5510_AIC23_Config config= { /* 0 DSK5510_AIC23_LEFTINVOL : L-line input channel volume */0x001B,/* 1 DSK5510_AIC23_ RIGHTINVOL : R-line input channel volume */ 0x001B,Lab-12 FFT程式與應用練習 10/* 2 DSK5510_AIC23_LEFTHPVOL L-channel headphone volume */ 0x01f9,/* 3 DSK5510_AIC23_RIGHTHPVOL R-channel headphone volume */ 0x01f9,/* 4 DSK5510_AIC23_ANAPATH Analog audio path control */0x0010,/* 5 DSK5510_AIC23_DIGPATH Digital audio path control */0x0000,/* 6 DSK5510_AIC23_POWERDOWN Power down control */0x0000,/* 7 DSK5510_AIC23_DIGIF Digital audio interface format */ 0x0043,/* 8 DSK5510_AIC23_SAMPLERATE Sample rate control * 8KHz */0x008D,/* 9 DSK5510_AIC23_DIGACT Digital interface activation */0x0001};Int16 inputdata1;Int16 inputdata2;Int16 inputbuf1[2*fftlength] , inputbuf11[2*fftlength];Int16 inputbuf2[2*fftlength] , inputbuf22[2*fftlength];Int16 power1[2*fftlength];Int16 power2[2*fftlength];Int16 temp_result1[fftlength];Int16 temp_result2[fftlength];Int16 result1[fftlength];Int16 result2[fftlength];Int16 i,index_sample=0;Int16 tt[1]={26214} , t[1]={0};Lab-12 FFT程式與應用練習11void main(){ DSK5510_AIC23_CodecHandle hCodec;/* Initialize the board support library, must be called first */DSK5510_init();/* Start the codec */hCodec = DSK5510_AIC23_openCodec(0, &config);while(1){ /* Receive a sample from the L-Channel */while(!DSK5510_AIC23_read16(hCodec, &inputdata1));/* Receive a sample from the R-Channel */while(!DSK5510_AIC23_read16(hCodec, &inputdata2));if(index_sample<2*fftlength){ /* store the FFT results */inputbuf1[index_sample]=inputdata1;inputbuf2[index_sample]=inputdata2;/* Backup the FFT results */inputbuf11[index_sample]=inputdata1;inputbuf22[index_sample]=inputdata2;index_sample+=2;}if(index_sample==2*fftlength){/* Call cfft() library function to filter L-Channel */cfft(inputbuf1,fftlength,SCALE);/* Reverse the results because the result of cfftis reserved. */cbrev(inputbuf1,inputbuf1,fftlength);Lab-12 FFT程式與應用練習 12/* R-Channel Processing */cfft(inputbuf2,fftlength,SCALE);cbrev(inputbuf2,inputbuf2,fftlength);/* Square of the Real-part and Imaginary-part */square(inputbuf1,inputbuf2,power1,power2,2*fftlength-1);/* Summation of the Squares */for(i=0;i<fftlength;i++)temp_result1[i]=(power1[2*i]+power1[2*i+1]);{temp_result2[i]=(power2[2*i]+power2[2*i+1]);}index_sample=0;i=0; // exist for break-point setting}}}Lab-12 FFT 程式與應用練習 13Lab 12、快速傅立葉轉換(SFFT)♦ 實驗題目:實作SFFT 濾波器最簡單的方法為使用階數與單一區塊取樣點數相同的FIR 數位濾波器。