00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "Complex.hxx"
00023 #include "SpecTypeFlags.hxx"
00024 #include "FrameInterpolator.hxx"
00025 #include "BPF.hxx"
00026 #include "Point.hxx"
00027
00028 namespace CLAM {
00029
00030 void FrameInterpConfig::DefaultInit()
00031 {
00032 AddAll();
00033 UpdateData();
00034 DefaultValues();
00035 }
00036
00037 void FrameInterpConfig::DefaultValues()
00038 {
00039 SetMagInterpolationFactor( 0.0 );
00040 SetFreqInterpolationFactor( 0.0 );
00041 SetPitchInterpolationFactor( 0.0 );
00042 SetResidualInterpolationFactor( 0.0 );
00043 SetHarmonic( true );
00044 SetUseSpectralShape(false);
00045 }
00046
00047
00048 FrameInterpolator::FrameInterpolator()
00049 : mFrameInterpolationFactorCtl("FrameInterpolationFactor",this,&FrameInterpolator::DoFrameFactorControl),
00050 mMagInterpolationFactorCtl("MagInterpolationFactor",this,&FrameInterpolator::DoMagFactorControl),
00051 mFreqInterpolationFactorCtl("FreqInterpolationFactor",this,&FrameInterpolator::DoFreqFactorControl),
00052 mPitchInterpolationFactorCtl("PitchInterpolationFactor",this,&FrameInterpolator::DoPitchFactorControl),
00053 mResidualInterpolationFactorCtl("ResidualInterpolationFactor",this,&FrameInterpolator::DoResidualFactorControl),
00054 mPitch1Ctl("Pitch1",this,&FrameInterpolator::DoPitch1Control),
00055 mPitch2Ctl("Pitch2",this,&FrameInterpolator::DoPitch2Control),
00056 mIsHarmonicCtl("IsHarmonic",this,&FrameInterpolator::DoHarmonicControl),
00057 mIn1("Input 1",this),
00058 mIn2("Input 2",this),
00059 mOut("Output",this),
00060 mpSpectralShape(0)
00061 {
00062 AttachChildren();
00063 Configure(FrameInterpConfig());
00064 }
00065
00066 FrameInterpolator::FrameInterpolator(const FrameInterpConfig &c)
00067 : mFrameInterpolationFactorCtl("FrameInterpolationFactor",this,&FrameInterpolator::DoFrameFactorControl),
00068 mMagInterpolationFactorCtl("MagInterpolationFactor",this,&FrameInterpolator::DoMagFactorControl),
00069 mFreqInterpolationFactorCtl("FreqInterpolationFactor",this,&FrameInterpolator::DoFreqFactorControl),
00070 mPitchInterpolationFactorCtl("PitchInterpolationFactor",this,&FrameInterpolator::DoPitchFactorControl),
00071 mResidualInterpolationFactorCtl("ResidualInterpolationFactor",this,&FrameInterpolator::DoResidualFactorControl),
00072 mPitch1Ctl("Pitch1",this,&FrameInterpolator::DoPitch1Control),
00073 mPitch2Ctl("Pitch2",this,&FrameInterpolator::DoPitch2Control),
00074 mIsHarmonicCtl("IsHarmonic",this,&FrameInterpolator::DoHarmonicControl),
00075 mIn1("Input 1",this),
00076 mIn2("Input 2",this),
00077 mOut("Output",this),
00078 mpSpectralShape(0)
00079 {
00080 AttachChildren();
00081 Configure(c);
00082 }
00083
00084
00085 bool FrameInterpolator::ConcreteConfigure(const ProcessingConfig&c)
00086 {
00087 CopyAsConcreteConfig(mConfig, c);
00088
00089
00090 PeaksInterpConfig pkInterpConfig;
00091 pkInterpConfig.SetMagInterpolationFactor(mConfig.GetMagInterpolationFactor());
00092 pkInterpConfig.SetFreqInterpolationFactor(mConfig.GetFreqInterpolationFactor());
00093 pkInterpConfig.SetPitchInterpolationFactor(mConfig.GetPitchInterpolationFactor());
00094 pkInterpConfig.SetHarmonic(mConfig.GetHarmonic());
00095 pkInterpConfig.SetUseSpectralShape(mConfig.GetUseSpectralShape());
00096 mPO_PeaksInterpolator.Configure(pkInterpConfig);
00097
00098
00099 if(mConfig.GetUseSpectralShape())
00100 {
00101 mPO_PeaksInterpolator.AttachSpectralShape(*mpSpectralShape);
00102 }
00103
00104 SpecInterpConfig spInterpConfig;
00105 spInterpConfig.SetInterpolationFactor(mConfig.GetResidualInterpolationFactor());
00106
00107 mPO_SpectrumInterpolator.Configure(spInterpConfig);
00108
00109
00110 mMagInterpolationFactorCtl.DoControl(mConfig.GetMagInterpolationFactor());
00111 mFreqInterpolationFactorCtl.DoControl(mConfig.GetFreqInterpolationFactor());
00112 mPitchInterpolationFactorCtl.DoControl(mConfig.GetPitchInterpolationFactor());
00113 mResidualInterpolationFactorCtl.DoControl(mConfig.GetResidualInterpolationFactor());
00114 mIsHarmonicCtl.DoControl(mConfig.GetHarmonic());
00115
00116 return true;
00117 }
00118
00119 void FrameInterpolator::AttachChildren()
00120 {
00121 mPO_SpectrumInterpolator.SetParent(this);
00122 mPO_PeaksInterpolator.SetParent(this);
00123 }
00124
00125
00126
00127 bool FrameInterpolator::Do(const Frame& in1, const Frame& in2, Frame& out)
00128 {
00129 CLAM_DEBUG_ASSERT(IsRunning(),
00130 "FrameInterpolator::Do(): Not in execution mode");
00131
00132 if(in1.GetFundamentalFreq()!=0 && in2.GetFundamentalFreq()!=0 && mConfig.GetHarmonic())
00133 mIsHarmonicCtl.DoControl(1);
00134 else mIsHarmonicCtl.DoControl(0);
00135
00136 mPitch1Ctl.DoControl(in1.GetFundamentalFreq());
00137 mPitch2Ctl.DoControl(in2.GetFundamentalFreq());
00138
00139 TData newPitch=mPitch1Ctl.GetLastValue()*(1-mPitchInterpolationFactorCtl.GetLastValue())+mPitch2Ctl.GetLastValue()*mPitchInterpolationFactorCtl.GetLastValue();
00140 if(!mIsHarmonicCtl.GetLastValue()) newPitch=0;
00141
00142
00143 if(out.GetFundamental().GetnCandidates()==0)
00144 out.GetFundamental().AddElem(newPitch,0);
00145 else
00146 out.GetFundamental().SetFreq(0,newPitch);
00147 out.GetFundamental().SetnCandidates(1);
00148
00149 if(mConfig.GetUseSpectralShape())
00150 mPO_PeaksInterpolator.Do(
00151 in1.GetSpectralPeakArray(),
00152 in2.GetSpectralPeakArray(),
00153 *mpSpectralShape,
00154 out.GetSpectralPeakArray() );
00155 else
00156 mPO_PeaksInterpolator.Do(in1.GetSpectralPeakArray(),in2.GetSpectralPeakArray(),out.GetSpectralPeakArray());
00157 mPO_SpectrumInterpolator.Do(in1.GetResidualSpec(),in2.GetResidualSpec(),out.GetResidualSpec());
00158
00159 return true;
00160 }
00161
00162 bool FrameInterpolator::Do(void)
00163 {
00164 CLAM_ASSERT(false,"FrameInterpolator::Do(): Not implemented");
00165
00166 return true;
00167 }
00168
00169
00170 int FrameInterpolator::DoFrameFactorControl(TControlData value)
00171 {
00172 mMagInterpolationFactorCtl.DoControl(value);
00173 mFreqInterpolationFactorCtl.DoControl(value);
00174 mPitchInterpolationFactorCtl.DoControl(value);
00175 mResidualInterpolationFactorCtl.DoControl(value);
00176 return 0;
00177 }
00178
00179 int FrameInterpolator::DoMagFactorControl(TControlData value)
00180 {
00181 mPO_PeaksInterpolator.mMagInterpolationFactorCtl.DoControl(value);
00182 return 0;
00183 }
00184
00185 int FrameInterpolator::DoFreqFactorControl(TControlData value)
00186 {
00187 mPO_PeaksInterpolator.mFreqInterpolationFactorCtl.DoControl(value);
00188 return 0;
00189 }
00190
00191 int FrameInterpolator::DoPitchFactorControl(TControlData value)
00192 {
00193 mPO_PeaksInterpolator.mPitchInterpolationFactorCtl.DoControl(value);
00194 return 0;
00195 }
00196
00197 int FrameInterpolator::DoResidualFactorControl(TControlData value)
00198 {
00199 mPO_SpectrumInterpolator.mInterpolationFactorCtl.DoControl(value);
00200 return 0;
00201 }
00202
00203 int FrameInterpolator::DoPitch1Control(TControlData value)
00204 {
00205 mPO_PeaksInterpolator.mPitch1Ctl.DoControl(value);
00206 return 0;
00207 }
00208
00209 int FrameInterpolator::DoPitch2Control(TControlData value)
00210 {
00211 mPO_PeaksInterpolator.mPitch2Ctl.DoControl(value);
00212 return 0;
00213 }
00214
00215 int FrameInterpolator::DoHarmonicControl(TControlData value)
00216 {
00217 mPO_PeaksInterpolator.mIsHarmonicCtl.DoControl(value);
00218 return 0;
00219 }
00220
00221
00222
00223 }
00224