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

Sigma Dynamic Bass compression table

SigmaDSP & SigmaStudio cod3gen Mar 1, 2022 00:00 3 replies Original on forum ↗
Subscribe
cod3gen Question
Mar 1, 2022 00:00

Hi All,

I am trying to use the dynamic bass feature, having it programmed by an MCU. Calculations are pretty clear due to KJBob magic calculation sheet for this particular function, however this sheet have been built to calculate 32 values (-96db to 0db, 128bytes?), but using this feature with ADAU1466, it have 160 bytes to write to table which means i have about 120db spectrum((160/4)*3), right? Instead of the 96db spectrum in the calculation sheet.

Now editing the schema is fairly easy to do, but, i do not know the lower limit and/or upper limit of the table.. Either would do, does any one else know the answer of this?
Other compressors usually reveals theyre upper and lower limit in xml sheet generated which is perfect.

Greetings,
Stian

Audio Signal Processors

bass

sigmastudio

SigmaDSP Audio Processors

dynamic

adau1466

Show More

KJBob Reply
Mar 1, 2022 00:00

Hello Stian,

I found my earlier post with the spreadsheet and unfortunately, I can't remember how I had figured it. However, from experimenting with the Capture Window once more, it appears that for the Sigma 300/350 DSPs, the table runs from -100 dB to +20 dB. You'll need to do some experimenting to see if this works for you.

It would surely be great if ADI could document the parameters for uC control of all blocks instead of having us reverse-engineering them one at a time.

Best regards,

Bob

bitmechanic Reply
Mar 3, 2022 00:00

Hello,

There are 40 values in the table from -96 to +21 in 3 dB steps. The Matlab below calculates the table values:

GaindB = 6;
ThreshHi = -5;
ThreshLo = -25;
Ratio = 3;

min_linear = 10^(ThreshHi/20);
for i = 1:40
db(i) = 3 * (i-1) - 96;
gain_db(i) = -GaindB;
if (db(i) > ThreshLo)
gain_db(i) = -GaindB + (Ratio - 1.0) * (db(i) - ThreshLo);
end
if (gain_db(i) > 20.0)
gain_db(i) = 20.0;
end
table_linear(i) = 10^(gain_db(i)/20);
if (table_linear(i) > (1.0 / min_linear))
table_linear(i) = (1.0 / min_linear);
end
end

cod3gen Reply
Mar 4, 2022 00:00

Thanks for your responses, KJBob and bitmechanic

In my application, i use c++, so incase anyone else in future are doing the same, the calculations i have now used are following;

struct bb{
  uint16_t tableLen;
  double compRatio;               // Compressor Ratio
  double boost;                   // Compressor Boost
  int highThreshold;              // Compressor High Threshold
  int lowThreshold;               // Compressor Low Threshold
  int lowerLimit          = -96;  // Compressor Lower Limit
  float* table;                   // Generated Compression Table
} pbb[8];
double corner1 = pow( 10.0, -pbb[idx].boost / 20.0 );
double corner2 = pow( 10.0, -pbb[idx].highThreshold / 20.0 );
double cornerEffect = (pbb[idx].compRatio-1)/6;
for( int kk = 0; kk < pbb[idx].tableLen; kk++ )
  pbb[idx].table[kk] = pbb[idx].lowerLimit + (kk*3) < pbb[idx].lowThreshold ? corner1 : min(corner2, corner1*pow(2, cornerEffect*(pbb[idx].lowerLimit + (kk*3)-pbb[idx].lowThreshold)));