1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-04-29 15:19:44 +02:00

Add Compressor2 realtime debugging utilities.

Signed-off-by: Max Maisel <max.maisel@posteo.de>
This commit is contained in:
Max Maisel 2020-05-27 21:13:55 +02:00
parent aa619de49c
commit dfffeb76dc
3 changed files with 140 additions and 1 deletions

View File

@ -0,0 +1,63 @@
## plot realtime trace data from Compressor2 effect
stereo = true;
bfile = fopen("/tmp/audio.out");
if stereo
width = 15;
else
width = 13;
end
raw_data = reshape(fread(bfile, 'float'), width, []).';
data = struct;
data.threshold_DB = raw_data(:,1);
data.ratio = raw_data(:,2);
data.kneewidth_DB = raw_data(:,3);
data.attack_time = raw_data(:,4);
data.release_time = raw_data(:,5);
data.lookahead_time = raw_data(:,6);
data.lookbehind_time = raw_data(:,7);
data.makeup_gain_pct = raw_data(:,8);
data.dry_wet_pct = raw_data(:,9);
if stereo
data.in = horzcat(raw_data(:,10), raw_data(:,11));
data.env = raw_data(:,12);
data.gain = raw_data(:,13);
data.out = horzcat(raw_data(:,14), raw_data(:,15));
else
data.in = raw_data(:,10);
data.env = raw_data(:,11);
data.gain = raw_data(:,12);
data.out = raw_data(:,13);
end
figure(1);
plot(data.in.*100, 'b');
hold on;
plot(data.out.*100, 'g');
plot(data.threshold_DB, 'r');
plot(data.ratio, 'r');
plot(data.kneewidth_DB, 'r');
plot(data.attack_time.*10, 'c', "linewidth", 2);
plot(data.release_time.*10, 'c', "linewidth", 2);
plot(data.lookahead_time, 'm');
plot(data.lookbehind_time, 'm');
plot(data.makeup_gain_pct, 'r');
plot(data.dry_wet_pct, 'r');
plot(data.env.*100, 'k', "linewidth", 2);
plot(data.gain.*50, 'k', "linestyle", '--');
hold off;
grid;
if stereo
legend("in*100", "in*100", "out*100", "out*100", "threshold", "ratio", ...
"kneewidth", "attack*10", "release*10", "lookahead", "lookbehind", ...
"makeup", "dry/wet", "env*100", "gain*50");
else
legend("in*100", "out*100", "threshold", "ratio", ...
"kneewidth", "attack*10", "release*10", "lookahead", "lookbehind", ...
"makeup", "dry/wet", "env*100", "gain*50");
end

View File

