// lab4b.c // Uses PN generation, IIR filtering, and autocorrelation // code by Matt Kleffner -9/2004 // Based on swi_process.c by Educational DSP #include "dsk5510_dual3006cfg.h" #include "dsk5510.h" #include "swi_process.h" #include "dsplib.h" #include "lab4b.h" /* Define N here in header file */ /* function defined in pn.c */ void rand_fillbuffer(void); /* IIR values and buffers (declared in c_fft_given_iirc.asm) */ #define IIR_order 4 extern int scale; extern int coef[IIR_order]; extern int state[IIR_order]; /* Pointer to state buffer location */ int iirptr; extern unsigned int *iseed; /* seed for rand_fillbuffer() and randbit() */ /* function defined in iirfilt.c */ void iirfilt(void); /* function defined in autocorr.c */ void autocorr(void); /* Function defined by c_fft_given_iirc.asm */ //void bit_rev_fft(void); /* FFT data buffers (declared in c_fft_given_iirc.asm) */ extern int bit_rev_data[N*2]; /* Data output for bit-reverse function */ extern int fft_data[N*2]; /* In-place FFT input & Output array */ /* Our input/output buffers */ int autocorr_in[N]; int autocorr_out[N]; // all data processing should be done in SWI_ProcessBuffer void SWI_ProcessBuffer() { static unsigned int mbox_value = 0; short *psrc, *pdest; unsigned int i; mbox_value |= SWI_getmbox(); // buffers are only processed when both transmit and receive are ready if((mbox_value & DMA_RECEIVE_DONE) && (mbox_value & DMA_TRANSMIT_DONE)) { mbox_value = 0; // get buffer pointers psrc = receive_buffer[receive_buffer_to_process_index]; pdest = transmit_buffer[transmit_buffer_to_fill_index]; /* First, transfer inputs and outputs */ for (i = 0; i < N; i++) { pdest[4*i] = autocorr_in[i]; pdest[4*i+1] = bit_rev_data[i*2] << 8; /* Some statements useful in debugging */ /* pdest[4*i] = psrc[4*i+2]; */ /* Be sure to comment out PN-sequence generation */ /* when using the next two lines */ //autocorr_in[i] = psrc[4i+2]; } /* Last, set the DC coefficient to -1 for a trigger pulse */ pdest[0] = -32768; /* Generate PN input */ rand_fillbuffer(); /* Filter input */ iirfilt(); /* Calculate autocorrelation */ autocorr(); /* Transfer autocorr output to FFT input buffer */ for (i = 0; i < N; i++) { fft_data[i*2] = autocorr_out[i]; fft_data[i*2+1] = 0; } // Bit-reverse and compute FFT cfft((DATA *)fft_data,N, SCALE); cbrev((DATA *)fft_data,(DATA *)bit_rev_data,N); /* Done, wait for next time around! */ receive_buffer_processed = 1; // flag receive buffer as processed transmit_buffer_filled = 1; // flag output buffer as full } }