Arduino programma.... waar is Dabit als je hem nodog heb :-)

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Arduino programma.... waar is Dabit als je hem nodog heb :-)

Bericht door Swets »

Ik wil met gebruik van een Arduino een soort spectrum analyser dingetje te maken....

nu had ik iets gevonden op internet.... maarja ik krijg alleen maar foutmeldingen... :-) en omdat ik nog niet helemaal op me oude niveau zit met denken , kan ik wel wat hulp gebruiken.....

C:\Users\Arjan\Documents\Arduino\libraries\fix_fft\fix_fft.cpp:50:1: error: stray '\240' in program

deze fout krijg ik heel heel veel keer... :-) zeg me nog ff nix...

ik zal de code even plaatsen:

Code: Selecteer alles


#include <TVout.h>
#include <fix_fft.h>

TVout TV;

char im[128], data[128], lastpass[64];
char x = 32, ylim = 90;
int i = 0, val;
void setup()
{
  TV.begin(_NTSC, 128, 96);                                 // Initialize TV output, 128x96.
//  TV.print_str(2, 2, "Realtime Arduino");                   // TVout lib uses x,y for print
//  TV.print_str(2, 11, "Spectrum Analyzer");                 // statements. 8x8 default font.
  analogReference(DEFAULT);                                 // Use default (5v) aref voltage.
  for (int z = 0; z < 64; z++) {
    lastpass[z] = 80;
  };                                                        // fill the lastpass[] array with dummy data
};
void loop()
{
  for (i = 0; i < 128; i++) {                               // We don't go for clean timing here, it's
    val = analogRead(0);                                    // better to get somewhat dirty data fast
    data[i] = val / 4 - 128;                                // than to get data that's lab-accurate
    im[i] = 0;                                              // but too slow, for this application.
  };

  fix_fft(data, im, 7, 0);

  for (i = 1; i < 64; i++) {                                // In the current design, 60Hz and noise
    data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);      // in general are a problem.� Future designs
    TV.draw_line(i + x, lastpass[i], i + x, ylim, 0);       // and code may fix this, but for now, I
    TV.draw_line(i + x, ylim, i + x, ylim - data[i], 1);    // skip displaying the 0-500hz band completely.
    lastpass[i] = ylim - data[i];                           // if you insist, initialize the loop with 0
  };                                                        // rather than 1.
};
fix_ffy.cpp

Code: Selecteer alles

#include <avr/pgmspace.h>
#include "fix_fft.h"
#include <Arduino.h>

/* fix_fft.c - Fixed-point in-place Fast Fourier Transform  */
/*
 All data are fixed-point short integers, in which -32768
 to +32768 represent -1.0 to +1.0 respectively. Integer
 arithmetic is used for speed, instead of the more natural
 floating-point.

 For the forward FFT (time -> freq), fixed scaling is
 performed to prevent arithmetic overflow, and to map a 0dB
 sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq
 coefficients. The return value is always 0.

 For the inverse FFT (freq -> time), fixed scaling cannot be
 done, as two 0dB coefficients would sum to a peak amplitude
 of 64K, overflowing the 32k range of the fixed-point integers.
 Thus, the fix_fft() routine performs variable scaling, and
 returns a value which is the number of bits LEFT by which
 the output must be shifted to get the actual amplitude
 (i.e. if fix_fft() returns 3, each value of fr[] and fi[]
 must be multiplied by 8 (2**3) for proper scaling.
 Clearly, this cannot be done within fixed-point short
 integers. In practice, if the result is to be used as a
 filter, the scale_shift can usually be ignored, as the
 result will be approximately correctly normalized as is.

 Written by:  Tom Roberts  11/8/89
 Made portable:  Malcolm Slaney 12/15/94 malcolm@interval.com
 Enhanced:  Dimitrios P. Bouras  14 Jun 2006 dbouras@ieee.org
 Modified for 8bit values David Keller  10.10.2010
*/


#define N_WAVE      256    /* full length of Sinewave[] */
#define LOG2_N_WAVE 8      /* log2(N_WAVE) */




