- Support for 4x20 LCD Display and large number display
- Brightness and contrast adjustment with remote
- (OPUS/Wolfson WM8741) DAC volume control: remote and rotary encoder
- (OPUS/Wolfson WM8741) DAC random filter selection 1 to 5 with remote
- (OPUS/Wolfson WM8741) DAC upsampling selection (L, M, H -this is the OSR setting)
- I2C level shifting (5V to 3.3V)
- Optimized power-up sequence

Wednesday, May 13, 2009

Digital Volume Control

One of the features enabled by Arduino is Digital Volume Control. The DAC can control volume through its software interface.

In audio, the function of a preamplifier is really just to attenuate its volume (in the post vinyl era) but modern DACs are beginning to do that in the digital domain without sacrificing any sonic detail throughout most of the volume scale. Wadia has a
good paper explaining how this works. To summarize, every 6 dB of attenuation is equivalent of reducing resolution by 1 bit. With 24-bit DACs and 16-bit content (CD content is 16-bit), 8-bits of resolution can be "thrown away" before affecting the data. Therefore with the Wolfson DAC, 48 dB of attenuation is achievable without whatsover impacting the data.

I have implemented the volume control from 0 to 99 dB attenuation. This means that down to -48 dB, the original data is completely retained, and in theory you will start loosing some resolution below this volume level. In practice, CDs have resolution only up to 14-15 bits and therefore there is virtually no loss of fidelity down to -54dB to -60dB of volume attenuation.

PS Audio explains the advantages of controlling the volume in the digital domain in this
post. According to Paul McGowan,
"The rub (with the digital volume control) comes in when we listen to high resolution 24 bit audio, In this case, we are indeed losing some of the bits when we use the control. However, I still prefer using this straight into the power amp vs. a preamp. This is because those last few bits are so far down into the noise area of the system I don’t know if anyone can hear them. Indeed, theoretically this is hampering the dynamic range and losing some of the advantage of the higher bit rates, but from a practical standpoint it doesn’t seem to matter - or if it does, I can’t hear it. Maybe others can."


Anonymous said...

Is the volume control to the WM8741implemented via the I2C bus on the Arduino board, or a seperate bus from the uC? Could not find the reference.

Anonymous said...


The volume control to the WM8741 is implemented in he i2c bus. the uC talks to the DAC through the i2c bus and it also talks to the LCD through the i2c. You will need a 5v to 3.3v level converter because the arduino uses 5v signals and the DAC works with 3.3v signals.