Project update 3 of 12
Below are some of the FAQs from the first few days of the campaign. If you have any questions about the project don’t hesitate to get in touch! For the next update, we’ll have a look at the MEMs microphone array and how it can be used to change the pickup pattern of the microphones.
The ESP32 is a powerful and flexible microcontroller with a dual core architecture, which allows running different processing threads on each core. Regarding filtering, you could code your filter in C or C++. There are many ways to do this, for example using the Espressif DSP library or using Faust. There are also some example spectrum analyzer projects online you can look at. For the display there are a number of options including using an I2C display or a custom LED display.
The MCU is an ESP32 Pico D4 chip which is clocked at 240 MHz and has FreeRTOS on both cores, so different processing threads can be run on both cores. The ESP32 offers plenty of computational power to run most “standard” DSP algorithms and can run up to 145 sine waves in parallel for a block size of 128 or 256 samples, as discussed in this Faust research paper. Whether a parametric EQ can be made, yes, it is possible, but would depend on the type of filter implementation and how many frequency bands are desired. Here is an Espressif example for a 10 band EQ.
In terms of the audio quality, THD or THD & N, the datasheet for the audio codec specifies for the DAC SNR 98 dB, THD -84 dB (‘A’ weighted @ 48 kHz) and for the ADC SNR 95 dB, THD -84 dB (‘A’ weighted @ 48 kHz). There isn’t a THD & N measurement for the "whole system measurement" or the "Codec plus MCU on the PCB" as yet because I don’t currently have access to an APx Analyzer or similar audio analyzer for this measurement. If I can source one to take an accurate measurement of this, I’ll post an update.
The default pins for an I2C display on the Pico D4 chip are actually not specified in the data-sheet (the default is GPIO21 and GPIO22 on other ESP32 chips). I think this may be because on the ESP32, you can assign any of the GPIO pins as I2C. So, in your code, depending on which library you are using for I2C, you can define the pins as shown in this tutorial for using an OLED display with Arduino IDE and re-assigning the I2C pins.
There are 2 x I2C drivers on the ESP32, one is used on PICO DSP for communicating with the audio codec, but the other driver is not used so you could use it for a display or other I2C devices.
I haven’t tried it in this application as a PC audio driver, but it’s possible it could work. For a driver for the codec in C++, see the
.cpp files in our GitHub repo.
On the PICO DSP, the ESP32 communicates with the WM8978 using I2C and I2S protocols, which may be similar to the ALC1220, these signals are not broken out to the GPIO header however, which could be a problem if you want to route I2S signals directly to the codec. One possible way it could be done, is by using the x2 I2S drivers on ESP32, so you could send the audio data from the MCU on the PC to the GPIO header and then use the other I2S driver on the ESP32 to receive the data. That way, one driver is receiving the input audio data from the PC and the other driver outputs the data to the WM8978 Codec.
Another option can be used achieve the same end result if your PC is networked. PICO DSP has Wi-Fi, so you could stream the audio data over Wi-Fi to it.
Yes this is possible. If the turntable has a line output (i.e., a built-in pre-amp) you can connect it directly to the line input of PICO DSP. Normal phono output from a turntable would need to be connected to an RIAA preamplifier as usual before going into a mixer or speakers. PICO DSP doesn’t have a built-in RIAA pre-amp, although it may be possible to emulate an RIAA EQ curve in software.