/*
 Since we only use 3/4 of N_WAVE, we define only
 this many samples, in order to conserve data space.
*/



const prog_int8_t Sinewave[N_WAVE-N_WAVE/4] PROGMEM = {
0, 3, 6, 9, 12, 15, 18, 21, 
24, 28, 31, 34, 37, 40, 43, 46, 
48, 51, 54, 57, 60, 63, 65, 68, 
71, 73, 76, 78, 81, 83, 85, 88, 
90, 92, 94, 96, 98, 100, 102, 104, 
106, 108, 109, 111, 112, 114, 115, 117, 
118, 119, 120, 121, 122, 123, 124, 124, 
125, 126, 126, 127, 127, 127, 127, 127, 

127, 127, 127, 127, 127, 127, 126, 126, 
125, 124, 124, 123, 122, 121, 120, 119, 
118, 117, 115, 114, 112, 111, 109, 108, 
106, 104, 102, 100, 98, 96, 94, 92, 
90, 88, 85, 83, 81, 78, 76, 73, 
71, 68, 65, 63, 60, 57, 54, 51, 
48, 46, 43, 40, 37, 34, 31, 28, 
24, 21, 18, 15, 12, 9, 6, 3, 

0, -3, -6, -9, -12, -15, -18, -21, 
-24, -28, -31, -34, -37, -40, -43, -46, 
-48, -51, -54, -57, -60, -63, -65, -68, 
-71, -73, -76, -78, -81, -83, -85, -88, 
-90, -92, -94, -96, -98, -100, -102, -104, 
-106, -108, -109, -111, -112, -114, -115, -117, 
-118, -119, -120, -121, -122, -123, -124, -124, 
-125, -126, -126, -127, -127, -127, -127, -127, 

/*-127, -127, -127, -127, -127, -127, -126, -126, 
-125, -124, -124, -123, -122, -121, -120, -119, 
-118, -117, -115, -114, -112, -111, -109, -108, 
-106, -104, -102, -100, -98, -96, -94, -92, 
-90, -88, -85, -83, -81, -78, -76, -73, 
-71, -68, -65, -63, -60, -57, -54, -51, 
-48, -46, -43, -40, -37, -34, -31, -28, 
-24, -21, -18, -15, -12, -9, -6, -3, */
};






/*
 FIX_MPY() - fixed-point multiplication & scaling.
 Substitute inline assembly for hardware-specific
 optimization suited to a particluar DSP processor.
 Scaling ensures that result remains 16-bit.
*/
inline char FIX_MPY(char a, char b)
{
 
 //Serial.println(a);
//Serial.println(b);
 
 
   /* shift right one less bit (i.e. 15-1) */
   int c = ((int)a * (int)b) >> 6;
   /* last bit shifted out = rounding-bit */
   b = c & 0x01;
   /* last shift + rounding bit */
   a = (c >> 1) + b;

       /*
       Serial.println(Sinewave[3]);
       Serial.println(c);
       Serial.println(a);
       while(1);*/

   return a;
}

