How is it possible to access the gain reduction of a "Dynamics Processor" with a microcontroller ? I need a readback possibility of the actual Gain value. DSP is ADAU1452/1442. Any ideas ?
If the block doesn't expose the gain, then there are 2 ways to read the gain reduction. Question: Is this for display or diagnostic purpuse? If so, do you need to use the gain for some additional realtime purpose? If not, then:
1.- Substract the output signal with the input signal (derived the gain)
2.- Find the location for the calculated gain in the files generated by SigmaStudio and read from the memory location used internall y in SigmaStudio to gain access from it. This will require some reverse engineering of the existing code.
Let me know if this answers your concerns and/or if you need more guidance.
I need the gain information to let a external uC/Software show the status of a noisegate (open/close) or a limiter (gain reduction) to a user.
1. Output minus Input = gain reduction works fine. Except if there is no signal present. Then Output minus Input = 0.
This is equal to no gain reduction. In case of a closed noise gate this obviously gives a wrong information.
2.The Gain Table values are known but not the input of the Gain Table.
As i see the RMS value of a Dynamic Processor is not externally accessible, It is present in the accumulator but there is no Readback mechanism to access it there.
A good solution would be to write the gain reduction from the accumulator to a data ram location. There it can be properly accessed. But this has to be done by AD in the dynamic processor block. It then would appear as a data output in the Dynamic Processor block.
So thanks for the 2 good approaches but it does not really solve my problem.
Understand your concern and agree on the need, unfortunately, this effort and request will probably take a couple of months before having a release available to the public. It comes to mind that when the signal goes below a threshold, you can freeze your gain derivation to cover for that corner case. There are probably other ways to come up with this value by using other blocks or even Dynamic Processors. I do know for a fact that some other compressors in the library do give access to this info.
Do you need us to post some examples?
- the compressor/limiter gain readback can be solved by comparing input and output.
- the noisegate gain readback does not work because of the zero signal problem.
A compressor with a data output unfortunately does not exist in the library.
If you have one please tell me where you found it.
I tried several signal readback methods and found the following:
The envelope rms gives you the squared rms value.
Followed by a log2 and a multiplication gives you the value in dB.
For the zero signal situation the log2 gives the highest positive output instead of the the most negative value.
So you must tweak the log2 input by adding a 1 in 32:0 format.
Next when i checked the time constants Attack/Decay i found they are not in dB/s as mentioned in the help, Instead the Decay is linear Amplitude/s and the Attack something unknown. The GUI Block is labeled k/s for the Decay whatever this means.
Now i adjusted these time constants to Decay in 1 second from 0dB down to -90dB
When i do a readback with the result and show it on a external meterbar it is nice and smooth moving for small signals but with high signals +24dB and more it seems to get stuck in the high levels.
This is because of the linear time constants and the enhanced dynamic range of the adau1452.
There is a workaround for this problem by doing it all yourself with the basic arithmetic functions.
And so it goes on and on....
There is all this graphic meter stuff in the GUI but not one working signal readback possibility for the real world !
I thought SigmaStudio should help me to develop faster real world applications. Instead it looks like the real world is not really the target.
No end user will work with the SigmaStudio GUI. But i as a developer have to provide controls and meters for this end user ( think of a mixing console). I would highly appreciate if the focus will come back to the real world needs.
Anyway thanks for your support
Thank you for your feedback, we'll keep all of it in mind. Practically, it is easier if we focusing in enhancing specific compressors rather than enhancing them all to expose the gain being applied. Can you tell us the specific compressor you are looking to show it's gain? this way we can focus on providing that functionality in the next build (available 1Q 2015) with priority. Do you have schedule?
On a different note, I'm afraid instantaneous knowledge of the gain doesn't always map to what you need to visualize in real life compressors. In many cases, you want to hold values a period of time so that your led's and display react gracefully.
We have qualified 3rd parties that could recommend to you, if you prefer to closely control the deliverable.
We understand your frustrations and are eager to enhance our offerings to further service higher end applications such as yours.
PS. I will double check but I do think there was a compressor / GUI that did expose attenuation values precisely for display needs.
Thanks for your answer.
Actually i am using Dynamics Processor/RMS/Full Range/Ext Detector Input/RMS(no gain) , One Channel.
Standard resolution is also possible but there is no Mono Version available yet.
Ext. Detector input is important to shift the table to the required range.
1Q 2015 would be ok. I already started without the readback.
To PS: I checked my old projects back to AD1940 2006 but i never used a compressor with data output. Maybe you are able to find a hidden gem.
Hello Bernd and Miguel,
SteveL came up with an ingenious way to produce a true exponential decay for a level meter. By applying feedback to a External Decay Peak Detector, he sets up the differential equation dy/dt = - Ky, which solves to y = e^ (-Kt). The original, shown at https://ez.analog.com/message/64727#64727 ran on a -1701, but easily ports to a -1452 as shown:
The result is an exponential decay, which makes an excellent level meter.
I haven't found a compression block that offers a gain reduction (ratio) output, but the limiter block definitely does.
Thanks for this hint. In the link i see that several people are trying to find an easy solution for the signal detection.
It is on the wishlist since 2012 !
For the ADAU1442 i used a "RTA to Output" Level Detector which works with a decay of dB/s . This would do it for signal detection but it is only implemented for the ADAU144x.
@Bob: Since 1442 and 1452 are not so different maybe this could be implemented for the ADAU1452 in the next release ?
Miguel (mmmike) could better answer about future block additions to SigmaStudio then I can, as I'm not with ADI. The ADAU1452 is a third generation ("Sigma 300") DSP which is quite different from all previous SigmaDSPs. Thus it may not be easy for ADI's programmers to port blocks over to it.
KJBob (and SteveL) - Thank you for this block! For peak metering this does a much nicer job than the k/s delay found in the default blocks for the ADAU1452.
Now I'm also trying to implement some average metering. I am using the Envelope RMS block, which has a decay built in (again, k/s). It works, but the k/s decay methodology (when set at its maximum) causes the average meter to decay at a very slow rate from higher amplitudes, which is not intuitive--just like in the peak meter.
I thought that if I could just find a way to gather RMS data without the decay, I could use a mechanism like your Exponential Peak Decay to get a more reasonable decay rate (or even no decay rate). In the SigmaStudio help file, there is a block called "RMS (no: gain, hold, decay)" which would be perfect, but the block is apparently not implemented on the ADAU1452. I looked at using a running average and calculating RMS in separate blocks, but the Running Average block has the decay built in again.
Is anyone aware of a way to calculate a 300ms RMS or running average WITHOUT the built in decay on the 1452?
Perhaps you could try the RMS to DC converter shown below. It computes the RMS value of its input implicitly, using the same principle ADI puts in their analog RMS IC (for how it works, see my post:
A Poor Engineer's Distortion Analyzer). With the 2 V p-p input shown, the output reads 0.71 V as expected.
The circuit's attack and decay times are set by the lowpass filter, which we observe has an exponential decay -- making this RMS-DC converter suitable for level metering.
Here's another idea: Employ the-1452's unique slew volume control as a dynamics processor. This involves flopping its inputs -- placing DC into its audio input, and rectified audio into its control input. This allows us to choose a wide variety of independent up and down time responses. As shown below, the highpass filter feeds a standard RMS average block, set as fast as it goes. Its output drives the slew volume's control input. The slew volume block is where you set the actual dynamics. You can vary the attack and decay numbers on the fly, while changing the algorithms (by clicking its blue squares) may require a Link-Compile-Download to become effective.
Above, the slew block's controls are set for a slow response -- thus with dance music applied, the graph moves slowly. Setting the block for a faster response results in the response shown below. You can experiment with the various algorithms the slew volume block provides. For help with the -1452 slew volume block, see https://ez.analog.com/message/165526#165526
Thank you KJBob! I will give both of these a try and report back on how it goes. I do appreciate the help!
Which one worked for you?
I got another issue with this Dynamic processor for ADAU1452. It seems like there is no change when the input level is compressed. I adjust the volume control, there is no effect on the graph shown at the compressor output. @
Retrieving data ...