10
\$\begingroup\$

I've heard that the ESP32's ADC isn't "good" enough for audio purposes. It's a 12-bit SAR ADC with a sampling rate of 200 ksps which is much higher than most consumer products use (44.1 kHz). Does 200 ksps not correlate to a 200 kHz sampling rate? I couldn't find much in the datasheet about calculation times. What am I missing?

\$\endgroup\$
8
  • 6
    \$\begingroup\$ The resolution could be an issue, most consumer audio is 16bits or higher \$\endgroup\$
    – chamod
    Nov 6, 2020 at 6:58
  • 6
    \$\begingroup\$ What audio 'purposes' do you need it for? \$\endgroup\$ Nov 6, 2020 at 7:17
  • 2
    \$\begingroup\$ A warm welcome to the site. It's a Q&A site, not a discussion forum, and this is far too vague a question. It's based around a couple of words of nondescript hearsay from completely unreferenced sources. Please edit your question and greatly improve it, explaining specifically and exactly what are you are trying to do and why. The better the quality of your question, the better the quality of the answers you will attract. Again, welcome. \$\endgroup\$
    – TonyM
    Nov 6, 2020 at 7:27
  • 10
    \$\begingroup\$ Define "good enough" ... 12 bit correctly implemented should be in the ballpark of a cassette tape ... not great but some of us survived the 1970s... \$\endgroup\$
    – user16324
    Nov 6, 2020 at 12:40
  • 3
    \$\begingroup\$ I've tried to use ESP8266 ADC for audio. It worked, until I enabled wifi - the radio transmissions make very loud noise in the ADC samples. \$\endgroup\$
    – jpa
    Nov 8, 2020 at 12:10

6 Answers 6

16
\$\begingroup\$

I agree with Justme's answer that the DNL/INL is quite high, and also call your attention to this sentence:

By default, there are ±6% differences in measured results between chips.

This matters less for audio applications where the DC level can be normalised later, but for other applications it will definitely require calibration.

There is also a general concern for any ADC on the same chip as digital circuitry: power supply rejection ratio (PSRR). This is the ability to avoid conducting noise from the power supply into the analog results. Since no mention is made of using an external reference voltage, or separate analog power/ground, or a PSRR number, I suspect this is very bad.

What that is likely to mean that every power burst from the radio side gets conducted straight into the audio.

Ultimately the easiest thing to do is try it; if it's not up to your percieved quality standards, you'll want an external ADC with its own little linear regulator and separate area of the PCB. But the built-in ADC is probably adequate for phone-quality speech or music played through tinny cheap speakers.

\$\endgroup\$
13
\$\begingroup\$

Audio is about more than just sampling rate and bits. Other parameters are significant as well, such as linearity, monotonicity, noise, distortion, etc.

The ESP32 ADC has DNL of +/- 7 counts. It means that for any voltage measured, the result can be wrong by that amount. This already means the ADC may have missing codes and may not be monotonic.

The ADC measurements are also performed while there is a 100nF capacitor filtering a DC signal that is measured.

So while it could be used to sample audio, it would require a lot of analog signal conditioning to filter and buffer the signal into ESP32 with low enough impedance, and perhaps using oversampling and signal processing to get acceptable quality audio that cannot even reach 12 bits.

So it would be far simpler to just connect a simple audio ADC chip to the I2S bus and it would easily exceed CD quality in terms of bits, linearity, SNR and sampling rate.

\$\endgroup\$
2
  • 2
    \$\begingroup\$ What\ does DNL mean? \$\endgroup\$
    – Jacob Lara
    Nov 7, 2020 at 7:40
  • 2
    \$\begingroup\$ If you already have not found it by now, it means differential non-linearity. For more info see Atmel appnote "Understanding ADC Parameters" or Wikipedia page on "Analog-to-digital converter". \$\endgroup\$
    – Justme
    Nov 7, 2020 at 10:27
9
\$\begingroup\$

Dynamic Range expressed as Effective Number of Bits (ENOB) is another way of expressing Signal to Noise Ratio (SNR):

ENOB: SNR = 6.02*N + 1.76 [dB]

So with resolution
N=24 SNR=146dB
N=20 SNR=122dB
N=16 SNR=98dB
N=14 SNR=86dB
N=12 SNR=74dB
N=8 SNR=50dB

We often use this in characterizing the noise floor of an ADC system, where N is the actual number of bits, and ENOB is the "effective" number of bits. A 16-bit system with 92dB SNR from various noise sources, is effectively comparable to a 15-bit system with noise only from quantization error. There are other noise sources besides quantization error, we just use ENOB to express effective number of bits because quantization error is the one noise source that we can never get rid of.

While dB is a general-purpose ratio unit, for audio applications it is related to the Sound Pressure Level or loudness of a sound. At 16-bit resolution, the ratio between the loudest expressible signal sound and the "noise level" of the inherent quantization noise, would be 98dB -- painfully loud. So 16-bits is enough resolution to capture good quality audio, at least in terms of dynamic range.

However, a 12-bit resolution ADC system has at best a signal-to-noise ratio of only 74dB, so while it would be able to capture sound at some level, the background hiss will be noticeable. For telephone it might be acceptable, but for music the background hiss would be objectionable.

