earlephilhower / ESP8266Audio

Arduino library to play MOD, WAV, FLAC, MIDI, RTTTL, MP3, and AAC files on I2S DACs or with a software emulated delta-sigma DAC on the ESP8266 and ESP32
GNU General Public License v3.0
2.01k stars 432 forks source link

No pop sounds #523

Open RomanLut opened 2 years ago

RomanLut commented 2 years ago

Audio wave is centered at the middle level voltage. To output silence, DAC has to output middle voltage (0x8000 sample for 16-bit DAC). PDM or PWM have to output pulses with 50% fill. When sound is not played, pin outputs zero voltage. Thus playback start and stop can cause pop (click) sounds due to instant voltage change from zero to middle (3.3V/2 average). It might not be a problem with external DAC which continue generating middle voltage when I2S is stopped. There is a problem with internal DAC, PDM on ESP32 and software Delta-sigma. Even if we let I2S to run continuously (which is waste of resources), there would be clicks on each sampling rate adjustments. To remove pop sounds, AudioGeneratorI2S and AudioGeneratorI2SNoDac can ramp voltage level from zero voltage to actial sound amplitude on playback start and opposite on stop.

Attached archive contains two sounds with and without clicks. There is no ramp by default. Ramp should be enabled with call: AudioOutputI2SNoDAC->SetRamp(100);

no_pop_sound.zip

(there is a digital noise from Sigma-delta 32).

Implementation: Implementation contains and depends on my other pull request,s especially: https://github.com/earlephilhower/ESP8266Audio/pull/520

On sound start, ramp will start with sound start. More precisely, ramp starts each time sampling rate is set,because sampling rate is changed few samples after mp3 playback start(!). Ideally we should ramp down when sound ends. As we do not know when AutdioGenerator will stop feeding AudioOutput, we have no other option to add a silence period after playback and ramp it down.

Feature is implemented for AudioGeneratorMP3 and AudioGeneratorWAV,sorry. Other generators have to be modified to support playback of bufered samples: https://github.com/earlephilhower/ESP8266Audio/pull/520

MatersM commented 6 months ago

Hi Roman,

I see that your pull requests are open for almost 2 years. I need to fix the pop's as well for a small project. Problem is, I'm not entirely into this git stuff. What would be my best approach.

Thanks in advance.

Kind regards,

Martin

polygontwist commented 2 months ago

My solution so far has been to raise the GAIN after starting and lower it when the sound stops.