/*
 fix_fft() - perform forward/inverse fast Fourier transform.
 fr[n],fi[n] are real and imaginary arrays, both INPUT AND
 RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
 0 for forward transform (FFT), or 1 for iFFT.
*/
int fix_fft(char fr[], char fi[], int m, int inverse)
{
   int mr, nn, i, j, l, k, istep, n, scale, shift;
   char qr, qi, tr, ti, wr, wi;

   n = 1 << m;

   /* max FFT size = N_WAVE */
   if (n > N_WAVE)
       return -1;

   mr = 0;
   nn = n - 1;
   scale = 0;

   /* decimation in time - re-order data */
   for (m=1; m<=nn; ++m) {
       l = n;
       do {
           l >>= 1;
       } while (mr+l > nn);
       mr = (mr & (l-1)) + l;

       if (mr <= m)
           continue;
       tr = fr[m];
       fr[m] = fr[mr];
       fr[mr] = tr;
       ti = fi[m];
       fi[m] = fi[mr];
       fi[mr] = ti;
   }

   l = 1;
   k = LOG2_N_WAVE-1;
   while (l < n) {
       if (inverse) {
           /* variable scaling, depending upon data */
           shift = 0;
           for (i=0; i<n; ++i) {
               j = fr[i];
               if (j < 0)
                   j = -j;
               m = fi[i];
               if (m < 0)
                   m = -m;
               if (j > 16383 || m > 16383) {
                   shift = 1;
                   break;
               }
           }
           if (shift)
               ++scale;
       } else {
           /*
             fixed scaling, for proper normalization --
             there will be log2(n) passes, so this results
             in an overall factor of 1/n, distributed to
             maximize arithmetic accuracy.
           */
           shift = 1;
       }
       /*
         it may not be obvious, but the shift will be
         performed on each data point exactly once,
         during this pass.
       */
       istep = l << 1;
       for (m=0; m<l; ++m) {
           j = m << k;
           /* 0 <= j < N_WAVE/2 */
           wr =  pgm_read_word_near(Sinewave + j+N_WAVE/4);

/*Serial.println("asdfasdf");
Serial.println(wr);
Serial.println(j+N_WAVE/4);
Serial.println(Sinewave[256]);

Serial.println("");*/


           wi = -pgm_read_word_near(Sinewave + j);
           if (inverse)
               wi = -wi;
           if (shift) {
               wr >>= 1;
               wi >>= 1;
           }
           for (i=m; i<n; i+=istep) {
               j = i + l;
               tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
               ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
               qr = fr[i];
               qi = fi[i];
               if (shift) {
                   qr >>= 1;
                   qi >>= 1;
               }
               fr[j] = qr - tr;
               fi[j] = qi - ti;
               fr[i] = qr + tr;
               fi[i] = qi + ti;
           }
       }
       --k;
       l = istep;
   }
   return scale;
}

/*
 fix_fftr() - forward/inverse FFT on array of real numbers.
 Real FFT/iFFT using half-size complex FFT by distributing
 even/odd samples into real/imaginary arrays respectively.
 In order to save data space (i.e. to avoid two arrays, one
 for real, one for imaginary samples), we proceed in the
 following two steps: a) samples are rearranged in the real
 array so that all even samples are in places 0-(N/2-1) and
 all imaginary samples in places (N/2)-(N-1), and b) fix_fft
 is called with fr and fi pointing to index 0 and index N/2
 respectively in the original array. The above guarantees
 that fix_fft "sees" consecutive real samples as alternating
 real and imaginary samples in the complex array.
*/
int fix_fftr(char f[], int m, int inverse)
{
   int i, N = 1<<(m-1), scale = 0;
   char tt, *fr=f, *fi=&f[N];

   if (inverse)
       scale = fix_fft(fi, fr, m-1, inverse);
   for (i=1; i<N; i+=2) {
       tt = f[N+i-1];
       f[N+i-1] = f[i];
       f[i] = tt;
   }
   if (! inverse)
       scale = fix_fft(fi, fr, m-1, inverse);
   return scale;
}
fix_fft.h

Code: Selecteer alles



#ifndef FIXFFT_H
#define FIXFFT_H

#include <Arduino.h>




/*
 fix_fft() - perform forward/inverse fast Fourier transform.
 fr[n],fi[n] are real and imaginary arrays, both INPUT AND
 RESULT (in-place FFT), with 0 <= n < 2**m; set inverse to
 0 for forward transform (FFT), or 1 for iFFT.
*/
int fix_fft(char fr[], char fi[], int m, int inverse);



/*
 fix_fftr() - forward/inverse FFT on array of real numbers.
 Real FFT/iFFT using half-size complex FFT by distributing
 even/odd samples into real/imaginary arrays respectively.
 In order to save data space (i.e. to avoid two arrays, one
 for real, one for imaginary samples), we proceed in the
 following two steps: a) samples are rearranged in the real
 array so that all even samples are in places 0-(N/2-1) and
 all imaginary samples in places (N/2)-(N-1), and b) fix_fft
 is called with fr and fi pointing to index 0 and index N/2
 respectively in the original array. The above guarantees
 that fix_fft "sees" consecutive real samples as alternating
 real and imaginary samples in the complex array.
*/
int fix_fftr(char f[], int m, int inverse);




