ΣSigmaStudio Ask AI Русский Log in

Limiting "ess" sounds in speech with ADAU1701

SigmaDSP & SigmaStudio KJBob Jun 23, 2014 00:00 4 replies Original on forum ↗
Subscribe
KJBob Question
Jun 23, 2014 00:00

Some folks speak with unusually loud "ess" syllables -- a loud hiss, or even a whistle. Combine this with certain microphones that peak at 4KHz, and they can peg the VU meter! This really grates on my ears. Commercial "de-essers" are of course available, but if you're already building an audio project such as an EQ, might as well include this function.

This one works by splitting the audio into three frequency bands. Low and high frequencies pass through unaffected, while the center band (where the nasty syllables occur) are limited if too loud. Using a ratio approach helps isolate the effect from overall level changes over a fairly wide level range -- the only adjustment is for how aggressive you wish the "ess"-killing effect to be. As it turns out, the RMS versions of the compressor and envelope algorithms better differentiate between "esses" compared to vocal harmonics that happen to fall within the mid-frequency band, so that's what I used for the compressor and the envelope follower that drives the Real-Time Display. Of course the latter two blocks are only needed for development purposes. The RMS external input compressor is only available in stereo. The -1701's divide algorithm doesn't mind division by zero should that occur, it effectively clamps its divisor input to 0.0625 if lower than that. If you're using a -145x, add a small offset to the divisor to prevent divide by zero.

My tests show this ess-limiter is safe -- virtually inaudible for normal speech such as a podcast. It's also effective -- it cuts the nastiest "esses" down to human size. The attached project runs on a -1701 mini eval board.

Bob

Audio Signal Processors

ess

ratiometric

SigmaDSP Audio Processors

adau1701

1701

Show More

5148.ec704f4e634d45da6731b7b6ce75c59f.png
5148.ec704f4e634d45da6731b7b6ce75c59f.png
5148.ec704f4e634d45da6731b7b6ce75c59f.png-620x302.png
5148.ec704f4e634d45da6731b7b6ce75c59f.png-620x302.png
KJBob Reply
Jun 28, 2015 00:00

Update -- With a shortage of available instructions, I had to make this design more compact. Originally it used a full-speed divide block feeding an averaging compressor, which wasted some computational power. A home-made divide / lowpass filter both finds the ratio and averages the result, allowing for use of a cheaper, peak-responding compressor. This change saved over 100 instructions, with no sacrifice in performance.

7853.383ad210ad99f299b8bfdf5f57d8560f.png
7853.383ad210ad99f299b8bfdf5f57d8560f.png
7853.383ad210ad99f299b8bfdf5f57d8560f.png-620x200.png
7853.383ad210ad99f299b8bfdf5f57d8560f.png-620x200.png
ADIApproved Reply
Jun 29, 2015 00:00

Hi Bob

This is great as always, but why not just use an RMS dynamics processor? It would most likely perform in a similar way. Am I missing something?

Thanks

Miguel

KJBob Reply
Jun 29, 2015 00:00

Hello Miguel,

This design started out quite simply and then grew to meet performance goals. Then (as SigmaDSP projects often do), it shrank to fit available resources.

The first attempt controlled an external-input compressor with a filter that favors the ess frequency range. This works but suffered two ways: 1. its effect increases with incoming level, and 2. it compressed the entire voice range, causing undesirable artifacts.

This led to the design atop this thread. It applies compression only to the ess frequency range, thus leaving the rest of the voice unchanged. More importantly, it calculates a ratio of ess sound to total sound, providing the same effect over a wide level range. It works so consistently that the final product might do without an effect adjustment! Unfortunately it also ate lots of instructions.

As you know, the Sigma100 divider works by Newton's iterative method. It provides an updated quotient at each and every sample interval, but at a cost of 53 instructions. This application doesn't need instant response, so I substituted a homemade divider, which works by running feedback around a multiplier. Its slow response is actually a bonus here, because it allowed me to use a peak compressor instead of an RMS compressor -- thus saving a few more instructions. An additional change I had forgot to mention above was simplifying the crossover from L-R 48 to L-R 24, which of course brought additional savings.

Best regards,

Bob

3007.9fdafa77f1aa0fbc112d809cc1fba268.png
3007.9fdafa77f1aa0fbc112d809cc1fba268.png
3007.9fdafa77f1aa0fbc112d809cc1fba268.png-532x296.png
3007.9fdafa77f1aa0fbc112d809cc1fba268.png-532x296.png
ADIApproved Reply
Jun 29, 2015 00:00

Got it

Didn't see that you were isolating the esses in your sidechain. I glanced at the schematic and jump right into writing the question (my fault).

Great post. We have considered adding a iterative divider for the Sigma100 and 200 so that it slowly reaches a result as you had done it but simply have not had time.

I'm sure this design will get reused in the future.

Thanks

Miguel