Describes digitizing the analog signal for pitch detection on Arduino. How the analog signal from the microphone is digitized. Part of the project Arduino Pitch Detector.\(\)
Digitizing the analog signal (microphone.cpp)
The microphone driver determines the value presented at the analog port, using analog-to-digital (ADC) conversion. The driver reads the analog port asynchronously. In this asynchronous approach, the CPU starts the conversion, and moves on to do other things. Once, the a conversion is complete, the ACD converter interrupts the CPU. The CPU postpones what it is doing, reads the conversion result, and returns to whatever it was doing. This way the the CPU doesn’t have to wait for the ADC conversion to complete (typically abt. 832 cycles) [Meettechniek, 2013].
This asynchronous approach, usually requires two buffers. One buffer is written to asynchronously, while the another buffer is being processed. Given that Arduino UNO has a precious 2048 bytes of SDRAM, this code goes through some hoops, so that it only needs one buffer.
The typical sequence of events is:
The application needs audio samples and calls
- The first time
getSamples()is called, it allocates memory for the samples, and starts the sampling. All other times, the samples are probably already available (started another time in step 3).
- The method
getSamples()waits until all samples are available.
- The first time
- The application processes the samples.
Once the application is done with the samples, it calls
- This initiates the interrupt driven process of gathering new samples. It does not wait for the samples.
- The application continues (without accessing the samples) e.g. to display the results.
- Return to step 1.
Once the application, determines the frequency, it starts to take new samples while determining the pitch, determining note level segmentation, and displaying the results. This application uses a sample rate of 9615 samples/s. Refer to
autocorr.cpp for details.