Skip to content

Aida DSP API

Massimo Pennazio edited this page Jan 26, 2020 · 8 revisions

Aida DSP API Overview

NOTE: API discussed above are subject of change since the writing of this article.

Aida DSP API is an open source software library for Arduino and Energia IDEs. The purpose of this API is to free the developer from the inherent complexity of parameters load into Sigma DSP devices, so that he could focus on controlling audio algorithm developed with Sigma Studio. The library is composed by a low level and a high level.

Aida DSP API Hierarchy

The low level is responsable of implementing communication with DSP on I2C bus:

void float_to_fixed(float value, uint8_t *buffer);
void AIDA_WRITE_REGISTER(uint8_t dspAddress, uint16_t address, uint8_t length, uint8_t *data);
void AIDA_WRITE_REGISTER_BLOCK(uint8_t dspAddress, uint16_t address, uint16_t length, const uint8_t *data);
void AIDA_WRITE_VALUE(uint8_t dspAddress, uint16_t address, float value);
void AIDA_SAFELOAD_WRITE_REGISTER(uint8_t dspAddress, uint16_t address, boolean finish, uint8_t *data);
void AIDA_SAFELOAD_WRITE_VALUE(uint8_t dspAddress, uint16_t address, boolean finish, float value);
void AIDA_SW_SAFELOAD_WRITE_REGISTER(uint8_t dspAddress, uint16_t address, uint8_t nvalues, uint8_t *data);
void AIDA_SW_SAFELOAD_WRITE_VALUE(uint8_t dspAddress, uint16_t address, uint8_t nvalues, float value);
void AIDA_SW_SAFELOAD_WRITE_VALUES(uint8_t dspAddress, uint16_t address, uint8_t nvalues, float *values);
void AIDA_READ_REGISTER(uint8_t dspAddress, uint16_t address, uint8_t length, uint8_t *data);

various functions are available on the low level to write or read every memory area of Sigma DSP device. These functions are used by the high level which communicates directly with Sigma Studio Blocks: the developer can use high level functions to set a DC value, read audio signal level with a readback cell, change the frequency of a tone source or change complex parameters of a parametric equalizer.

From developer point of view these functions match Sigma Studio Blocks available in the program:

void gainCell(uint8_t dspAddress, uint16_t address, float value);
void MasterVolumeMono(uint8_t dspAddress, uint16_t address, float value);
void MasterVolumeStereo(uint8_t dspAddress, uint16_t address, float value);
void EQ1stOrd(uint8_t dspAddress, uint16_t address, equalizer_t* equalizer);
void EQ2ndOrd(uint8_t dspAddress, uint16_t address, equalizer_t* equalizer);
void ToneControl(uint8_t dspAddress, uint16_t address, toneCtrl_t* toneCtrl);
void StateVariable(uint8_t dspAddress, uint16_t address, float frequency, float q);
void CompressorRMS(uint8_t dspAddress, uint16_t address, compressor_t* compressor);
void CompressorPeak(uint8_t dspAddress, uint16_t address, compressor_t* compressor);
void readBack(uint8_t dspAddress, uint16_t address, uint16_t capturecount, float *value);
void mux(uint8_t dspAddress, uint16_t address, uint8_t select, uint8_t nchannels);
void muxnoiseless(uint8_t dspAddress, uint16_t address, uint8_t select);
void hard_clip(uint8_t dspAddress, uint16_t address, float th_high, float th_low);
void soft_clip(uint8_t dspAddress, uint16_t address, float alpha);
void dc_source(uint8_t dspAddress, uint16_t address, float value);
void sine_source(uint8_t dspAddress, uint16_t address, float frequency);
void sawtooth_source(uint8_t dspAddress, uint16_t address, float frequency);
void square_source(uint8_t dspAddress, uint16_t address, float frequency);
void triangle_source(uint8_t dspAddress, uint16_t address, float frequency);

Since some blocks require many settings to produce an output (biquad cell, dynamic processors) Aida DSP library has some data structures to handle all these parameters when calling APIs:

typedef struct compressor_t{
  float threshold;  // Range -90/+6 [dB]
  float ratio;      // Range 1 - 100
  float attack;     // [dB/s]
  float hold;       // [ms]
  float decay;      // [dB/s]
  float postgain;   // Range -30/+24 [dB]
}compressor;

typedef struct equalizer_t{
  float Q;          // Parametric, Peaking, range 0-16
  float S;          // Slope (Shelving), range 0-2
  float bandwidth;   // Bandwidth in octaves, range 0-11
  float gain;       // Range +/-15 [dB]
  float f0;         // Range 20-20000 [Hz]
  float boost;      // Range +/-15 [dB]
  unsigned char type;     // See defines section...
  unsigned char phase;    // False -> in phase (0°) True -> -180°
  unsigned char onoff;    // False -> off True -> on
}equalizer;

More on this can be found on reference example, where a complete DSP project from Sigma Studio to microcontroller's firmware is explained.

Clone this wiki locally