Go Down

Topic: How to do a DDS synth on Due with multiple waves. (Read 1 time) previous topic - next topic

manicphase

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.

Code: [Select]
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);
}

el_supremo

You should have posted this in the DUE forum, but since you're here this code isn't right:
Code: [Select]
  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?:
Code: [Select]
  if(accumulator >= oneHzSample) {
    i++;
    accumulator = accumulator - oneHzSample;
  }


Pete
Don't send me technical questions via Private Message.

drjiohnsmith

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


manicphase


You should have posted this in the DUE forum, but since you're here this code isn't right:
Code: [Select]
  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?:
Code: [Select]
  if(accumulator >= oneHzSample) {
    i++;
    accumulator = accumulator - oneHzSample;
  }


Pete


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

iyahdub

This might help !
With a good explanation of different methods and ways of implementing it.
http://dubworks.blogspot.co.uk/p/blog-page.html
10 LET Loop=Infinite
20 GO TO 10

Go Up