The Arduino Uno is not the ultimate signal processing machine, but it can do some light duty work on burst data. I had trouble finding the maximum sample rate the Uno can support, which is totally critical for most kinds of work.
With native prescale
- Samples, type casts into floats, and stores in an array at about 8929 Hz, or 112 microseconds per read-and-store
- Samples and into stores into an array of unsigned integers (16 bit) at about 8930 Hz, or 112 microseconds per read-and-store
We can step this up quite dramatically by setting the prescale set to 16:
- Samples, type casts into floats, and stores in an array at about 58600 Hz, or 17 microseconds per read-and-store
- Samples and stores into an array of unsigned integers (16 bit) at about 58606 Hz, or 17 microseconds per read-and-store
Pretty close to a 60 KHz sample rate, more than adequate for audio sampling. Of course, the Arduino doesn’t have enough memory to be a serious audio processor, but it is pretty goood.
The forums discuss this, and arrive at a similar conclusion.
#define NSAMP 5000 void setup(){ Serial.begin( 57600); float array_float[ NSAMP]; // float unsigned int array_int[ NSAMP]; // 16 bit unsigned long int micsbegf, micsendf, micsbegi, micsendi; for( int i = 0; i < 2; i++){ if ( i == 1){ // Set prescale to 16, and retry sbi(ADCSRA,ADPS2); cbi(ADCSRA,ADPS1); cbi(ADCSRA,ADPS0); } // Record floats (extra time for type conversion presumably) micsbegf = micros(); for( int i = 1; i < NSAMP; i++){ array_float[ i] = (float)analogRead( A1); } micsendf = micros(); // Record floats (extra time for type conversion presumably) micsbegi = micros(); for( int i = 1; i < NSAMP; i++){ array_int[ i] = analogRead( A1); } micsendi = micros(); if( i == 1){ Serial.println("with prescale set to 16"); } Serial.print("recorded "); Serial.print( NSAMP); Serial.print(" float samples in "); Serial.print(micsendf - micsbegf); Serial.println(" usec"); Serial.print("recorded "); Serial.print( NSAMP); Serial.print(" unsigned integer samples in "); Serial.print(micsendi - micsbegi); Serial.println(" usec"); } } void loop(){ delay( 10); }