29 int new_size = points_per_frame + memory_points;
31 if (mArray.
Size() < new_size)
34 if (mArray.
Size() != new_size)
37 mCurrentPos = memory_points-1;
38 mNMemoryPoints = memory_points;
39 mPointsPerFrame = points_per_frame;
44 return mArray.
Size() != 0;
47 TData &IntervalAmplitudeAverages::Current(
int index)
49 return mArray[mCurrentPos+index];
54 int i, npoints = mArray.
Size();
55 for (i=0; i<npoints; i++)
61 for (
int i = -mCurrentPos; i<=0; i++)
62 Current(i) = Current(i+mPointsPerFrame);
70 TData interval_mean = 0.0;
71 for (
int i=interval_start; i<interval_end; i++)
72 interval_mean += fabs(audio[i]);
73 interval_mean /= interval_end - interval_start;
74 Current(interval) = interval_mean;
77 TData IntervalAmplitudeAverages::AcumulationShape(
int i)
79 return TData(mNMemoryPoints-i)/
TData(mNMemoryPoints);
85 for (
unsigned i=0; i< mNMemoryPoints; i++)
86 res += AcumulationShape(i) * Current(ipoint-i);
98 GetInterpolationPeriod().SetInitValue(5.0);
99 GetInterpolationPeriod().SetMinValue(2.0);
100 GetInterpolationPeriod().SetMaxValue(10.0);
102 GetIntegrationLength().SetInitValue(50.0);
103 GetIntegrationLength().SetMinValue(10.0);
104 GetIntegrationLength().SetMaxValue(2000.0);
106 GetNormalLevel().SetInitValue(0.25);
107 GetNormalLevel().SetMinValue(0.01);
108 GetNormalLevel().SetMaxValue(10.0);
110 GetSilenceLevel().SetInitValue(0.0);
111 GetSilenceLevel().SetMinValue(0.0);
112 GetSilenceLevel().SetMaxValue(0.2);
114 SetNInterpPointsPerFrame(0);
119 #define CONTROL(name) c##name(#name,this,&EnvelopeExtractor::name##Change)
126 , Input(
"Input",this)
127 , Output(
"Output",this)
135 , mInterpolationPeriod(0.0)
136 , mIntegrationLength(0.0)
144 bool EnvelopeExtractor::ConcreteStart()
149 mAmplitudeAverages.
Clear();
151 int i,n_interp_points;
153 if (mIsSpline) n_interp_points = mPointsPerFrame + 3;
154 else n_interp_points = mPointsPerFrame + 1;
155 for (i=0; i<n_interp_points; i++)
156 mInterpolationPoints[i]=0.0;
161 void EnvelopeExtractor::ConfigureEnvelope(BPFTmpl<TTime,TData> & bpf)
163 if (bpf.Size() != mPointsPerFrame+1) {
164 bpf.Resize (mPointsPerFrame+1);
165 bpf.SetSize (mPointsPerFrame+1);
168 if (bpf.GetInterpolation() != mConfig.GetInterpolationType())
169 bpf.SetIntpType(mConfig.GetInterpolationType());
173 for (i=0; i<=mPointsPerFrame; i++) {
174 bpf.SetXValue(i,pos);
179 bool EnvelopeExtractor::SetPointsPerFrame(
int npoints)
181 if ( ( npoints < 1 ) ||
182 ( npoints < 2 && mIsSpline ) )
187 mPointsPerFrame = npoints;
189 int n_interp_points = mPointsPerFrame + 1;
195 mInterpolationPoints.
Resize(n_interp_points);
197 mInterpolationPoints.
SetSize(n_interp_points);
199 mAmplitudeAverages.
Reconfigure(mPointsPerFrame,mNMemoryPoints);
201 mDeltaX = (mSampleDelta *
TTime(mFrameSize)) /
TTime(mPointsPerFrame);
206 bool EnvelopeExtractor::SetInterpolationPeriod(
TTime period)
208 int points_per_frame =
int(mFrameTime / period);
210 if (!SetPointsPerFrame(points_per_frame))
213 mInterpolationPeriod = period;
218 void EnvelopeExtractor::SetNMemoryPoints(
int mpoints)
220 mNMemoryPoints = mpoints;
222 mAmplitudeAverages.
Reconfigure(mPointsPerFrame,mNMemoryPoints);
225 bool EnvelopeExtractor::SetIntegrationLength(
TTime length)
227 int memory_points =
int(length / mInterpolationPeriod);
229 if (memory_points <= 0)
232 mIntegrationLength = length;
234 SetNMemoryPoints(memory_points);
239 void EnvelopeExtractor::SetNormalLevel(
TData nlevel)
241 mNormalLevel = nlevel;
244 void EnvelopeExtractor::SetSilenceLevel(
TData slevel)
246 mSilenceLevel = slevel;
249 bool EnvelopeExtractor::ConcreteConfigure(
const ProcessingConfig& c)
255 mFrameSize = mConfig.GetFrameSize();
263 mFrameTime = 1000.0 * double(mFrameSize) / double(mConfig.GetSampleRate());
265 if (mConfig.GetNInterpPointsPerFrame() > 0)
267 SetPointsPerFrame(mConfig.GetNInterpPointsPerFrame());
269 else if (mConfig.GetInterpolationPeriod().GetInitValue() > 0.0)
271 if (!SetInterpolationPeriod(mConfig.GetInterpolationPeriod().GetInitValue()))
274 "less than one interpolation point per frame");
280 "interpolation period requested in configuration are valid.");
284 if (mConfig.GetNMemoryPoints() > 0 )
286 SetNMemoryPoints(mConfig.GetNMemoryPoints());
288 else if ( mConfig.GetIntegrationLength().GetInitValue() > 0.0 )
290 if (!SetIntegrationLength(mConfig.GetIntegrationLength().GetInitValue()))
293 "to a non-positive number of memory points.");
300 "requested in configuration are valid.");
304 SetNormalLevel(mConfig.GetNormalLevel().GetInitValue());
306 SetSilenceLevel(mConfig.GetSilenceLevel().GetInitValue());
308 mSampleDelta = 1000.0 / (
TTime)mConfig.GetSampleRate();
310 mDeltaX = (mSampleDelta *
TTime(mFrameSize)) /
TTime(mPointsPerFrame);
312 InitializeControls();
318 void EnvelopeExtractor::CleanSilence()
324 end = mPointsPerFrame+2;
328 end = mPointsPerFrame;
331 for (i=first; i<=end; i++)
332 if (mInterpolationPoints[i] < mSilenceLevel)
333 mInterpolationPoints[i] = 0.0;
335 mInterpolationPoints[i] -= mSilenceLevel;
338 void EnvelopeExtractor::WriteEnvelope(BPFTmpl<TTime,TData> &bpf)
342 if (mIsSpline) ipos=1;
345 for (i=0; i<=mPointsPerFrame; i++)
346 bpf.SetValue(i,mInterpolationPoints[ipos++]);
349 bpf.SetLeftDerivative(
350 (mInterpolationPoints[2]-mInterpolationPoints[0]) / mDeltaX);
351 bpf.SetRightDerivative(
352 (mInterpolationPoints[mPointsPerFrame+2] -
353 mInterpolationPoints[mPointsPerFrame] ) / mDeltaX);
354 bpf.UpdateSplineTable();
358 void EnvelopeExtractor::StoreInterpolationPoints()
360 mInterpolationPoints[0] = mInterpolationPoints[mPointsPerFrame];
362 mInterpolationPoints[1] = mInterpolationPoints[mPointsPerFrame+1];
363 mInterpolationPoints[2] = mInterpolationPoints[mPointsPerFrame+2];
370 void EnvelopeExtractor::InterpolationPeriodChange(
TControlData val)
372 SetInterpolationPeriod(mIpMin + val * mIpFactor);
373 mInterpolationPeriodControl = val;
376 void EnvelopeExtractor::IntegrationLengthChange(
TControlData val)
378 SetIntegrationLength(mIlMin + val * mIlFactor);
379 mIntegrationLengthControl = val;
382 void EnvelopeExtractor::NormalLevelChange(
TControlData val)
384 SetNormalLevel(mNlMin + val * mNlFactor);
385 mNormalLevelControl = val;
388 void EnvelopeExtractor::SilenceLevelChange(
TControlData val)
390 SetSilenceLevel(mSlMin + val * mSlFactor);
391 mSilenceLevelControl = val;
394 void EnvelopeExtractor::InitializeControls(
void)
396 mIpMin = mConfig.GetInterpolationPeriod().GetMinValue();
397 mIpFactor = mConfig.GetInterpolationPeriod().GetMaxValue() - mIpMin;
398 mInterpolationPeriodControl =
399 (mConfig.GetInterpolationPeriod().GetInitValue() -mIpMin) / mIpFactor;
401 mIlMin = mConfig.GetIntegrationLength().GetMinValue();
402 mIlFactor = mConfig.GetIntegrationLength().GetMaxValue() - mIlMin;
403 mIntegrationLengthControl =
404 (mConfig.GetIntegrationLength().GetInitValue() - mIlMin) / mIlFactor;
406 mNlMin = mConfig.GetNormalLevel().GetMinValue();
407 mNlFactor = mConfig.GetNormalLevel().GetMaxValue() - mNlMin;
408 mNormalLevelControl =
409 (mConfig.GetNormalLevel().GetInitValue() - mNlMin) / mNlFactor;
411 mSlMin = mConfig.GetSilenceLevel().GetMinValue();
412 mSlFactor = mConfig.GetSilenceLevel().GetMaxValue() - mSlMin;
413 mSilenceLevelControl =
414 (mConfig.GetSilenceLevel().GetInitValue() - mSlMin) / mSlFactor;
429 "EnvelopeExtractor::Do(): Wrong audio size.");
433 int i,ipos,interval_start=0, interval_end;
435 ConfigureEnvelope(bpf);
437 if (mIsSpline) ipos=3;
440 for (i=1; i<=mPointsPerFrame; i++) {
441 interval_end = (mFrameSize*i)/mPointsPerFrame;
442 mAmplitudeAverages.
Compute(i,audio,interval_start,interval_end);
443 interval_start = interval_end;
444 mInterpolationPoints[ipos++] = mAmplitudeAverages.
Acumulated(i) /
445 (mNMemoryPoints*mNormalLevel);
447 if (mSilenceLevel > 0.0)
450 StoreInterpolationPoints();