How to do a DDS synth on Due with multiple waves.

I've written some pretty simple code loosely based on the DueSimpleWave example. I need it to use phase accumulators to generate the tone against the main loop running at a consistent speed in order to be able to put more tones and effects on it later.

The code i've wriiten doesn't seem to produce any sound though and i can't for the life of my work out why.

Here's the code if anybody can spot any errors i've made. It should theoretically produce a tone between 1Hz and 4kHz (or 2kHz if it takes a microsecond to sample.

static int sine256[256]  = {
  127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
  242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,225,223,
  221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,
  76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,
  33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124

};
int sample;
int i = 0;

int maxSamplesNum = 256;
#define oneHzSample 1000000/maxSamplesNum
//oneHzSample = 3906.25

long accumulator;

void setup() {
  // put your setup code here, to run once:
  analogWriteResolution(10);
  analogReadResolution(10);
  accumulator = 0;
}

void loop() {
  // put your main code here, to run repeatedly: 
  sample = map(analogRead(A0),0,1024,1,oneHzSample);
  
  /*keep adding sample to accumulator until it passes
  oneHzSample. then step through sinewave table and reset
  accumulator*/
  accumulator = accumulator + sample;
  if(accumulator >= oneHzSample)
    i++;
    accumulator = accumulator - oneHzSample;
  
  //i++;
  if(i == maxSamplesNum)
    i = 0;
  
  
  analogWrite(DAC0, sine256[i]);
  
  delayMicroseconds(1);
}

You should have posted this in the DUE forum, but since you're here this code isn't right:

  if(accumulator >= oneHzSample)
    i++;
    accumulator = accumulator - oneHzSample;

If the accumulator value exceeds oneHzSample you increment i. But you always subtract oneHzSample from accumulator.

I think you need this?:

  if(accumulator >= oneHzSample) {
    i++;
    accumulator = accumulator - oneHzSample;
  }

Pete

for referance,
a dds only needs 1/4 of a sine wave,
you generate the rest from the top two bits of the dds, to select which quadrant your in,

and the number of samples in the table you need is probably less than you think.
think how you could interpolate between two values in the table...

this might be of interest.

http://www.analog.com/static/imported-files/tutorials/MT-085.pdf

el_supremo:
You should have posted this in the DUE forum, but since you're here this code isn't right:

  if(accumulator >= oneHzSample)

i++;
    accumulator = accumulator - oneHzSample;




If the accumulator value exceeds oneHzSample you increment i. But you *always* subtract oneHzSample from accumulator.

I think you need this?:


if(accumulator >= oneHzSample) {
    i++;
    accumulator = accumulator - oneHzSample;
  }




Pete

Ahhhh. Thanks! You can tell I started out programming in python.

This might help !
With a good explanation of different methods and ways of implementing it.