Post Go back to editing

Multi-channel (TDM) SPORT DMA followed by FFT

I hope someone can point me in the right direction.  I am attempting to port a beamformer into an ADSP-21469.  Our approach is to pass many channels of data into the DSP (from an FPGA) using multi-channel SPORT.  This is a frequency domain beamformer, so the first operation on the data will be FFT.  Here is my dilemma: multi-channel SPORT DMA appears to interleave channels in memory, but the C library FFT seems to require that the time series input blocks are packed.  It does not appear to me that the SPORT DMA hardware is capable of organizing the data to group each channel's samples into a block.  Maybe I am stuck with the channel interleaved data.  This wouldn't bother most FFT routines that I have used in the past.  FFTW, for example, allows you to supply a "stride" parameter that allows it to skip through the interleaved channels.  It looks like the FFTA DMA is capable of performing this stride, but the C library does not provide this option, and I'm not inclined to code the FFTA hardware without an abstraction layer.  I see in EE-322 that there is an "Expert Code Generator" that provides a way to create a customized fft function.  Does anyone know if this will proved the "stride" capability that I need?  I am using the CCES, but it looks like the Expert Code Generator is only supplied for the visual dsp++ environment.  Can I access the Expert Code Generator without buying a license for the visual dsp++?

All of this surprises me very much, since multi-channel ADCs are the norm and FFT is such a common DSP function.

Assuming that there is a solution to the interleaving, my next dilemma involves the "overlap and save" real-time processing approach.  The time series blocks that I perform the FFTs on must overlap the previous time series blocks by 50%.  I can set up the SPORT chain buffer DMA to use buffers that are 1/2 the size of the FFT size.  This will give me interrupts at the correct interval to initiate the FFTs. My dilemma is the data wrap around when the blocks that form the FFT input  are the first and last in the SPORT DMA chain. I feel like the FFTA's Circular buffer DMA should be configurable to automatically handle this, but maybe not if I use the abstracted c library.  Has anyone dealt with this?

Thanks for any help.