⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfft.asm

📁 C50_melp.tar.gz为美军2400bps语音压缩编码算法
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	 LAR     AR4,sin:stage:  ; start of sine in this stage
	 do_btfly num            ; execute ZEROI & 7 times BUTTFLYI
	 BANZ    loop?,*-,ar2    ; repeat loop until ar5==0
	 .endm

laststag .macro  stage,offset
	 LAR     AR1,DATAADD          ; ar1 -> DATA
	 LAR     AR2,DATA:offset:     ; ar2 -> DATA+offset
	 LAR     AR3,cos:stage:       ; start of cosine in stage 'stg'
	 LAR     AR4,sin:stage:       ; start of sine in stage   'stg'
	 do_btfly N/2                 ; execute butterflies (up to 512)
	 .endm



;
; C Context Defines
;

FP      .set    ar0
SP      .set    ar1



	 .sect    ".text"

***
*** CORE BUTTERYFLY SUBROUTINE
***

******************************************************************************
*                                                                            *
*  CORE BUTTERFLY SUBROUTINE                                                 *
*  version 2.00    from Manfred Christ   update: 21. Mar  94                 *
*                                                                            *
*  Definition: ARP -> AR2  (input)  ARP -> AR2      (output)                 *
*                                                                            *
*  Definition: AR1 -> PR   (input)  AR1 -> PR+1     (output)                 *
*  Definition: AR2 -> QR   (input)  AR2 -> QR+1     (output)                 *
*  Definition: AR3 -> Cxxx (input)  AR3 -> Cxxx+1   (output)                 *
*  Definition: AR4 -> Sxxx (input)  AR4 -> Sxxx+1   (output)                 *
*                                                                            *
*  uses index register: INDX=2                                               *
*                                                                            *
*        PR' = (PR+(QR*WR+QI*WI))/2       WR=COS(W)   WI=SIN(W)              *
*        PI' = (PI+(QI*WR-QR*WI))/2                                          *
*        QR' = (PR-(QR*WR+QI*WI))/2                                          *
*        QI' = (PI-(QI*WR-QR*WI))/2                                          *
******************************************************************************

butterfly
	 LACL    #2              ; make it DP-independend
	 SAMM    INDX            ; pmst(indx)=0 INDX=2


;                                              TREG  AR1  AR2  AR3 AR4 ARP
;                                              ----  ---  ---  --- --- ---
  lt    *+,ar3    ;TREG:= QR                    QR   PR   QI    C   S   3
;
  rptb  btflyend-1
  mpy   *,ar2     ;PREG = QR*WR/2               QR   PR   QI    C   S   2
  ltp   *-,ar4    ;ACC  = QR*WR/2               QI   PR   QR    C   S   4
  mpy   *,ar3     ;PREG = QI*WI/2               QI   PR   QR    C   S   3
  mpya  *+,ar2    ;ACC  = (QR*WR+QI*WI)/2       QR   PR   QR    C+1 S   2
;                 ;PREG = QI*WR
  lt    *,ar1     ;TREG = QR                    QR   PR   QR    C+1 S   1
  sacb            ;ACCB = (QR*WR+QI*WI)/2       QR   PR   QR    C+1 S   1
;
  add   *,15      ;ACC  = (PR+(QR*WR+QI*WI))/2  QR   PR   QR    C+1 S   1
  sach  *+,0,ar2  ;PR   = (PR+(QR*WR+QI*WI))/2  QR   PI   QR    C+1 S   2
  sbb             ;ACC  = (PR-(     0     ))/2  QR   PI   QR    C+1 S   2
  sbb             ;ACC  = (PR-(QR*WR+QI*WI))/2  QR   PI   QR    C+1 S   2
  sach  *0+,0,ar1 ;QR   = (PR-(QR*WR+QI*WI))/2  QR   PI   QR+1  C+1 S   1
;
  lac   *,15,ar4  ;ACC  = PI     /PREG=QI*WR    QI   PI   QR+1  C+1 S   4
  mpys  *+,ar2    ;PREG = QR*WI/2               QI   PI   QR+1  C+1 S+1 2
;                 ;ACC  = (PI-QI*WR)/2
  lta   *-        ;ACC  = (PI-(QI*WR-QR*WI))/2  QR1  PI   QI    C+1 S+1 2
  sach  *0+,0,ar1 ;QI   = (PI-(QI*WR-QR*WI))/2  QR1  PI   QI+1  C+1 S+1 1
  neg             ;ACC  =(-PI+(QI*WR-QR*WI))/2  QR1  PI   QI+1  C+1 S+1 1
  add   *,16      ;ACC  = (PI+(QI*WR-QR*WI))/2  QR1  PI   QI+1  C+1 S+1 1
  sach  *+,0,ar3  ;PI   = (PI+(QI*WR-QR*WI))/2  QI   PR+1 QR+1  C+1 S+1 2