#endif
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
DaBit
Donateur
Berichten: 11032
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door DaBit »

DaBit zat in de schuur op een Pi te hakketakken terwijl de frees z'n rondjes draaide :mrgreen:

Die 'stray \240' zijn waarschijnlijk rotte karakters in je download.
Doe eens 'select all' in de textboxjes die je hier gepost hebt, kopieer het naar een editor, en sla die files op. Dan ben je wel van die rotte karakters af.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

ja... dat heeft al heel erg geholpen.... :-) bedankt....

ik stoei ff verder.....

oja, had trouwens vandaag me laatste bestraling..... dus we gaan nu weer proberen gewoon verder te gaan met leven.....

Afbeelding


nu nog iets leuk voor me masker verzinnen!!
Afbeelding
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
DaBit
Donateur
Berichten: 11032
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door DaBit »

Sterke d'r mee kerel!
Tenzij er nog tegenbericht komt mag ik me morgen melden in het slachthuis. Dan lig ik er ook een tijdje uit.

Dat masker is volgens mij gemaakt van voor de hobby hoogst bruikbare kunststof. Als je dat in een bak warm water mikt word het zo zacht als doek. Dus tegen de tijd dat de sentimentele waarde afzwakt kan-ie nog een ander doel dienen.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
hainjedaf
Donateur
Berichten: 2441
Lid geworden op: 01 aug 2011 10:01
Locatie: Amsterdam
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door hainjedaf »

Sterkte en beterschap Swets en DaBit
Met vriendelijke groet,
Marout Sluijter-Borms,
Amsterdam

Prusa Mini+ Wifi & X1 Carbon met X1Plus
Sparren en tinkeren met iedereen en over alles wat techniek is.
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

waarvoor moet je naar het ziekenhuis....?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

Ik wil een spectrum analyzer maken (niet echt een super prof apparaat, meer voor de gein) met een Arduino en dan voor de banden
63-125-250-500-1K-2K-4K-8K-16K...

ik heb vroeger eens iets gemaakt met een PIC micro, maar toen heb ik eigenlijk allemaal filtertjes gebouwd..... en toen zei iemand ... nee dat moet je met FFT doen....
maar zover is mijn wiskunde nooit geweest....

dus (Dabit) kan je me ff een kontje geven...

die source die hier boven staat heb ik ergens van internet geplukt....
dat TV gedeelte krijg ik er wel uit....

ik snap ook dat ik een array heb met 128 getallen...

maar hoe haal ik er nu uit wat 63-125-250 enz enz is?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Breaker
Donateur
Berichten: 1961
Lid geworden op: 26 mei 2015 22:43
Locatie: Nabij Antwerpen
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Breaker »

Alhoewel het niet voor mij bedoeld is, heb ik toch stiekem even gekeken. ;-)

