2023年12月10日發(作者:生態文明校園)

《DSP原理及應用》――FIR濾波器的C54X實現
一、 實驗目的
用matlab獲得FIR濾波器的抽頭系數,用匯編語言實現FIR濾波器。產生一混頻信號,用所設計的濾波器進行濾波,查看濾波器輸出。
二、實驗儀器
1.PC一臺(win7系統);
2.Code Compor Studio 3.1 軟件;
3.MATLAB 2009;
4.Dev C++ 6.0 軟件。
三、實驗要求
1.設計一個FIR低通濾波器,通帶邊界頻率為2500Hz,通帶波紋小于1dB;阻帶邊界頻率為3000Hz,阻帶衰減大于40dB;采樣頻率為10000Hz。
2.設計一個采樣頻率Fs為10000Hz,輸入信號頻率為2000Hz和3250Hz的合成信號,通過設計的低通濾波器將3250Hz信號濾掉,余下2000Hz信號。
3.用循環緩沖區和雙操作數尋址方法編寫實現FIR濾波的程序。
四、實驗原理
如果FIR 濾波器的沖激響應為h(0),h(1), ...,h(N-1)。X(n)表示濾波器在n 時刻的輸入,則n 時刻的輸出為:
y(n) = h(0)x(n) + h(1)x(n-1) + ... + h(N-1)x[n-(N-1)]
使用MAC 或FIRS 指令可以方便地實現上面的計算。
圖1 說明了使用循環尋址實現FIR 濾波器的方法。為了能正確使用循環尋址,必須先初始化BK,塊長為N。同時,數據緩沖區和沖激響應(FIR 濾波器的系數)的開始地址必須是大于N
的2 的最小冪的倍數。例如,N=11,大于N 的最小2 的冪為16,那么數據緩沖區的第一個地址應是16 的倍數,因此循環緩沖區起始地址的最低4 位必須是0。
在圖1 中,濾波系數指針初始化時指向h(N-1),經過一次FIR 濾波計算后,在循環尋址的作用下,仍然指向h(N-1)。而數據緩沖區指針指向的是需要更新的數據,如x(n)。在寫入新數據并完成FIR 運算后,該指針指向x(n-(N-1))。所以,使用循環尋址可以方便地完成濾波窗口數據的自動更新。
五、實驗內容及步驟
1.FIR濾波器的設計
FIR濾波器的設計可以用MATLAB軟件的窗函數法進行,這里選擇Hamming窗,程序為:
b=fir1(16,1500/8000*2)
得到FIR數字濾波器系數b為:
b0 = 0 b9 = 0.2834
b1 = 0.0048 b10 = 0.0973
b2 = 0.008 b11 = -0.029
b3 = -0.0089 b12 = -0.0429
b4 = -0.0429 b13 = -0.0089
b5 = -0.029 b14 = 0.008
b6 = 0.0973 b15 = 0.0048
b7 = 0.2834 b16 = 0
b8 = 0.3745
在DSP匯編語言中,不能直接輸入十進制小數,在MATLAB中進行如下轉換:
h=round(b*2^15)
將系數轉換為Q15的定點小數形式,為:
h0 = 0 h9 = 9287
h1 = 158 h10 = 3187
h2 = 264 h11 = -951
h3 = -290 h12 = -1406
h4 = -1406 h13 = -290
h5 = -951 h14 = 264
h6 = 3187 h15 = 158
h7 = 9287 h16 = 0
h8 = 12272
2.產生濾波器輸入信號文件
以下是一個產生輸入信號的C語言程序,信號是頻率為1000Hz和2500Hz的正弦波合成的波形。文件名為firinput.c 。
#include
#include
void main()
{
int i;
double f[256];
FILE *fp;
if((fp=fopen("","wt"))==NULL)
{
printf("can't open file! n");
return;
} for(i=0;i<256;i++)
{
f[i]=sin(2*3.14159*i*1000/8000)+sin(2*3.14159*i*2500/8000);
fprintf(fp," .word %ldn",(long)(f[i]*32768/2));
}
fclo(fp);
}
該程序產生名為 的輸入信號程序。文件的部分內容如下:
.word 0
.word 26722
.word 4798
.word 5315
.word 16384
:
:
.word -5319
.word -4793
.word -26721
在DSP匯編語言程序中通過.copy匯編命令將生成的數據文件 復制到匯編程序中,作為FIR濾波器的輸入數據。
3.編寫FIR數字濾波器的匯編源程序
FIR數字濾波器匯編程序如下:
.mmregs
.global start
.def start,_c_int00
INDEX .t 1
KS .t 256 ;模擬輸入數據緩沖區大小
N .t 17
COFF_FIR .ct "COFF_FIR" ;FIR濾波器系數
.word 0
.word 158
.word 264
.word -290
.word -1406
.word -951
.word 3187
.word 9287
.word 12272
.word 9287
.word 3187
.word -951
.word -1406 .word -290
.word 260
.word 158
.word 0
.data
INPUT .copy "" ;模擬輸入在數據存儲區0x2400
OUTPUT .space 1024 ;輸出數據在數據區0x2500
COFFTAB .uct "FIR_COFF",N
DATABUF .uct "FIR_BFR",N
BOS .uct "STACK",0Fh
TOS .uct "STACK",1
.text
.asg AR0,INDEX_P
.asg AR4,DATA_P ;輸入數據x(n)循環緩沖區指針
.asg AR5,COFF_P ;FIR系數表指針
.asg AR6,INBUF_P ;模擬輸入數據指針
.asg AR7,OUTBUF_P;FIR濾波器輸出數據指針
_c_int00
b start
nop
nop
start: ssbx FRCT
STM #COFFTAB,COFF_P
RPT #N-1 ;將FIR系數從程序存儲器移動
MVPD #COFF_FIR,*COFF_P+ ;到數據存儲器
STM #INDEX,INDEX_P
STM #DATABUF,DATA_P
RPTZ A,#N-1
STL A,*DATA_P+ ;將數據循環緩沖區清零
STM #(DATABUF+N-1),DATA_P ;數據緩沖區指針指向x[n-(N-1)]
STM #COFFTAB,COFF_P
FIR_TASK:
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
STM #KS-1,BRC
RPTBD LOOP-1
STM #N,BK ;FIR循環緩沖區大小
LD *INBUF_P+,A ;裝載輸入數據
FIR_FILTER:
STL A,*DATA_P+%
RPTZ A,N-1 MAC *DATA_P+0%,*COFF_P+0%,A
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
4.編寫FIR濾波器鏈接命令文件
對應以上匯編程序的鏈接命令文件如下:
-m
-o
MEMORY
{
PAGE 0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100H
PAGE 1: INTRAM1(RW) :ORIGIN=2400H,LENGTH=0200H
INTRAM2(RW) :ORIGIN=2600H,LENGTH=0100H
INTRAM3(RW) :ORIGIN=2700H,LENGTH=0100H
B2B(RW) :ORIGIN=0070H,LENGTH=10H
}
SECTIONS
{
.text : {}>ROM1 PAGE 0
.data : {}>INTRAM1 PAGE 1
FIR_COFF: {}>INTRAM2 PAGE 1
FIR_BFR : {}>INTRAM3 PAGE 1
STACK : {}>B2B PAGE 1
}
5.在Code Compor Studio 3.1 軟件中將有關程序運行并調試。
六、實驗結果及分析
1.觀察輸入信號的波形,如圖2所示。
2.觀察輸入信號的頻譜,如圖3所示。
3.觀察輸出信號的波形,如圖4所示。
4.觀察輸出信號的頻譜,如圖5所示。
七、實驗總結
這次實驗完成了FIR濾波器在DSP上仿真實現,對FIR濾波器有更深入的了解,進一步掌握對CCS軟件的使用方法,鞏固了對DSP匯編語言的理解,對以后深入學習有很大幫助。
本文發布于:2023-12-10 23:11:11,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1702221071117651.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:FIR CCS 實驗報告.doc
本文 PDF 下載地址:FIR CCS 實驗報告.pdf
| 留言與評論(共有 0 條評論) |