c语言中fretb1,急求一篇 用DSP汇编语言或C语言实现 有限冲击响应FIR滤波器的设计 的程序 重谢!!!...

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

hbylicf3

2014.09.05

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:42%    等级:8

已帮助:309人

.mmregs

; Far-mode adjustment

; -------------------

.if __far_mode

OFFSET .set 2

.else

OFFSET .set 1

.endif

FRAME_SZ .set 1

REG_SAVE_SZ .set 2

PARAM_OFFSET .set FRAME_SZ + REG_SAVE_SZ + OFFSET

; Register usage

; --------------

.asg 0 + FRAME_SZ, SAVE_AR1

.asg 0 + REG_SAVE_SZ + FRAME_SZ, RETURN_ADDR

.asg 0 + PARAM_OFFSET, h

.asg 1 + PARAM_OFFSET, r

.asg 2 + PARAM_OFFSET, db

.asg 3 + PARAM_OFFSET, nh

.asg 4 + PARAM_OFFSET, nx

.asg 0, nc

.asg AR2, r_ptr

.asg AR3, h_ptr

.asg AR4, x_ptr

.asg AR5, db_ptr

.asg BRC, rptb_cnt

;**************************************************************************

.global _fir

_fir

PSHM ST0 ; 1 cycle

PSHM ST1 ; 1 cycle

RSBX OVA ; 1 cycle

RSBX OVB ; 1 cycle

;

; Save contents of AR1

; And establish local frame

; Set sign extension mode

; Set FRCT bit:

;----------------------------------------------------------------

FRAME #-(FRAME_SZ) ; 1 cycle

SSBX SXM ; 1 cycle

SSBX FRCT ; 1 cycle

;

; Copy arguments to their local locations as necessary

;----------------------------------------------------------------

STLM A, x_ptr ; 1 cycle

MVDK *sp(h), h_ptr ; 2 cycles

MVDK *sp(r), r_ptr ; 2 cycles

MVDK *sp(db), db_ptr ; 2 cycles

;

; Set outer loop count by subtracting 1 from nsamps and

; storing into block repeat count register

;----------------------------------------------------------------

LD *sp(nx), A ; 1 cycle

SUB #1, A ; 2 cycles

STLM A, rptb_cnt ; 1 cycle

;

; Set pointer to delay buffer

;----------------------------------------------------------------

LD *db_ptr, A ; 1 cycle

STLM A, db_ptr ; 1 cycle

;

; Store length of coefficient vector/ delay buffer in BK

; register

;----------------------------------------------------------------

LD *sp(nh), A ; 1 cycle

STLM A, BK ; 1 cycle

SUB #3, A ; 2 cycles

STL A, *sp(nc) ; 1 cycle

;

; Begin outer loop on # samples

;----------------------------------------------------------------

_start:

RPTBD END_LOOP - 1 ; 2 cycles

;

; Store 0 to AR0, to use as circular addressing offset

;----------------------------------------------------------------

STM #1, AR0 ; delay slot; 2 cycles

;

; Zero the accumulator before calculating next sum.

; Move next input sample into delay buffer

;----------------------------------------------------------------

MVDD *x_ptr+, *db_ptr ; 1 cycles

;

; Sum h * x for next y value

;----------------------------------------------------------------

MPY *h_ptr+0%, *db_ptr+0%, A ; 1 cycle

RPT *sp(nc) ; 2 cycle

MAC *h_ptr+0% , *db_ptr+0%, A ; 1 cycle * ncoeffs-2

MACR *h_ptr+0% , *db_ptr, A ; 1 cycle

;

; Store result

;----------------------------------------------------------------

STH A, *r_ptr+ ; 1 cycle

END_LOOP:

_end:

;

; Reset FRCT bit to restore normal C operating environment

; Return overflow condition, OVA, in accumulator A

; Restore stack to previous value, FRAME, etc..

;----------------------------------------------------------------

RETURN:

LDM db_ptr, B ; 1 cycle

MVDK *sp(db), db_ptr ; 2 cycles

LD #0, A ; 1 cycle

XC 1, AOV ; 1 cycle

LD #1, A ; 1 cycle

FRAME #(FRAME_SZ) ; 1 cycle

POPM ST1 ; 1 cycle

POPM ST0 ; 1 cycle

.if __far_mode

FRETD ; 4 cycles

.else

RETD ; 3.0 cycles

.endif

NOP ; delay slot 1 cycle

STL B, *db_ptr ; delay slot 1 cycle

;END

;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor

10分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值