My little place on the web

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
projects:spectrumanaliser:step2_software [2012/05/06 15:33]
elger created
projects:spectrumanaliser:step2_software [2016/11/16 13:06] (current)
Line 1: Line 1:
-====== ​Headline ​======+====== ​Spectrumanaliser Software ​====== 
 +The software for my [[projects:​spectrumanaliser|spectrumanaliser project]] is not finished, and it may never be finished because there is always some feature or improvement to make.
  
 +However, I do have a working piece of example code which basically functions. Here it is:
 +
 +<file c fft.ino>
 +#include <​fix_fft.h>​
 +#include <​ht1632c.h>​
 +
 +
 +char im[128], data[128], raw[128], maxval[64];
 +char x=64, ylim=16;
 +int i=0, val;
 +static long tt=0;
 +
 +ht1632c ledMatrix = ht1632c(&​PORTB,​ 10, 9, 11, 8, GEOM_32x16, 2);
 +
 +void setup()
 +{                         
 +
 +  ledMatrix.clear();​
 +  ledMatrix.pwm(15);​
 +  ledMatrix.plot(0,​ 0, 2); 
 +
 +  analogReference(DEFAULT); ​                         //  Use default (5v) aref voltage.
 +  for (int z=0; z<64; z++) {
 +    maxval[z]=15;​
 +  };       // ​ fill the lastpass[] array with dummy data
 +
 +  // defines for setting and clearing register bits
 +#ifndef cbi
 +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
 +#endif
 +#ifndef sbi
 +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
 +#endif
 +
 +  // set prescale to 16
 +  sbi(ADCSRA,​ADPS2) ;
 +  cbi(ADCSRA,​ADPS1) ;
 +  cbi(ADCSRA,​ADPS0) ;
 +
 +};
 +
 +void loop()
 +{
 +
 +  //if (millis() > tt )
 +  {
 +    ​
 +    //​noInterrupts();​
 +    if (i < 128) {
 +      val = analogRead(1);​
 +      //val = ((log(analogRead(1))*1024)/​log(1024));​
 +      data[i] = val - 512;
 +      im[i] = 0;
 +      i++;
 +    } 
 +    else {
 +      //​interrupts();​
 +      //this could be done with the fix_fftr function without the im array.
 +      //​fft_windowing(data,​7);​
 +      fix_fft(data,​im,​7,​0);​
 +      // I am only interessted in the absolute value of the transformation
 +      ​
 +      bool degrade = (millis() - tt > 100);
 +      if ( degrade ) {
 +        tt = millis();
 +      }
 +      for (i=0; i< 64;i++){
 +        data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
 +        int y = constrain( map(data[i],​ 0, 15, 15, 0) , 0, 15)  ;
 +//        int y = constrain( map( (log( data[i]+1) * 15/​log(15)),​ 0, 15, 15 , 0 ) , 0, 15)  ;
 +
 +        ledMatrix.line(i,​ 0 , i, 15, 0); 
 +        ledMatrix.line(i,​ y , i, 15, 1);              ​
 +        ledMatrix.plot(i,​ y, 3); 
 +        maxval[i] = min(maxval[i],​ y);
 +        ledMatrix.plot(i,​ maxval[i], 2); 
 +        if ( degrade ) {
 +          //maxval[i] = constrain(maxval[i] +1, 0, 15) ;  ​
 +          maxval[i] = maxval[i] + 1 ;        ​
 +        }        ​
 +      }
 +      i = 0;
 +      ​
 +      ​
 +      ledMatrix.sendframe();​
 +    }
 +
 +  }
 +  ​
 +
 +};
 +
 +</​file>​