\$\endgroup\$
3
  • 3
    \$\begingroup\$ When you are oversampling a signal by a factor of 4 (200 ksa/s instead of 44.1), you can increase your ENOB by 2 additional bits. Surely that’s what OP alludes to when bringin up ”200 ksps which is much higher than most consumer products use”? Granted, even 14 bits isn’t great. \$\endgroup\$
    – jms
    Nov 6, 2020 at 8:14
  • 4
    \$\begingroup\$ @jms You can improve SNR by 1 bit for 4x oversampling, making some reasonable assumptions about the noise. However, it may not improve the spurious or distortion at all. \$\endgroup\$
    – Neil_UK
    Nov 6, 2020 at 8:43
  • \$\begingroup\$ These SNR figures are unreasonable and assume the absence of noise shaping. \$\endgroup\$
    – tobalt
    Dec 29, 2022 at 8:57
8
\$\begingroup\$

There are many calculations here already, so I won't go there and try for a different answer.

Whether the ESP32's ADC is good enough or not depends on what quality audio you want, and the quality of your playback chain.

I experimented a bit and sampled some music with the ADC peripheral on a SAMD21G, not using the full 12 bit, 350 ksps but 12 bit, 32 kHz sampled down to 8 bit.

To my ear, cheap computer speakers playing back the 8-bit, 32 kHz PCM stream sound about the same as when fed with CD-quality music, while the same 8-bit, 32 kHz PCM won't do at all when played on the equipment I normally listen to.

Whether the ESP32's ADC is good enough for audio or not depends on what quality you want to hear, and the quality of the rest of the audio chain. The only way to find out is to try it.

If you have quantifiable expectations though, like "CD-quality", then you can do the math (and then try it).

\$\endgroup\$
3
\$\begingroup\$

There might be another issue with the ESP32 as a systemic one:

aside from your ADC supplying samples, your CPU must be able to do something with these samples, before the next sample happens.

Often, that's no big issue, at least at audio-typical sampling rates: simply have a DMA controller copy the samples from ADC to a RAM buffer, and then regularly process whatever has amassed in that buffer with the CPU.

Now, what could happen in your use case is that there's Wifi-handling firmware that occasionally needs to grab the CPU core, and needs to do a couple calculations, so that the time window to process the buffer before it's full passes.

I don't know whether that's the case in the ESP32 architecture – other Wifi-integrating MCUs do in fact do a couple of things in CPU software that preempts whatever executes on the CPU occasionally.

\$\endgroup\$
5
  • \$\begingroup\$ The ESP32 has two cores, the ESP8266 has one (and I think the latter uses the ADC for WiFi signal strength measurements as well). \$\endgroup\$
    – ocrdu
    Nov 6, 2020 at 15:33
  • \$\begingroup\$ @ocrdu if the core where the ADC is connected to on the ESP32 is never occupied by any time-critical Wifi stuff (e.g. cryptographic challenges etc), then this is no problem \$\endgroup\$ Nov 6, 2020 at 15:40
  • \$\begingroup\$ If I recall correctly, the ESP32 has two ADCs. However, if you have any BLE/WiFi operations, ADC2 is completely turned off. This limits the pins you can connect your input to just ADC1. \$\endgroup\$
    – Gliderman
    Nov 6, 2020 at 20:13
  • \$\begingroup\$ @Gliderman aha! But that would imply that in fact, if both ADCs are attached to the same CPU core, then that CPU core might occasionally be busy with dealing with BLE/WiFi; if ADC2 is shared among the CPU core and the embedded BLE/wifi core, then nto. \$\endgroup\$ Nov 6, 2020 at 20:51
  • \$\begingroup\$ I thought I remembered reading somewhere that BLE/WiFi physically used the ADC2 hardware in its operation, not that it was specifically tied to a core, but I can't seem to find it again with a quick search. Since I last needed ADC and BLE on an ESP32, it appears there's been updates to a GitHub issue on this, which may contain a fix for those interested: github.com/espressif/arduino-esp32/issues/102 \$\endgroup\$
    – Gliderman
    Nov 6, 2020 at 21:04
0
\$\begingroup\$

With the ESP32, you can have 200ksamples/second and 12 bit resolution, using DMA to read this into buffers you'll get 16 bit aligned data.

The problem with the on chip ADC is that it is quite noisy, so put a low ESR big fat capacitor as close as possible to the 3.3V ESP32 power line. 2200uF should be good. There might still be some noise, and it is quite large. For audio you might need something around 40KHz sampling rate, so you can do some low pass filtering on this. The noise is more in the high frequency spectrum range, to my eye it grows above 50KHz, filtering this out and then sampling down the signal by avergaing should give you good results. Surely the quality will be more then satisfactory for recording speech, for music hard to say.

The ESP has two ADCs, but ADC2 is used by WiFi. Although you can occasionally read analog values using ADC2 while WiFi is on, it is not possible to continously record audio. ADC1 has 8 channels, so technically you can maybe split the 200KS of ADC2 to get more audio channels, although I never did this and I don't know what effect this input switching would have on the signal and if it is possible to timely switch input while running ADC on DMA.

I think the for recording high quality music the ESP32 internal ADC is clearly not enough, but it is more than good enough to record some sound that the recording will be understandable for humans, eg. to listen to a voice from microphone and use Google to text to speech to translate in to a text, or to create some VoIP solution.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.