btflyend


	 LAMM    AR0             ; pmst(indx)=1  -> ar0 is index
	 SAMM    INDX            ; make macro DP-independend!!! 
	 MAR     *,AR2           ; arp=index
	 MAR     *-              ; correct pointer ar2
	 RETD                    ; delayed return
	 MAR     *0+,AR1         ; AR2 += indx
	 MAR     *0+,AR5         ; AR1 += indx


***
*** COMPLEX FFT ROUTINE
***

_cfft:
;
; Enter Processing Context
;

	 ldp     #0              ; data page pointer

	 clrc    CNF             ; map B0/B1 into DATA
	 setc    SXM             ; enable sign extension mode
	 setc    OVM             ; enable overflow mode

	 opl     #6h,PMST        ; enable NDX,TRM
	
	 sar     FP,saveFP       ; save frame pointer
	 sar     SP,saveSP       ; save stack pointer
	 lamm    INDX            ; save c context
	 sacl    saveIDX         ; save c context

;
; INIT BLOCK B2
;

	 mar    *,ar0            ; point arp to ar0

	 lar     ar0,#TABB
	 lacc    #TABSTRT
	 rpt     #TABLEN-1
	 tblr    *+

;
; INIT TWIDDLE FACTORS
;

	 lar     ar0,#TWID
	 lacc    #TWIDSTRT
	 rpt     #TWIDLEN-1
	 tblr    *+

;
; INIT DATA WORKSPACE
;

	 lar     ar0,DATAADD
	 lacc    #0
	 rpt     #2*N-1
	 sacl    *+

;
; DO BIT REVERSED COPY
;

	 mar     *,ar1           ; point arp to SP
	 sbrk    3               ; position SP at SHIFT arg
	 lacc    *+              ; load SHIFT arg
	 samm    TREG1           ; config SHIFT
	 lacc    *+              ; load COUNT arg
	 sub     #1              ; decrement for loop
	 samm    BRCR            ; config COUNT
	 lar     ar2,*+,ar2      ; load SRC arg, point arp to SRC
	 lar     ar3,DATAADD     ; load DST ptr
	 splk    #N,INDX         ; set index register = N

	 rptb    bitrev_end-1    ; loop
	 lact    *+,ar3          ; load and shift src, point arp to DST
	 nop                     ; eat cycle for rptb
	 sacl    *BR0+,ar2       ; store, point arp to SRC
bitrev_end

;
; Prep for algorithm
;

	 .def   FFTBEG, FFTEND
	 .def   STAGE1, STAGE2, STAGE3
	 .def   STAGE4, STAGE5, STAGE6
	 .def   STAGE7, STAGE8, STAGE9

FFTBEG:
STAGE1:  stdmacro 1,1,255,2    ; FFT CODE for STAGE 1
STAGE2:  stdmacro 2,2,127,4    ; FFT CODE for STAGE 2
STAGE3:  stdmacro 3,4,63,8     ; FFT CODE FOR STAGE 3 / ARP=AR2
STAGE4:  stdmacro 4,8,31,16    ; FFT CODE FOR STAGE 4 / ARP=AR2
STAGE5:  stdmacro 5,16,15,32   ; FFT CODE FOR STAGE 5 / ARP=AR2
STAGE6:  stdmacro 6,32,7,64    ; FFT CODE FOR STAGE 6 / ARP=AR2
STAGE7:  stdmacro 7,64,3,128   ; FFT CODE FOR STAGE 7 / ARP=AR2
STAGE8:  stdmacro 8,128,1,256  ; FFT CODE FOR STAGE 8 / ARP=AR2
STAGE9:  laststag 9,512        ; FFT CODE FOR STAGE 9 / ARP=AR2
FFTEND:

;
; Restore C Context
;

	lar     FP,saveFP       ; recall frame pointer
	lar     SP,saveSP       ; recall stack pointer
	lacc    saveIDX         ; restore c context
	samm    INDX            ; restore c context

	apl     #~6h,PMST       ; disable NDX,TRM
	
	retd                    ; return to caller with delay
	mar     *,SP            ; select stack pointer as current ARP
	clrc    OVM             ; disable saturation mode


	.end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -