ΣSigmaStudio Ask AI Русский Log in

Memory allocation for delay / fragmentation

Processors & DSP OlliB May 18, 2026 00:00 2 replies Original on forum ↗
Subscribe
OlliB Question
May 18, 2026 00:00

Hello,

I am trying to update our existing products with some new features. Actually the ADAU1452 is connected by I2C to host processor. As the ADAU1452 only support 1024 point FFT, I am trying to send signal through delay line, enter hibernation mode and read back my fetched samples. But unfortunately, the delay memory ist crazy fragmented, also different fragmantation with every start of program.

Is there a way to read out the delay pointer table? Or is there something like a record audio to (SPI) ram block planned?

I have seen custom blocks in SigmaStudio+, biut it only supports ADSP and Sharc models, is there a way to get support to program my own not fragmented delay or record algorithm?

Or do you have any other idea? Maybe an old SigmaStudio version which does not use fragmentation?

Thanks, Oliver

Thread Notes
OlliB - Moved from SigmaDSP Processors & SigmaStudio Dev. Tool to Processors & DSP. Post date updated from Saturday, May 16, 2026 4:34 PM UTC to Monday, May 18, 2026 6:57 PM UTC to reflect the move.

software

4.7

processors and dsp

sigma

Sigmastudio+

SigmaDSP Audio Processors

Processors and Microcontrollers

SigmaStudio v4.7

Show More

DaveThib Reply
May 18, 2026 00:00

Hello Oliver,

Gee, I have a lot of questions here myself.

What exactly are you trying to do? Grab a block of data that is larger than 1024 so you can perform an FFT on it?

Entering hibernation mode has some challenges on its own. You often need to do a context save. Which brings up what is in this "context"?. The Context save will save the 16 pointer memories P0-P15 that are used as pointers. So this is where the pointers for the circular delay memory will be stored. One will be the next write address and one will be the next read address. They will rotate around the allocated memory storage addresses so I think this is why you are saying it is fragmented? I asked one of our programmers and he said there is no easy way to know which of the 16 pointers are being used for certain functions. The compiler just does it and has no need to report it out.

So I think we need to figure out a different way to accomplish this for you.

First, question, I assume you are not doing any kind of assembly programming correct?

Second question is that you have some sort of system controller or microcontroller connected to the DSP?

There is a block for writing to SPI RAM as a SPI delay line. But, this creates some other issues. The block will use the SPI Master port where the EEPROM would be and there is no direct connection between the slave port and the master port so no way to have your controller read it unless you somehow switch it using external hardware muxes etc.... Not too simple.

So how about some other totally different way to do this?

You could write the audio out of a serial port and just have this external controller read it in! I suppose you could also supply a counter for the data so you know where in a large block this data word is located. You could also use a GPIO for a signal when to start reading data. All of this can be done with standard objects and it is not too hard to have a system controller reading serial data.

You could setup some pointers and variables in a SigmaStudio program to write to an address and you create your own buffer. You would just have to be careful to not overwrite something the program is using.

Then your controller can read it. Again, you can setup a flag to tell it the data is ready and then have a reset to start collecting a new batch of data without having to stop the core and hibernate the core.

It would be good to see your program and better understand what you are doing. If you can answer my questions that would help.

Thanks!!!

Dave T

OlliB Reply
May 18, 2026 00:00

Hi Dave,

thanks for more info about the delay handling. I assumed there are somewhere pointers for this, but as you said, not easy to figure out where to look.

I could do some assemby language, but there is no interface or description on how to do with the ADAU1452, so I forgot this idea directly...

At the end I found a solution, I use 2 channels 8192 block size inputs and outputs just directly connected. I added a counter in the upper bits of the signal (OR) and then checked my memory dump after hibernate. There are indeed two 16384 byte sample blocks in memory after hibernate, and with the added counter it is easy to find the start of these blocks (rotating start) and the wrap-around point (fixed always by compiler).

So in the end, I can use the MCU connected by I2C to get 16384 samples for 2 channels, send it to my control application by BLE and do the FFT then for display and analyzing.

For next design I will connect one I2S output of the ADAU1452 to my MCU to have the I2S stream directly for larger FFTs

Thanks a lot for all these suggestions and insights of the ADAU1452!

Oliver