@ -41,10 +41,12 @@
//#define DEBUG_COMPRESSOR2_DUMP_BUFFERS
//#define DEBUG_COMPRESSOR2_ENV
//#define DEBUG_COMPRESSOR2_TRACE
//#define DEBUG_COMPRESSOR2_TRACE2
#ifdef DEBUG_COMPRESSOR2_DUMP_BUFFERS
#if defined(DEBUG_COMPRESSOR2_DUMP_BUFFERS) or defined(DEBUG_COMPRESSOR2_TRACE2)
#include <fstream>
int buf_num;
std::fstream debugfile;
#endif
enum kAlgorithms
@ -243,6 +245,15 @@ EnvelopeDetector::EnvelopeDetector(size_t buffer_size)
{
}
float EnvelopeDetector::AttackFactor()
{
return 0;
}
float EnvelopeDetector::DecayFactor()
{
return 0;
}
float EnvelopeDetector::ProcessSample(float value)
{
float retval = mProcessedBuffer[mPos];
@ -386,6 +397,15 @@ Pt1EnvelopeDetector::Pt1EnvelopeDetector(
SetParams(rate, attackTime, releaseTime);
}
float Pt1EnvelopeDetector::AttackFactor()
{
return mAttackFactor;
}
float Pt1EnvelopeDetector::DecayFactor()
{
return mReleaseFactor;
}
void Pt1EnvelopeDetector::SetParams(
float sampleRate, float attackTime, float releaseTime)
{
@ -577,6 +597,12 @@ bool EffectCompressor2::RealtimeAddProcessor(
mPreproc = InitPreprocessor(mSampleRate);
mEnvelope = InitEnvelope(mSampleRate, mPipeline[0].size);
mProgressVal = 0;
#ifdef DEBUG_COMPRESSOR2_TRACE2
debugfile.close();
debugfile.open("/tmp/audio.out", std::ios::trunc | std::ios::out);
#endif
return true;
}
@ -590,6 +616,9 @@ bool EffectCompressor2::RealtimeFinalize()
mLookaheadTimeCtrl->Enable(true);
if(mAlgorithm == kExpFit)
mAttackTimeCtrl->Enable(true);
#ifdef DEBUG_COMPRESSOR2_TRACE2
debugfile.close();
#endif
return true;
}
@ -731,6 +760,11 @@ bool EffectCompressor2::Process()
AllocPipeline();
mProgressVal = 0;
#ifdef DEBUG_COMPRESSOR2_TRACE2
debugfile.close();
debugfile.open("/tmp/audio.out", std::ios::trunc | std::ios::out);
#endif
for(auto track : mOutputTracks->Selected<WaveTrack>()
+ (mStereoInd ? &Track::Any : &Track::IsLeader))
{
@ -769,6 +803,9 @@ bool EffectCompressor2::Process()
mPreproc.reset(nullptr);
mEnvelope.reset(nullptr);
FreePipeline();
#ifdef DEBUG_COMPRESSOR2_TRACE2
debugfile.close();
#endif
return bGoodResult;
}
@ -1401,6 +1438,34 @@ inline float EffectCompressor2::EnvelopeSample(PipelineBuffer& pbuf, size_t rp)
inline void EffectCompressor2::CompressSample(float env, size_t wp)
{
float gain = (1.0 - mDryWet) + CompressorGain(env) * mDryWet;
#ifdef DEBUG_COMPRESSOR2_TRACE2
float ThresholdDB = mThresholdDB;
float Ratio = mRatio;
float KneeWidthDB = mKneeWidthDB;
float AttackTime = mAttackTime;
float ReleaseTime = mReleaseTime;
float LookaheadTime = mLookaheadTime;
float LookbehindTime = mLookbehindTime;
float MakeupGainPct = mMakeupGainPct;
float DryWetPct = mDryWetPct;
debugfile.write((char*)&ThresholdDB, sizeof(float));
debugfile.write((char*)&Ratio, sizeof(float));
debugfile.write((char*)&KneeWidthDB, sizeof(float));
debugfile.write((char*)&AttackTime, sizeof(float));
debugfile.write((char*)&ReleaseTime, sizeof(float));
debugfile.write((char*)&LookaheadTime, sizeof(float));
debugfile.write((char*)&LookbehindTime, sizeof(float));
debugfile.write((char*)&MakeupGainPct, sizeof(float));
debugfile.write((char*)&DryWetPct, sizeof(float));
debugfile.write((char*)&mPipeline[0][0][wp], sizeof(float));
if(mProcStereo)
debugfile.write((char*)&mPipeline[0][1][wp], sizeof(float));
debugfile.write((char*)&env, sizeof(float));
debugfile.write((char*)&gain, sizeof(float));
#endif
#ifdef DEBUG_COMPRESSOR2_ENV
if(wp < 100)
mPipeline[0][0][wp] = 0;
@ -1411,6 +1476,12 @@ inline void EffectCompressor2::CompressSample(float env, size_t wp)
#endif
if(mProcStereo)
mPipeline[0][1][wp] = mPipeline[0][1][wp] * gain;
#ifdef DEBUG_COMPRESSOR2_TRACE2
debugfile.write((char*)&mPipeline[0][0][wp], sizeof(float));
if(mProcStereo)
debugfile.write((char*)&mPipeline[0][1][wp], sizeof(float));
#endif
}
bool EffectCompressor2::PipelineHasData()

View File

@ -90,6 +90,9 @@ class EnvelopeDetector
virtual void SetParams(float sampleRate, float attackTime,
float releaseTime) = 0;
virtual float AttackFactor();
virtual float DecayFactor();
protected:
size_t mPos;
float mInitialCondition;
@ -126,6 +129,8 @@ class Pt1EnvelopeDetector : public EnvelopeDetector
virtual void SetParams(float sampleRate, float attackTime,
float releaseTime);
virtual float AttackFactor();
virtual float DecayFactor();
private:
bool mCorrectGain;