FFT werkt met met het opdelen van het bereik in gelijke banden (die bin's worden genoemd) dus niet 1, 2, 4, 8, enz. maar 1, 2, 3, 4, enz.
// In the current design, 60Hz and noise
// in general are a problem. Future designs
// and code may fix this, but for now, I
// skip displaying the 0-500hz band completely.
// if you insist, initialize the loop with 0
// rather than 1.
Hier wordt gesuggereerd dat een band 500 Hz is, er zijn er 64 en het bereik is dan 32 kHz. Wil je 1 kHz, dan lees je de waarde [2] uit, wil je 16 kHz dan [32] met deze formule.

Code: Selecteer alles

data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
Er zijn dus geen 128 eindwaarden want FFT gebruikt twee input waarden per output.

Het lijkt niet dat je met deze library een sample rate kan instellen dus of het qua Hertzen per band allemaal klopt zal je moeten bepalen door tijd van het uitlezen van de sample te meten. Beïnvloeden naar het juiste bereik en resolutie kan ook wel eens lastig zijn. Er zijn ook nog andere libraries maar om mee te spelen is deze zeker leuk:
Geduld is een schone zaak, frezen niet...
Gebruikersavatar
DaBit
Donateur
Berichten: 11032
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door DaBit »

Swets schreef:ik heb vroeger eens iets gemaakt met een PIC micro, maar toen heb ik eigenlijk allemaal filtertjes gebouwd..... en toen zei iemand ... nee dat moet je met FFT doen....
maar zover is mijn wiskunde nooit geweest....

dus (Dabit) kan je me ff een kontje geven...
Filtertjes zijn nog steeds geen slecht idee als de Arduino dat trekt. Nadeel van de meeste FFT-gebaseerde spectrum analysers is dat het scherm maar wat doet ten opzichte van de muziek omdat het zwaar achterloopt. Met complementaire (FIR-)halfbandfilters kun je dat mooier oplossen. 0-20kHz band opsplitsen in een 0-10kHz deel en 10-20kHz deel. Samplerate voor beiden halveren; er zit immers nog maar de helft van de frequentieinhoud in. 0-10kHz weer filteren in 0-5kHz en 5-10kHz. Samplerate weer halveren. Enzovoorts tot je de gewenste banden overhoud, dus 0-5kHz wil je nog een paar keer opsplitsen en 10-20kHz eigenlijk helemaal niet.
Omdat je elke keer de samplerate halveert halveer je ook het rekenwerk voor de volgende filters.

Magoed, da's een leuke voor als je FFT-gebaseerde werkt; er zitten nog een paar extra grappen en grollen aan vast. Wil je doodgegooid worden met wiskunde dan kun je googelen op quadrature mirror filter.
maar hoe haal ik er nu uit wat 63-125-250 enz enz is?
De frequentiebanden zijn lineair verdeeld. Dus stel, ik zou een 100-punts DFT doen (een FFT is een speciaal gevalletje Discrete Fourier Transformatie) op data gesampled met 20kHz.
Samplen met 20kHz betekent dat de frequenties 0-10kHz te onderscheiden zijn (Nyquist-Shannon bemonsteringstheorema). De 100-punts transformatie deelt het op in bandjes die dan allemaal 10000/100=100Hz breed zijn. Dus de eerste is 0-100Hz, de tweede 100-200Hz, etc.
De getalletjes in je array zijn dus een maat voor hoe hard elke 1/128ste van je hele spectrum aanwezig is.

Nu produceert zo'n fouriertransformatie complexe getallen, jij bent enkel geinteresseerd in de absolute grootte, en daar komt die val=sqrt (re^2 + im^2) vandaan.

Nadeel voor een spectrumanalyser is dat je 'bovenin' veel te veel bandjes hebt en je die uit moet middelen, terwijl je er 'onderin' niet genoeg hebt om 50Hz van 100Hz te onderscheiden.

Verder vind ik zo'n Arduino met AVR niet zo'n geweldige keuze voor dit doel. Dan kun je beter eens spelen met een mBed of iets dergelijks.

Of zoiets leuks; voor 25 euro heb je een 100MHz 32-bit processor met ingebouwde signaalprocessor, audio-codec waar je meteen je geluid op kunt zetten, microfoontjes op de print, en zelfs een schermpje om je spectrum op af te beelden.
Zou me niks verbazen als je het mBed gebeuren daar ook op aan de gang kunt krijgen, en dan is het niet ingewikkelder dan een Arduino. Maar Hugo en Hainjedaf zijn de mBed-experts hiero; ik weet enkel dat het bestaat.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

Swets schreef:Ik wil een spectrum analyzer maken (niet echt een super prof apparaat, meer voor de gein) met een Arduino en dan voor de banden
63-125-250-500-1K-2K-4K-8K-16K...

ik heb vroeger eens iets gemaakt met een PIC micro, maar toen heb ik eigenlijk allemaal filtertjes gebouwd..... en toen zei iemand ... nee dat moet je met FFT doen....
maar zover is mijn wiskunde nooit geweest....

dus (Dabit) kan je me ff een kontje geven...

die source die hier boven staat heb ik ergens van internet geplukt....
dat TV gedeelte krijg ik er wel uit....

ik snap ook dat ik een array heb met 128 getallen...

maar hoe haal ik er nu uit wat 63-125-250 enz enz is?
nou tis niet alleen voor DaBit... maar ik weet dat die super slim is... maar alle andere slimmers mogen natuurlijk inhaken... :-)
dus met dit verhaal begint het pas bij 500hz... 53,125 en 250 zijn er dus helemaal niet uit te lezen?

