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);
}
