📄 realfft32b.s
字号:
;*********************************************************************
; *
; Software License Agreement *
; *
; The software supplied herewith by Microchip Technology *
; Incorporated (the "Company") for its dsPIC controller *
; is intended and supplied to you, the Company's customer, *
; for use solely and exclusively on Microchip dsPIC *
; products. The software is owned by the Company and/or its *
; supplier, and is protected under applicable copyright laws. All *
; rights are reserved. Any use in violation of the foregoing *
; restrictions may subject the user to criminal sanctions under *
; applicable laws, as well as to civil liability for the breach of *
; the terms and conditions of this license. *
; *
; THIS SOFTWARE IS PROVIDED IN AN "AS IS" CONDITION. NO *
; WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, *
; BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND *
; FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE *
; COMPANY SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, *
; INCIDENTAL OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. *
; *
; (c) Copyright 2007 Microchip Technology, All rights reserved. *
;*********************************************************************
; Local inclusions.
.nolist
.include "dspcommon.inc" ; MODCON, XBREV
.list
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.section .libdsp, code
.global _realFft32bIP
.equ TF_FFT_SIZE,1024 ; 10stage, 1024 point complex FFT
.equ TF_FFT_STG, 10
.text
;............................................................................
; MERGE ODD/EVEN FFT RESULTS
; W8->(Radd,Isub)
; W9->(Rsub,Iadd)
; W10-> Wr
; W11-> Wi
; W12 -> ACCA
; W13 -> ACCB
; W14 -> FP, First two location used for TEMP
; Equations for Butterfly Computation
; Gr(k)=Radd + (Wr*Iadd - Wi*Rsub)
; Gi(k)=Isub - (Wr*Rsub + Wi*Iadd)
; Gr(N-k)=Radd - (Wr*Iadd - Wi*Rsub)
; Gi(N-k)=-Isub - (Wr*Rsub + Wi*Iadd)
;............................................................................
.macro MERGE_BFLY_MACRO
; Iadd*Wi 32-bit multiplication
MOV.D [w11],W6 ; (w6,w7)=Wi=(y0,y1)
; (w9,w9+1)=Iadd=(x0,x1)
MUL.SU w7,[w9],w0 ; y1*x0
MUL.US w6,[++w9],w2 ; y0*x1
MUL.SS w7,[w9--],w4 ; y1*x1
LAC w3,B
ADD w1,B
SFTAC B,#16 ; B=(y1*x0 + y0*x1)>>16
ADD w4,[w13++],[w14++]
ADDC w5,[w13--],[w14--] ; TEMP=Iadd*Wi=y1*x1 + (y1*x0 + y0*x1)>>16
; Rsub*Wi 32-bit multiplication
; (w9-2,w9-1)=Rsub=(x0,x1)
; (w6,w7)=Wi=(x0,x1)
MUL.US w6,[--w9],w2 ; y0*x1
MUL.SS w7,[w9--],w4 ; y1*x1
MUL.SU w7,[w9++],w0 ; y1*x0
LAC w3,B
ADD w1,B
SFTAC B,#16 ; B=(y1*x0 + y0*x1)>>16
ADD w4,[w13],[w13++]
ADDC w5,[w13],[w13--] ; B=Rsub*Wi=y1*x1 + (y1*x0 + y0*x1)>>16
; Iadd*Wr 32-bit multiplication
MOV.D [w10],W6 ; (w6,w7)=Wr=(y0,y1)
; (w9+1,w9+2)=Rsub=(x0,x1)
MUL.SU w7,[++w9],w0 ; y1*x0
MUL.US w6,[++w9],w2 ; y0*x1
MUL.SS w7,[w9--],w4 ; y1*x1
LAC w3,A
ADD w1,A
SFTAC A,#16 ; A=(y1*x0 + y0*x1)>>16
ADD w4,[w12],[w12++]
ADDC w5,[w12],[w12--] ; A=Iadd*Wr=y1*x1 + (y1*x0 + y0*x1)>>16
; Gr(k)=Radd + (Wr*Iadd - Wi*Rsub)
; Gr(N-k)=Radd - (Wr*Iadd - Wi*Rsub)
SUB A ; A=Iadd*Wr-Rsub*Wi
LAC [++W8],B ; B=Radd
MOV [--w8],[w13]
SFTAC B,#1 ; B=Radd/2 in Q31 format
ADD A ; A=(Radd + (Iadd*Wr-Rsub*Wi))/2 in Q31 format
SFTAC B,#-1
SUB B ; B=(Radd - (Iadd*Wr-Rsub*Wi))/2 in Q31 format
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Gr(k)=(Radd + (Iadd*Wr-Rsub*Wi))/2
; Rsub*Wr 32-bit multiplication
; (w6,w7)=Wr=(y0,y1)
; (w9-2,w9-1)=Rsub=(x0,x1)
MUL.US w6,[--w9],w2 ; y0*x1
MUL.SS w7,[w9--],w4 ; y1*x1
MUL.SU w7,[w9],w0 ; y1*x0
LAC w3,A
ADD w1,A
SFTAC A,#16 ; A=(y1*x0 + y0*x1)>>16
ADD w4,[w12],[w12++]
ADDC w5,[w12],[w12--] ; A=Rsub*Wr=y1*x1 + (y1*x0 + y0*x1)>>16
MOV [w13++],[W9++]
MOV [w13--],[w9++] ; Gr(N-k)=(Radd - (Iadd*Wr-Rsub*Wi))/2
; Gi(k)=Isub - (Wr*Rsub + Wi*Iadd)
; Gi(N-k)=-Isub - (Wr*Rsub + Wi*Iadd)
LAC [++W14],B
MOV [--w14],[w13] ; B=Wi*Iadd
ADD A ; A=Wi*Iadd+Rsub*Wr
NEG A ; A=-(Wi*Iadd+Rsub*Wr)
LAC [++W8],B ; B=Isub
MOV [--w8],[w13]
SFTAC B,#1 ; B=Isub/2 in Q31 format
ADD A ; A=(Isub - (Wr*Rsub + Wi*Iadd))/2 in Q31 format
SFTAC B,#-1
NEG B
ADD B ; B=(-Isub - (Wr*Rsub + Wi*Iadd))/2 in Q31 format
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Gi(k)=(Isub - (Wr*Rsub + Wi*Iadd))/2
MOV [w13++],[W9++]
MOV [w13--],[w9++] ; Gi(N-k)=(-Isub - (Wr*Rsub + Wi*Iadd))/2
SUB w9,#16
.endm
;............................................................................
; Local Stack Frame
;............................................................................
; |_______|
; |_______|<- Stack Pointer SP
; |_______|<- Twiddle Factor INDEX FP+4
; |_______|<- Temp FP
;............................................................................
.equ TF_INDX, 4
.equ TEMP, 0
;............................................................................
; Real FFT Calculation
;............................................................................
_realFft32bIP:
;............................................................................
; Context Save
PUSH.D w8 ; {w8,w9} to TOS
PUSH.D w10 ; {w10,w11} to TOS
PUSH.D w12 ; {w12,w13} to TOS
PUSH CORCON
PUSH PSVPAG
LNK #6
;............................................................................
;; PSVPAG = __builtin_psvpage(&twiddleFactor);
;; CORCONbits.PSV = 1;
MOV w3,PSVPAG
BSET CORCON,#2
; Store Input Parameters
MOV w2,w11 ; w11 ---> Wi = SIN(*)
MOV #TF_FFT_SIZE,W8
ADD w2,w8,w2
MOV w2,W10 ; w10 ---> Wr = COS(*)
MOV w1,w8 ; W8 ---> Pr[0], first bin
MOV #8,w2
SL w2,w0,w2
ADD w1,w2,w9 ; w9 ---> Pr[N], last bin
LSR w2,#4,w6 ; N/2
SUB w6,#2,w6 ; w6 = BIN_CNTR = (N/2)-2
SUBR w0,#TF_FFT_STG,w1
MOV #2,w2 ; ************CHECK THIS
SL w2,w1,w2 ; TF_INDX=TF_FFT_SIZE/FFT_SIZE
MOV w2,[w14+TF_INDX]
ADD w10,w2,w10 ; Next Twiddle Factor (Wr)
ADD w11,w2,w11 ; Next Twiddle Factor (Wi)
MOV #ACCAL,w12 ; w12 ---> A
MOV #ACCBL,w13 ; W13 ---> B
; DC and Nyquist Bin
ADD w8,#8,w7
LAC [--w7],A ; A=Pi[0]
MOV [--w7],[w12]
LAC [--w7],B ; B=Pr[0]
MOV [--w7],[w13]
ADD A ; A=(Pr[0]+Pi[0])/2
SFTAC A,#1
SUB B ; Gr[N]=(Pr[0]-Pi[0])/2
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Gr[0]=(Pr[0]+Pi[0])/2
MOV #0,w0
MOV w0,[W8++]
MOV w0,[w8++] ; Gi[0]=0
MOV [w13++],[W9++]
MOV [w13--],[w9++] ; Gr[N]=(Pr[0]-Pi[0])/2
MOV w0,[W9++]
MOV w0,[w9++] ; Gi[N]=0
SUB w9,#16 ; w9---> Gr[N-1], w8---> Gr[1]
; Bin 1 to N-1, k=1:(N/2-1)
DO w6,BIN_END
BIN_START:
LAC [++w9],A ; A=Pr[N-k]
MOV [--w9],[w12]
LAC [++w8],B ; B=Pr[k]
MOV [--w8],[w13]
ADD A ; A=(Pr[k]+Pr[N-k])/2
SFTAC A,#1
SUB B ; Gr[N]=(Pr[k]-Pr[N-k])/2
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Radd[k]=(Pr[k]+Pr[N-k])/2
MOV [w13++],[W9++]
MOV [w13--],[w9++] ; Rsub[k]=(Pr[k]-Pr[N-k])/2
LAC [++w9],A ; A=Pi[N-k]
MOV [--w9],[w12]
LAC [++w8],B ; B=Pi[k]
MOV [--w8],[w13]
ADD A ; A=(Pi[k]+Pi[N-k])/2
SFTAC A,#1
SUB B ; Gr[N]=(Pi[k]-Pi[N-k])/2
MOV [w12++],[W9++]
MOV [w12--],[w9--] ; Iadd[k]=(Pi[k]+Pi[N-k])/2
MOV [w13++],[W8++]
MOV [w13--],[w8++] ; Isub[k]=(Pi[k]-Pi[N-k])/2
; w9---> Gi[N-k],
SUB w8,#8 ; w8---> Gr[k]
MERGE_BFLY_MACRO
MOV [w14+TF_INDX],w0
ADD w10,w0,w10 ; Next Twiddle Factor (Wr)
BIN_END: ADD w11,w0,w11 ; Next Twiddle Factor (Wi)
LAC [++W8],A ; B=Pr(N/2)
MOV [--w8],[w12]
SFTAC A,#1
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Gr(N/2)=Pr(N/2)/2
LAC [++W8],A ; B=Pi(N/2)
MOV [--w8],[w12]
SFTAC A,#1
MOV [w12++],[W8++]
MOV [w12--],[w8++] ; Gi(N/2)=Pi(N/2)/2
;............................................................................
; Context Restore
ULNK
POP PSVPAG
POP CORCON
POP.D w12 ; {w12,w13} from TOS
POP.D w10 ; {w10,w11} from TOS
POP.D w8 ; {w8,w9} from TOS
;............................................................................
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -