Low level signal threshold to mute output
I have an ADAU1701 based system with an op-amp input buffer and an output stage after the DSP so that the entire chain is unity gain. Hence the output stage has a gain of just over 6dB to bring the 0.9Vrms output of the DSP to 2.0Vrms with a 2.0Vrms input signal. Connected to higher gain amplifiers, the steady state noise floor is quite high. What I would like to do is mute the signal inside the DSP when the input signal drops below a certain threshold. I have read the thread thread below and have the mute working.
https://ez.analog.com/message/7669#7669
The problem is that the threshold will not work below a certain input level which is something around 10mV. The noise floor of the entire chain is around 35uV, so I want this threshold to be at the limits of audibility through a typical speaker, likely something around 500uV. You can see that I am a long way off from this target! Any ideas on how to improve the low level resolution of this signal detection method? I would also like the mute function to occur after a certain number of seconds but for the system to "wake up" again as soon as an input signal above the threshold is detected. Your help is greatly appreciated!
Audio Signal Processors
SigmaDSP Audio Processors
adau1701
The running average and "mean-squared" envelopes bottom out and do not have good low-level resolution. Therefore, I would recommend using a peak detection method instead. You could use the peak detection feeding into a delay cell, and have that control a slew volume control with a programmable slew time, so that the peak has to be above a certain level for a short period of time before the volume ramps up.
Thanks Brett.
Your suggestion worked. I still have a minimum threshold of about 800uV, but it's much better than before. Any ideas for detecting even lower thresholds?
Let's see. A peak level of 800 uV would mean a peak-to-peak level of 1600 uV, or 1.6 mV. That's 0.0016 / 3 = 0.0533% of the typical full-scale range of the ADC. Since the full scale maps to 2^24 = ~16 million PCM codes, we can take 0.0533% of ~16 million which is roughly 9000. So, you're basically looking for a signal that spends considerable time with a peak-to-peak amplitude of less than 9000 (in 28.0 format), so that would be a peak amplitude of 4500. I think I did those calculations correctly.
So, here's my proposed solution:
Fullscreen
3b418ab53941c802c87656238a10162a.html
Download
<html><head><title>Jive SBS</title></head>
<body><font face="arial,helvetica,sans-serif">
<b>Error</b><br><font size="-1">
An general error occurred while processing your request.
</font></font></body></html>
Note that I haven't actually been able to test this. Please give it a try and let me know your results.
Basically, I take the absolute value of the peak of the signal. If that value is lower than 4500, then I let a stopwatch run. If the peak level exceeds 4500, then the stopwatch resets. The idea is that the stopwatch will be free to run only when the input does not exceed a certain threshold.
The stopwatch's current count value then goes into a logic cell where it is compared with a duration. I chose 100000 samples (about 1/4 of a second) as an example value. If the input is less than 4500 for 1/4 of a second, then the output of that logic cell will be high, at which point it will output a zero to the slew volume control, muting the output. If at any point the counter then resets, the logic cell will output a one (full-scale), which will allow the signal to be output.
Hi Brett,
Your idea works well, and I am able to get the input signal threshold down to about 200uV. One strange observation is that the threshold level is not consistent between DSP PCBs. I have a production board using the ADAU1701 with basic op-amp input buffers and active output filtering. I'm thinking that subtle differences in grounding arrangements and input stage noise floor are the cause for this variation. I had an idea to put a filter in front of the absolute value block to sense only within a bandwidth of 100Hz-15kHz. However, if I add any filter before the absolute value block the detector no longer functions. Do you any ideas why this might be? I would think that any "valid" audio signal sent to the absolute value block would work.
Thank you yet again for your help!
The noise floor in the system will certainly depend on the PCB layout and other design factors. Keep in mind that 200 uV is something like -80 dB relative to the full scale input level of the ADC, so you're starting to get close to the noise floor of the converter itself (in the mid-90 dB range). Once you start looking at signals that low, where the signal and noise are not that different in level, performing additional filtering operations that limit the bandwidth will further lower the level of the signal. You may start to get to the point where your signal is sitting barely above (or in) the noise floor, at which point the determination between signal and noise becomes difficult or impossible. In other words, I think you're running into the performance limit of the analog signal chain at this point.
Please log in to reply.