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

📄 rfft256sc.asm

📁 2407TI库函数
💻 ASM
字号:
;============================================================================
;
; File Name     : rfft256sc.asm
; 
; Originator    : Digital Control Systems Group 
;                 Texas Instruments 
; 
; Description   : This file contain source code of split function for 
;                 256-point Real FFT
;               
; Date          : 26/4/2001 (dd/mm/yyyy)
;===========================================================================    
; Routine Type  : C Callable        
;
; Description   :
; void FFT256R_split(FFTxxxx_handle) 
; This function perfroms split operation to obtain 129 spectran bins of
; 256-point real valued sequence from the 128-point complex FFT output
; 
; void FFT256R_init(void)
; This function copies the Twiddle factors for split function from 
; load time address to its run time address 
;
;======================================================================
; REAL FFT MODULES
;----------------------------------------------------------------------
;typedef struct {   
;       int *ipcbptr;
;       int *magptr;
;       int peakmag;
;       int peakfrq;
;       int normflag;
;       int size; 
;       int *winptr; 
;       void (*init1)(void);
;       void (*init2)(void);
;       void (*calc)(void *);
;       void (*split)(void *);
;       void (*mag)(void *);
;       void (*win)(void *);
;       }FFTxxxR;   
;===========================================================================
;===============================================================================
; Computation Buffer  for k=1:(N/2)-1) & N=128
;==============================================================================         
;
; Non Bitrev I/P    COMPLEX FFT(N) O/P    E/O SEPERATION                Final FFT output
; ___________       ______________        ____________                  ___________
; |__g(0)____|      |__R(0)______|        |___RP(0)__| =R(0)            |__GR(0)__| = {RP(0)+IP(0)}/2
; |__g(1)____|      |__I(0)______|        |___IP(0)__| =I(0)            |__GI(0)__| = 0
; |__g(2)____|      |__R(k)______|        |___RP(k)__|                  |_________|
; |__g(3)____|      |__I(k)______|        |___IM(k)__|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |__R(N/2)____|        |_RP(N/2___| =R(N/2)          |_GR(N/2)_| =RP(N/2)/2
; |__________|      |__R(N/2)____|        |_IP(N/2)__| =I(N/2)          |_GI(N/2)_| =-IP(N/2)/2
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |___R(N-k)___|        |___RM(k)__|                  |_GR(N-1)_|
; |_g(2*N-1)_|      |___I(N-k)___|        |___IP(k)__|                  |_GI(N-1)_|
;                                                                       |__GR(N)__|={RP(0)-IP(0)}/2
;                                                                       |__GI(N)__|=0         
;===========================================================================
;                      Note:   IM(0)=RM(0)=0
;                              RM(N/2)=IM(N/2)=0                            
;===========================================================================
; EVEN/ODD FFT SEPERATION
;===========================================================================
; RP(K) = [R(K) +  R(N-k)]/2
; RM(K) = [R(K) -  R(N-K)]/2
; IP(K) = [I(K) + I(N-K)]/2 
; IM(K) = [I(K) - I(N-K)]/2    K=1:N/2
;=========================================================================
; EVEN/ODD FFT MERGE
;========================================================================= 
; GR(K)={RP(K) - WI(K)*RM(K) + WR(K)*IP(K)}/2
; GI(K)={IM(K) - WI(K)*IP(K) - WR(K)*RM(K)}/2
; GR(N-K)={RP(K) + WI(K)*RM(K) - WR(K)*IP(K)}/2
; GI(N-K)={-IM(K) - WI(K)*IP(K) - WR(K)*RM(K)}/2 
;  
; WR(k) <-- Cosine table (AR5)
; WI(K) <-- Sine table   (AR2)     
;
;======================================================================
; Function Local Frame
;======================================================================
;   |_______|
;   |_______|<- Stack Pointer                           (FP+1) <---AR1 
;   |_______|<- Reg to Reg Tfr                          (FP)   <---AR7 
;   |_______|<- Old FP (AR0)                            (FP-1)
;   |_______|<- Context Save of AR7                     (FP-2)
;   |_______|<- Context Save of AR6                     (FP-3)
;   |_______|<- Return Address of the Caller            (FP-4)
;   |_______|<- Module Handle                           (FP-5) 
;                                                
;===================================================================
;                                                
;======================================================================

TWON                .set   256                                  
__FFTR_split_frs    .set   00001h       ; Local frame size for this routine 
                    .def   _FFT256R_split   ; Function External Reference
                    .def   _FFT256R_init    ; 
                    
_FFT256R_split: 
            POPD    *+              ; Store the Return Address in stack
            SAR     AR0,*+          ; Store the Caller's Frame Pointer
            SAR     AR6,*+          ; AR6 Context Save
            SAR     AR7,*+          ; AR7 Context Save
            SAR     AR1,*           
            LAR     AR7,*
            LAR     AR0,#__FFTR_split_frs       
            LAR     AR0,*0+,AR2     ; Create Local frame
            
            SETC    SXM
            SPM     #0                          
            
            LAR     AR2,#0FFFBh     ; ARP=AR2, AR2=-5    
            MAR     *0+             ; ARP=AR2, AR2->module handle
            LAR     AR2,*           ; ARP=AR2, AR2->ipcbptr
            LAR     AR3,*           ; ARP=AR2, AR2->ipcbptr, AR3=ipcbptr
            LAR     AR4,*,AR4       ; ARP=AR4, AR4=ipcbptr  
            LAR     AR0,#(TWON)
            MAR     *0+,AR3         ; ARP=AR3, AR3->R(0), AR4->GR(N)
                    
            LAR     AR5,#(TWID-1+TWON/4); COS(Angle)--->decrement
            LAR     AR6,#(TWID+1)       ; SIN(Angle)--->increment
            LAR     AR0,#(TWON/4)-2
            
            LACC    *+,15           ; ARP=AR3, AR3->I(0), ACC=RP(0), Where RP(0)=R(0)
            SUB     *,15,AR4        ; ARP=AR4, AR4->GR(N), ACC=RP(0)-IP(0), Where IP(0)=I(0)
            SACH    *+              ; ARP=AR4, AR4->GI(N), GR(N)={RP(0)-IP(0)}/2 in Q15
            SPLK    #0,*-           ; ARP=AR4, AR4-GR(N), GI(N)=0
            MAR     *-,AR3          ; ARP=AR3, AR3->I(0), AR4->I(N-k)
            ADD     *-,16           ; ARP=AR3, AR3->R(0), ACC=RP(0)+IP(0), Where IP(0)=I(0)
            SACH    *+              ; ARP=AR3, AR3->I(0), GR(0)={RP(0)+IP(0)}/2 in Q15
            SPLK    #0,*-           ; ARP=AR3, AR3->R(0), GI(0)=IM(0)-RM(0), Where IM(0)=RM(0)=0 
            
SPLITFN:    ADRK    #3              ; ARP=AR3, AR3->I(k), Where k=1: 
            LACC    *,15,AR4        ; ARP=AR4, AR4->I(N-k), ACC=I(k)/2
            SUB     *,15,AR3        ; ARP=AR3, AR3->I(k), ACC={I(k)-I(N-k)}/2
            SACH    *-,0,AR4        ; ARP=AR4, AR4->I(N-k), AR3->R(k), I(k)=IM(k)={I(k)-I(N-k)}/2   
            ADD     *,16            ; ARP=AR4, AR4->I(N-k), ACC={I(k)+I(N-k)}/2
            SACH    *-,0,AR3        ; ARP=AR3, AR3->R(k), AR4->R(N-k), I(N-k)=IP(k)={I(k)+I(N-k)}/2   
                                    
            LACC    *,15,AR4        ; ARP=AR4, AR4->R(N-k), ACC=R(k)/2
            ADD     *,15,AR3        ; ARP=AR3, AR3->R(k), ACC={R(k)+R(N-k)}/2
            SACH    *,0,AR4         ; ARP=AR4, AR4->R(N-k), AR3->R(k), R(k)=RP(k)={R(k)-R(N-k)}/2  
            SUB     *,16            ; ARP=AR4, AR4->R(N-k), ACC={R(k)-R(N-k)}
            SACH    *+,0,AR5        ; ARP=AR5, AR5->WR(k), AR4->I(N-k), R(N-k)=RM(k)={R(k)+R(N-k)}/2  
            
                                    ;                               TREG    AR6     AR5     AR3     AR4     ARP
            LT      *,AR4           ; TREG=WR(k)                    WR(k)   WI(k)   WR(k)   RP(k)   IP(k)   4
            MPY     *-,AR6          ; PREG=WR(k)*IP(k)              WR(k)   WI(k)   WR(k)   RP(k)   RM(k)   6                            
            LTP     *+,AR4          ; ACC=WR(k)*IP(k)               WI(k)   WI(k+1) WR(k)   RP(k)   RM(k)   4
            MPY     *+              ; PREG=WI(k)*RM(k)              WI(k)   WI(k+1) WR(k)   RP(k)   IP(k)   4
            MPYS    *-,AR7          ; ACC=WR(k)*IP(k)-WI(k)*RM(k)
                                    ; PREG=WI(k)*IP(k)              WI(k)   WI(k+1) WR(k)   RP(k)   RM(k)   7
            SACH    *,1,AR3         ; T1=WR(k)*IP(k)-WI(k)*RM(k)    WI(k)   WI(k+1) WR(k)   RP(k)   RM(k)   3 
            ADD     *,15            ; ACC=RP(k)+WR(k)*IP(k)-WI(k)*RM(k)
            SACH    *+,0,AR7        ; GR(k)={RP(k)+WR(k)*IP(k)-WI(k)*RM(k)}/2 in Q15
                                    ;                               WI(k)   WI(k+1) WR(k)   IM(k)   RM(k)   7 
            SUB     *,16,AR4        ; ACC={RP(k)-WR(k)*IP(k)+WI(k)*RM(k)}/2 in Q15   
                                    ;                               WI(k)   WI(k+1) WR(k)   IM(k)   RM(k)   4
            LT      *               ; TREG=RM(k)                    RM(k)   WI(k+1) WR(k)   IM(k)   RM(k)   4
            SACH    *+,0,AR5        ; GR(N-k)={RP(k)-WR(k)*IP(k)+WI(k)*RM(k)}/2 in Q15
                                    ;                               RM(k)   WI(k+1) WR(k)   IM(k)   IP(k)   5
            PAC                     ; ACC=WI(k)*IP(k)               RM(k)   WI(k+1) WR(k)   IM(k)   IP(k)   5
            MPY     *-,AR7          ; PREG=WR(k)*RM(k)              RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   7 
            APAC                    ; ACC=WI(k)*IP(k)+WR(k)*RM(k)   RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   5  
            SACH    *,1,AR3         ; T1=WI(k)*IP(k)+WR(k)*RM(k)    RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   3
            LACL    #0              ; ACC=0                         RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   3
            SUB     *,15,AR7        ; ACC=-IM(k)                    RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   7
            SUB     *,15,AR4        ; ACC=-IM(k)-WI(k)*IP(k)-WR(k)*RM(k)
                                    ;                               RM(k)   WI(k+1) WR(k+1) IM(k)   IP(k)   4
            SACH    *-,0,AR3        ; GI(N-k)={-IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q15
                                    ;                               RM(k)   WI(k+1) WR(k+1) IM(k)   RM(k)   3
            ADD     *,16            ; ACC=IM(k)-WI(k)*IP(k)-WR(k)*RM(k)
            SACH    *-,0,AR4        ; GI(k)={IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q15                    
                                    ;                               RM(k)   WI(k+1) WR(k+1) RP(k)   RM(k)   4  
            MAR     *-,AR0          ;                               RM(k)   WI(k+1) WR(k+1) RP(k)   I(N-k)  4   
            BANZ    SPLITFN,*-,AR3  ;   
            
            LACL    #0
            MAR     *,AR4
            SUB     *,15
            SACH    *-              ; GI(TWON/4)=-I(4)/2
            LACC    *,15
            SACH    *,0,AR1         ; GR(TWON/4)=R(4)/2
            
                                    
            SBRK    #(__FFTR_split_frs+1)   ; Clear the local frame
            LAR     AR0,*-          ; Retrive Caller's frame pointer
            LAR     AR7,*-
            LAR     AR6,*-
            PSHD    *               ; Push the return address to TOS
            RET                     ; Return to the caller
                    
;================================================================================
; TWIDDLE FACTOR INITIALISATION
;===============================================================================            
; Twiddle factor Initialisation
_FFT256R_init:
            POPD    *+
            LAR     AR2,#TWID               ; Copy the twiddle factor from ROM to RAM
            LACC    #TF_LOAD_STRT_ADR 
            MAR     *,AR2
            LAR     AR3, #(TF_LOAD_END_ADR-TF_LOAD_STRT_ADR-1)
loop1:      TBLR    *+,AR3
            ADD     #1
            BANZ    loop1,*-,AR2 
            MAR     *,AR1
            SBRK    #1
            PSHD    *               ; Push the return address to TOS
            RET  
                                      
                                      
                                      
;--------------------------------------------------------------------------
; TWIDDLE FOR 256 Real FFT split function(64 ENTRIES)
;--------------------------------------------------------------------------     

        .sect   "FFTtf" 
        .label  TF_LOAD_STRT_ADR                    
TWID:   .word   0,804,1608,2411,3212,4011,4808,5602,6393,7180
        .word   7962,8740,9512,10279,11039,11793,12540,13279,14010,14733
        .word   15447,16151,16846,17531,18205,18868,19520,20160,20788,21403
        .word   22006,22595,23170,23732,24279,24812,25330,25833,26320,26791
        .word   27246,27684,28106,28511,28899,29269,29622,29957,30274,30572
        .word   30853,31114,31357,31581,31786,31972,32138,32286,32413,32522
        .word   32610,32679,32729,32758
        .label  TF_LOAD_END_ADR         
            
            
            
            
            
              
            
            
            
            
                                                       
            
                                        
            
            
            
            
            
               
            





⌨️ 快捷键说明

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