Three files follow:
THRU.ASM once assembled will test the TI DSK; when running it
passes all input to output without change.
When MATCH.ASM is assembled it will include the COSINE table.
When loaded and run it will implement a 8 period matched filter centered at
500 Hz.
(See annotations for changing center frequency.)
**************************************************************** * (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 1992 * * * * MATCH * * * * This routine first initializes the TMS320C50 * * and TLC32040 on the C5x DSK. The AIC is set to * * 8 kS/s. Then incoming noisy 500 Hz CW signal * * is filtered by 8 periods of a matched FIR filter. * * * * This routine is in the main the routines FUNC * * and Example 7-21 supplied by TI with the DSK. * * * * Modification by C.R. MacCluer W8MQW 7-8-95 * * * **************************************************************** ; ; Bit definition of the control register in the AIC ; ;+-------------------------+ ;|LP xx G1 G0 | SY AX LB BP| G1 G0 gain ;+------------+------------+ --------------- ; | GAIN | | | +-- BP Filter 0 0 4 ; | Synch --+ | +----- Loopback 1 1 4 ; | Auxin -----+ 0 1 2 ; + (sinx)/x filter 1 0 1 ;---------------------------------------------------------------; ; ; .mmregs ; all standard symbols are defined ; .ds 0f00h ; store the following initialization ; values beginning at 0f00h ; TA .word 18 ; sets SCF clock = 288kHz RA .word 18 ; likewise for receive TAp .word 31 ; RAp .word 31 ; TB .word 36 ; Fs = 8 kHz RB .word 36 ; likewise for receive AIC_CTR .word 9h ; ; explanation of the above: ; ; The switched cap filter knee is set by TA and RA --- see fig6, ; p. B-29 and p. B-12 of the user guide. The master clock freq is ; 10 368 kHz, so dividing by 2*TA=2*18=36 sets SCF clock to 288 kHz, ; and thus puts the knee of the filter to just under 4 kHz. See fig6. ; ; Next set TB and RB to 36 to give a sampling rate of ; Fs = SCF clock/TB = 288/36 = 8kHz. ; ; Since the impulse response uses 16 samples of cosine per period, ; the matched filter's center frequency is Fs/16 = 8kHz/16 = 500 Hz. ; ; So to listen instead at lower freqs you must lower the sampling ; rate Fs by increasing TB and RB. For example a center freq of ; 450 Hz is obtained by changing TB and TB to 40. For these lower center ; freqs, the SCF knee should be moved down to below half the sampling ; freq Fs to prevent aliasing; do this by increasing TA and RA (to at ; most 32) and then refigure TB and RB for the correct filter center freq. ; In summary, ; ; matched filter center freq = 324/(TA*TB) kHz ; ; TAp (TA') and RAp (RA') are not used in this routine but occupy ; two spaces in the memory so that TB and RB will be found in their ; expected locations. ;------------------------------------------------------------------- ; introduce nmemonic address labels: ; X .set 037Fh ; incoming data FRSTAP .set 0380h ; previous newest data LASTAP .set 03FFh ; previous oldest data COEFFP .set 02000h ; cosine table starts **************************************************************** * Set up the ISR vector * .ps 080ah RINT: B RECEIVE ; Serial port rcv interrupt service XINT: B TRANSMIT ; Serial port xmt interrupt service ; * ************************************************************** * TMS32C05X INITIALIZATION * * * * .ps 0a00h .entry START: SETC INTM ; Disable interrupts LDP #0 ; Set data page pointer OPL #0834h,PMST LACC #0 SAMM CWSR ; Set software wait state to 0 SAMM PDWSR ; * Reset AIC by writing to PA2 (address >52) to DSK SPLK #022h,IMR ; Using XINT syn TX & RX CALL AICINIT ; initialize AIC and enable interrupts * ******************************************************************* ; set up convolution: ; CLRC OVM ; OVM = 0 SPLK #012h,IMR CLRC INTM ; enable SETC SXM ; keep track of sign SPM 3 ; guarantees no overflow in any 128 ; tap convolution (PM = 11) ***************************************************************** ; the DSP loops, waiting for a rcv or xmt interrupt: WAIT NOP NOP NOP B WAIT **************** end of main program ************************* *************************************************************** * Now the subroutines: * * ; ; RECIEVER INTERRUPT SERVICE ROUTINE ; RECEIVE: LAMM DRR ; read input signal + noise. ; The 16 bit AIC sample comes in with the two lowest bits 0 MAR *,AR2 ; set up aux register LAR AR2,#X ; load memory addr in auxregister SACL *,0,AR2 ; store sample in location X MAR *,AR3 ; set up indirect addressing LAR AR3,#LASTAP ; point to oldest data ZAP ; zero out ACC and P RPT #127 ; do 128 tap convolution MACD COEFFP,*- APAC ; add in the last product RPT #13 ; output gain is determined: SFR ; throw away lowest 13 bits by ; shifting right. This is where ; AGC could be inserted: slowly increase the number of right shifts ; with strong signals. SFL ; shift left twice because the SFL ; lowest two bits sent to AIC ; must be 0 SACL DXR ; send out the processed signal LAR AR3,#X ; bring in latest sample mem location DMOV * ; put latest sample in FRSTAP RETE ; return to wait for next input **************************************************************** ; TRANSMIT INTERRUPT SERVICE ROUTINE ; TRANSMIT: RETE * ****************************************************************** * DESCRIPTION: This routine initializes the TLC320C40 for * * a 8Khz sample rate with a gain setting of 1 * * aic initialization data * AICINIT: SPLK #20h,TCR ; To generate 10 MHz from Tout SPLK #01h,PRD ; for AIC master clock MAR *,AR0 LACC #0008h ; Non continuous mode SACL SPC ; FSX as input LACC #00c8h ; 16 bit words SACL SPC LACC #080h ; Pulse AIC reset by setting it low SACH DXR SACL GREG LAR AR0,#0FFFFh RPT #10000 ; and taking it high after 10000 cycles LACC *,0,AR0 ; (.5ms at 50ns) SACH GREG ;------------------------ LDP #TA ; SETC SXM ; LACC TA,9 ; Initialized TA and RA register ADD RA,2 ; CALL AIC_2ND ; ;------------------------ LDP #TB LACC TB,9 ; Initialized TB and RB register ADD RB,2 ; ADD #02h ; CALL AIC_2ND ; ;------------------------ LDP #AIC_CTR LACC AIC_CTR,2 ; Initialized control register ADD #03h ; CALL AIC_2ND ; RET ; AIC_2ND: LDP #0 SACH DXR ; CLRC INTM IDLE ADD #6h,15 ; 0000 0000 0000 0011 XXXX XXXX XXXX XXXX b SACH DXR ; IDLE SACL DXR ; IDLE LACL #0 ; SACL DXR ; make sure the word got sent IDLE SETC INTM RET ; .include "COSINE.ASM" .end *************************************************************** *************************************************************** *************************************************************** * ***************************************************** * Table of cosines * * * * The impulse response of the matched filter * * * * * * ***************************************************** * .mmregs .ds 02000h .word 32767 ; 1.0 cos 0 period 1 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; etc cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 2 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 3 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 4 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 5 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 6 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 7 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * .word 32767 ; 1.0 cos 0 period 8 .word 30273 ; 0.9238795 cos T .word 23170 ; 0.7071068 cos 2T .word 12539 ; 0.3826834 cos 3T .word 00000 ; 0.0000000 cos 4T .word -12539 ; cos 5T .word -23170 ; cos 6T .word -30273 ; cos 7T .word -32768 ; cos 8T .word -30273 .word -23170 .word -12539 .word 00000 .word 12539 .word 23170 .word 30273 ; cos 15T * ********************************************************* ********************************************************* ********************************************************* **************************************************************** * (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 1992 * **************************************************************** * MODULE NAME: thru * * * * DESCRIPTION: This routine initializes the TMS320C50 and * * TLC32040 on the C5x DSK, then passes * * a signal thru w/o filtering. * * * * mod by C.R. MacCluer W8MQW 7-8-95 * * This a mod of TI's routine FUNC. Many lines are unnecessary * * * **************************************************************** .mmregs * ;---------------------------------------------------------------; ; Bit definition of the control register in the AIC ; ;---------------------------------------------------------------; .ds 0f00h ; TA .word 18 ; Fcut = 4 KHz RA .word 18 ; Fcut = 4 KHz TAp .word 31 ; RAp .word 31 ; TB .word 24 ; Fs = 12 kHz RB .word 24 ; Fs = 12 kHz AIC_CTR .word 9h ACC_lo .word 0 ; ACC_hi .word 0 ; STAT0 .word 0 ; STAT0 storage STAT1 .word 0 ; STAT1 storage TEMP .word 0 ; location of TEMPorary storage TEMP1 .word 0 ; SIN_SW .word 00001h ; 0 -> random noise ; 1 -> sinewave y .word 0463ch ; sin(fn*pi), where fn is normalized y1 .word 00000h ; frequency seed .word 07e6dh ; seed for random noise generator .ds 01000h coeff .word 0678dh ; cos(fn*pi) **************************************************************** * Set up the ISR vector * **************************************************************** .ps 080ah rint: B RECEIVE ;0A; Serial prot receive interrupt RINT. xint: B TRANSMIT ;0C; Serial port transmit interrupt XINT. * ****************************************************************** * TMS32C05X INITIALIZATION * * * ****************************************************************** .ps 0a00h .entry START: SETC INTM ; Disable interrupts LDP #0 ; Set data page pointer OPL #0834h,PMST LACC #0 SAMM CWSR ; Set software wait state to 0 SAMM PDWSR ; * Reset AIC by writing to PA2 (address >52) to DSK SPLK #022h,IMR ; Using XINT syn TX & RX CALL AICINIT ; initialize AIC and enable interrupts * ******************************************************************* * This routine enables serial port rx interrupts & configures * * TLC32040 for the frame sync. When RINT is triggered, read a * * dummy data word from the AIC then generate a sine wave to * * send out. * ******************************************************************* ; CLRC OVM ; OVM = 0 SPM 0 ; PM = 0 SPLK #012h,IMR CLRC INTM ; enable ; WAIT NOP ; wait for a transmit or receive NOP NOP B WAIT ;------- end of main program ----------; ; ; RECIEVER INTERRUPT SERVICE ROUTINE ; RECEIVE: LDP #TEMP LAMM DRR ; read input SFL ;double gain SFL ; again SAMM DXR ; send to output RETE ; to program * * * ; TRANSMIT INTERRUPT SERVICE ROUTINE ; TRANSMIT: RETE * ****************************************************************** * DESCRIPTION: This routine initializes the TLC320C40 for * * a 12 Khz sample rate with a gain setting of 1 * ****************************************************************** * aic initialization data * AICINIT: SPLK #20h,TCR ; To generate 10 MHz from Tout SPLK #01h,PRD ; for AIC master clock MAR *,AR0 LACC #0008h ; Non continuous mode SACL SPC ; FSX as input LACC #00c8h ; 16 bit words SACL SPC LACC #080h ; Pulse AIC reset by setting it low SACH DXR SACL GREG LAR AR0,#0FFFFh RPT #10000 ; and taking it high after 10000 cycles LACC *,0,AR0 ; (.5ms at 50ns) SACH GREG ;------------------------ LDP #TA ; SETC SXM ; LACC TA,9 ; Initialized TA and RA register ADD RA,2 ; CALL AIC_2ND ; ;------------------------ LDP #TB LACC TB,9 ; Initialized TB and RB register ADD RB,2 ; ADD #02h ; CALL AIC_2ND ; ;------------------------ LDP #AIC_CTR LACC AIC_CTR,2 ; Initialized control register ADD #03h ; CALL AIC_2ND ; RET ; AIC_2ND: LDP #0 SACH DXR ; CLRC INTM IDLE ADD #6h,15 ; 0000 0000 0000 0011 XXXX XXXX XXXX XXXX b SACH DXR ; IDLE SACL DXR ; IDLE LACL #0 ; SACL DXR ; make sure the word got sent IDLE SETC INTM RET ; .end
This file can be obtained in serveral ways:
Return Top of DSP Page.
For more information on the Matched Filter: Chuck, W8MQW
For comments or corrections: W6/PA0ZN
Return to Top Page.