en het verhaal van DaBit ga ik nog even 4x lezen... :-)
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Breaker
Donateur
Berichten: 1961
Lid geworden op: 26 mei 2015 22:43
Locatie: Nabij Antwerpen
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Breaker »

Swets schreef:dus met dit verhaal begint het pas bij 500hz... 53,125 en 250 zijn er dus helemaal niet uit te lezen?
Ik vond de 32kHz toch een beetje een vreemde claim. Dus ik heb een timing routine om de sampling en FFT heengezet en bij verschillende bin groottes getest:

Code: Selecteer alles

Elements/Bins (#/#): 256/128 / Cycles: 10000 / Average Sample Time (us): 288
Elements/Bins (#/#): 256/128 / Sample Rate (Samples/s): 3472 / Bandwidth (Hz): 1736.00 / Resolution (Hz/bin): 13.56

Elements/Bins (#/#): 128/64 / Cycles: 10000 / Average Sample Time (us): 277
Elements/Bins (#/#): 128/64 / Sample Rate (Samples/s): 3610 / Bandwidth (Hz): 1805.00 / Resolution (Hz/bin): 28.20

Elements/Bins (#/#): 64/32 / Cycles: 10000 / Average Sample Time (us): 260
Elements/Bins (#/#): 64/32 / Sample Rate (Samples/s): 3846 / Bandwidth (Hz): 1923.00 / Resolution (Hz/bin): 60.09

Elements/Bins (#/#): 32/16 / Cycles: 10000 / Average Sample Time (us): 235
Elements/Bins (#/#): 32/16 / Sample Rate (Samples/s): 4255 / Bandwidth (Hz): 2127.50 / Resolution (Hz/bin): 132.97

Elements/Bins (#/#): 16/8 / Cycles: 10000 / Average Sample Time (us): 211
Elements/Bins (#/#): 16/8 / Sample Rate (Samples/s): 4739 / Bandwidth (Hz): 2369.50 / Resolution (Hz/bin): 296.19

Elements/Bins (#/#): 8/4 / Cycles: 10000 / Average Sample Time (us): 126
Elements/Bins (#/#): 8/4 / Sample Rate (Samples/s): 7936 / Bandwidth (Hz): 3968.00 / Resolution (Hz/bin): 992.00
Maximaal haalbare is 4kHz bereik bij een 1kHz resolutie! En dit is een kale routine; er wordt nog niets met de data gedaan! Ga je naar de maximale 128 bins dan is de resolutie 13Hz en het bereik 1,7 kHz.

Voor foutcontrole, en anders mogelijk te gebruiken op de eigen Arduino voor het bepalen van het beste bereik/resolutie voor je toepassing:

Code: Selecteer alles

#include <fix_fft.h>

// Spectrum Analyzer variables
char im[128];               // Define array size, should be twice 'bins' size and same as 'data' size
char data[128];             // Define array size, should be twice 'bins' size and same as 'im' size
int m=7;                    // Corresponds with data array in bits (256->8, 128->7, ... , 4->2)
int bins = 64;              // Corresponds with half the array size
int fixedtime = 0;          // Sample time in microseconds (minimum ~290@256, ~280@128, ~260@64, ~240@32, ~210@16, ~130@8), if 0 no fixed sample time  
int cyclecount = 10000;     // Reduce waiting for averages (default 10000, change to 1000 or lower when fixedtime over 1000 microseconds)                  

// Sample measurement variables 
unsigned long cycletime=0;
long cycle = 0;
String markupa;
String markupb;

void setup(){
    // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

void loop() {
  int static i = 0;
  static long tt = 0;
  int val;
 
 // Routine for fixed sample time, comment section out for optimal speed (+5%) 
  if (micros() > tt) { 
    if (fixedtime>0) {
    tt=micros()+fixedtime;
  } else {
     tt=0;
  }

// Routine for collecting sample input and FFT 
    if (i < (bins*2)) {
      val = analogRead(A0);
      data[i] = val / 4 - (bins*2);
      im[i] = 0;
      i++;  
    } else { 
      //this could be done with the fix_fftr function without the im array.
      fix_fft(data,im,m,0);
      // I am only interested in the absolute value of the transformation
      for (i=0; i< (bins);i++) {
        data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
      }  
      //do something with the data values 1..64 and ignore im
      //show_big_bars(data,0);
    } 
// Routine te determine sample rate
    cycle++;
    if (cycle==cyclecount) {
      cycletime=micros()-cycletime;
      markupa = "Elements/Bins (#/#): " + String(bins*2) + "/" + String(bins) + " / Cycles: " + String(cycle) + " / Average Sample Time (us): " + String(cycletime/cycle); 
      Serial.println(markupa);
      markupb = "Elements/Bins (#/#): " + String(bins*2) + "/" + String(bins) + " / Sample Rate (Samples/s): " + String(1000000/(cycletime/cycle)) + " / Bandwidth (Hz): " + String((1000000/(cycletime/cycle))/2.0) + " / Resolution (Hz/bin): " + String(((1000000/(cycletime/cycle))/2.0)/bins); 
      Serial.println(markupb);
      cycle=0;
      cycletime=micros();
    }   
 }  // Option for fixed sample time, comment line out for optimal speed (+5%)
} 
Swets schreef:en het verhaal van DaBit ga ik nog even 4x lezen... :-)
Geeft weer interessante nieuwe inzichten voor mij iig, dus dat zou ik zeker doen, want ik weet niet wat je doel is maar als dit niet voldoet zijn dat alternatieven.
Geduld is een schone zaak, frezen niet...
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

Swets schreef:Geeft weer interessante nieuwe inzichten voor mij iig, dus dat zou ik zeker doen, want ik weet niet wat je doel is maar als dit niet voldoet zijn dat alternatieven.
nou... wil gewoon leuke knipperende ledjes.... :-)

maar misschien is die Arduino dan niet goed genoeg....

ik heb ook nog een:

https://xdevs.com/review/terasic_mmk/
Afbeelding

en een :

Afbeelding

die heb ik eens in het verleden aangeschaft... maar naar een paar looplichtjes... en van dat soort simpele spul , eigenlijk meer door te gebrek nooit iets mee gedaan....
en als ik iets nodig had... pakte ik meestal een Pic micro.... en nu vaak een Ardruino lekker makkelijk....

maar de bovenstaande bordjes.... daar moet het toch wel mee lukken? hoop dat jullie daar ook een beetje kaas van hebben gegeten? want ik weet er bijna (nog) niets van...
ik wil wat gaan doen met die WS2812 ledjes.....
ga eerst de nieuwe IDE eens downloaden... en kijken of ik die aan het werk krijg....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
DaBit
Donateur
Berichten: 11032
Lid geworden op: 05 dec 2012 13:48
Locatie: Oss

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door DaBit »

Dan is die Cyclone II de beste keus. Daar moet het zeker wel mee lukken, en de timing voor de neopixels is met zo'n ding ook het probleem niet.
De belangrijkste wet in de wetenschap: 'hoe minder efficient en hoe meer herrie, hoe leuker het is'
Gebruikersavatar
Swets
Berichten: 2662
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Arduino programma.... waar is Dabit als je hem nodog heb

Bericht door Swets »

DaBit schreef:Dan is die Cyclone II de beste keus. Daar moet het zeker wel mee lukken, en de timing voor de neopixels is met zo'n ding ook het probleem niet.
en met die andere niet...
vind die DE1 zo zonde... :-)

de DE-nano is wel een oudje.....
vind ik nie zo zonde om hem straks bijvoorbeeld voor iets blijvends te gebruiken.....

maar eerst eens kijken of ik alle software kan vinden en aan de gang kan krijgen.....

(heb ik met frezen ook.... heb ik heel veel materiaal.... en ik heb altijd dat ik het zonde vind om het te gebruiken... :-) )
http://www.arjan-swets.com (met cnc filmpjes)
Plaats reactie