<< Chapter < Page | Chapter >> Page > |
// 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
}
}
// lab4bmain.c
// based on main.c by Educational DSP
// Initializes autocorr_out, state, and iseed.
// Can be modified for optimization.
#include "dsk5510_dual3006cfg.h"
#include "dsk5510.h"
#include <csl.h>
#include "lab4b.h"
#define IIR_order 4
extern int iirptr;
unsigned int *iseed;
extern int autocorr_out[N];
extern int state[IIR_order];
void init_DMA();
void main()
{
int i;
DSK5510_init(); // init BSL
DSK5510_rset(DSK5510_MISC, 0x03); // route McBSP0/1 to J3
// Initialize autocorr_out to zero since some values will remain zero
for (i = 0; i < N; ++i)
{
autocorr_out[i] = 0;
}
for ( i = 0; i < IIR_order; ++i)
state[i] = 0;
// Start McBSP0 I2S slave
MCBSP_start(hMcbsp0, MCBSP_XMIT_START | MCBSP_RCV_START |
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
// Start McBSP1 I2S master
MCBSP_start(hMcbsp1, MCBSP_XMIT_START | MCBSP_RCV_START |
MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC, 220);
init_DMA(); // configure DMA and interrupts
*iseed = 1;
iirptr = 0;
return; // let DSP/BIOS scheduler take over
}
Notification Switch
Would you like to follow the 'Digital signal processing laboratory (ece 420 55x)' conversation and receive update notifications?