/// <summary> /// Processes one sample. /// </summary> /// <param name="sample">Input sample</param> public float Process(float sample) { var abs = Math.Abs(sample); var xg = abs > 1e-6f ? (float)Scale.ToDecibel(abs) : _minAmplitudeDb; var yg = 0f; switch (_mode) { case DynamicsMode.Limiter: case DynamicsMode.Compressor: { yg = xg < Threshold ? xg : Threshold + (xg - Threshold) / Ratio; break; } case DynamicsMode.Expander: case DynamicsMode.NoiseGate: { yg = xg > Threshold ? xg : Threshold + (xg - Threshold) * Ratio; break; } } var envelope = _envelopeFollower.Process(yg - xg); var gain = (float)Scale.FromDecibel(MakeupGain - envelope); return(sample * gain); }
/// <summary> /// Method for extracting the envelope of a signal /// </summary> /// <param name="signal">Signal</param> /// <param name="attackTime"></param> /// <param name="releaseTime"></param> /// <returns></returns> public static DiscreteSignal Envelope(DiscreteSignal signal, float attackTime = 0.01f, float releaseTime = 0.05f) { var envelopeFollower = new EnvelopeFollower(signal.SamplingRate, attackTime, releaseTime); return(new DiscreteSignal(signal.SamplingRate, signal.Samples.Select(s => envelopeFollower.Process(s)))); }