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 "SpectrumInterpolator.hxx"
00025 #include "BPF.hxx"
00026 #include "Point.hxx"
00027
00028 namespace CLAM {
00029
00030 void SpecInterpConfig::DefaultInit()
00031 {
00032 AddAll();
00033 UpdateData();
00034 }
00035
00036 SpectrumInterpolator::SpectrumInterpolator(const SpecInterpConfig &c)
00037 : mSize(0)
00038 , mIn1("Input 1",this)
00039 , mIn2("Input 2",this)
00040 , mOut("Output",this)
00041 , mProtoState(SOther)
00042 , mInterpolationFactorCtl("InterpolationFactor",this)
00043 {
00044 Configure(c);
00045 }
00046
00047 bool SpectrumInterpolator::ConcreteConfigure(const ProcessingConfig&c)
00048 {
00049 CopyAsConcreteConfig(mConfig, c);
00050
00051 mInterpolationFactorCtl.DoControl(mConfig.GetInterpolationFactor());
00052
00053 return true;
00054 }
00055
00056
00057
00058 bool SpectrumInterpolator::Do(Spectrum& in1, Spectrum& in2, Spectrum& out)
00059 {
00060 CLAM_DEBUG_ASSERT(IsRunning(),
00061 "SpectrumInterpolator::Do(): Not in execution mode");
00062
00063 switch (mProtoState) {
00064
00065 case SMagPhase:
00066 InterpolateMagPhase(in1,in2,out);
00067 break;
00068 case SComplex:
00069 InterpolateComplex(in1,in2,out);
00070 break;
00071 case SPolar:
00072 InterpolatePolar(in1,in2,out);
00073 break;
00074 case SBPF:
00075 InterpolateBPF(in1,in2,out);
00076 break;
00077 case SBPFMagPhase:
00078 InterpolateBPFMagPhase(in1,in2,out);
00079 break;
00080 case SBPFComplex:
00081 InterpolateBPFComplex(in1,in2,out);
00082 break;
00083 case SBPFPolar:
00084 InterpolateBPFPolar(in1,in2,out);
00085 break;
00086 case SMagPhaseBPF:
00087 InterpolateMagPhaseBPF(in1,in2,out);
00088 break;
00089 case SComplexBPF:
00090 InterpolateComplexBPF(in1,in2,out);
00091 break;
00092 case SPolarBPF:
00093 InterpolatePolarBPF(in1,in2,out);
00094 break;
00095
00096 case SOther:
00097 Interpolate(in1,in2,out);
00098 break;
00099 default:
00100 CLAM_ASSERT(false,"Do(...) : internal inconsistency (invalid mProtoState)");
00101 }
00102
00103 return true;
00104 }
00105
00106 bool SpectrumInterpolator::Do(void)
00107 {
00108 CLAM_ASSERT(false, "SpectrumInterpolator::Do(): Not implemented");
00109
00110 return true;
00111 }
00112
00113
00114
00115 bool SpectrumInterpolator::SetPrototypes(const Spectrum& in1,const Spectrum& in2,const Spectrum& out)
00116 {
00117
00118 SpecTypeFlags t1;
00119 in1.GetType(t1);
00120 SpecTypeFlags t2;
00121 in2.GetType(t2);
00122 SpecTypeFlags to;
00123 out.GetType(to);
00124
00125
00126 CLAM_ASSERT((t1.bMagPhase || t1.bComplex || t1.bPolar || t1.bMagPhaseBPF),
00127 "SpectrumInterpolator: First spectrum has no content");
00128 CLAM_ASSERT((t2.bMagPhase || t2.bComplex || t2.bPolar || t2.bMagPhaseBPF),
00129 "SpectrumInterpolator: Second spectrum has no content");
00130 CLAM_ASSERT((to.bMagPhase || to.bComplex || to.bPolar || to.bMagPhaseBPF),
00131 "SpectrumInterpolator: Output spectrum has no content");
00132
00133
00134 mSize = 0;
00135 if (t1.bMagPhase || t1.bComplex || t1.bPolar) {
00136 mSize = in1.GetSize();
00137 CLAM_ASSERT(mSize,"SpectrumInterpolator::SetPrototypes: Zero size spectrum");
00138 }
00139 if (t2.bMagPhase || t2.bComplex || t2.bPolar)
00140 {
00141 if (mSize) {
00142 CLAM_ASSERT(mSize == in2.GetSize(),"SpectrumInterpolator::SetPrototypes:Size mismatch in spectrum interpolation");
00143 }
00144 else {
00145 mSize = in2.GetSize();
00146 CLAM_ASSERT(mSize,"SpectrumInterpolator::SetPrototypes: Zero size spectrum");
00147 }
00148 }
00149 if (to.bMagPhase || to.bComplex || to.bPolar)
00150 {
00151 if (mSize) {
00152 CLAM_ASSERT(mSize == out.GetSize(),"SpectrumInterpolator::SetPrototypes:Size mismatch in spectrum interpolation");
00153 }
00154 else {
00155 mSize = out.GetSize();
00156 CLAM_ASSERT(mSize,"SpectrumInterpolator::SetPrototypes: Zero size spectrum");
00157 }
00158 }
00159
00160
00161
00162
00163
00164 CLAM_ASSERT(in1.GetSpectralRange() == in2.GetSpectralRange() &&
00165 in1.GetSpectralRange() == out.GetSpectralRange() ,"SpectrumInterpolator::SetPrototypes: Spectral range mismatch in spectrum interpolation");
00166
00167
00168 if (in1.GetScale() == EScale::eLinear)
00169 if (in2.GetScale() == EScale::eLinear)
00170 mScaleState=Slinlin;
00171 else
00172 mScaleState=Slinlog;
00173 else
00174 if (in2.GetScale() == EScale::eLinear)
00175 mScaleState=Sloglin;
00176 else
00177 mScaleState=Sloglog;
00178
00179
00180 CLAM_ASSERT(out.GetScale() != EScale::eLog,"SpectrumInterpolator: Log Scale Output not implemented");
00181
00182
00183
00184
00185 bool i1BPF=false, i2BPF=false, oBPF=false;
00186 if (t1.bMagPhaseBPF && !t1.bComplex && !t1.bPolar && !t1.bMagPhase)
00187 i1BPF=true;
00188 if (t2.bMagPhaseBPF && !t2.bComplex && !t2.bPolar && !t2.bMagPhase)
00189 i2BPF=true;
00190 if (to.bMagPhaseBPF && !to.bComplex && !to.bPolar && !to.bMagPhase)
00191 oBPF=true;
00192
00193 if (oBPF) {
00194
00195 mProtoState=SBPF;
00196 return true;
00197 }
00198 if (i1BPF) {
00199
00200 if (t2.bMagPhase && to.bMagPhase) {
00201 mProtoState=SBPFMagPhase;
00202 return true;
00203 }
00204 if (t2.bComplex && to.bComplex) {
00205 mProtoState=SBPFComplex;
00206 return true;
00207 }
00208 if (t2.bPolar && to.bPolar) {
00209 mProtoState=SBPFPolar;
00210 return true;
00211 }
00212
00213 if (t2.bMagPhase || to.bMagPhase) {
00214 mProtoState=SBPFMagPhase;
00215 return true;
00216 }
00217 if (t2.bComplex || to.bComplex) {
00218 mProtoState=SBPFComplex;
00219 return true;
00220 }
00221 if (t2.bPolar || to.bPolar) {
00222 mProtoState=SBPFPolar;
00223 return true;
00224 }
00225
00226 CLAM_ASSERT(false,
00227 "SpectrumInterpolator::SetPrototypes: Data flags internal inconsistency");
00228 }
00229 if (i2BPF) {
00230
00231 if (t1.bMagPhase && to.bMagPhase) {
00232 mProtoState=SMagPhaseBPF;
00233 return true;
00234 }
00235 if (t1.bComplex && to.bComplex) {
00236 mProtoState=SComplexBPF;
00237 return true;
00238 }
00239 if (t1.bPolar && to.bPolar) {
00240 mProtoState=SPolarBPF;
00241 return true;
00242 }
00243
00244 if (t1.bMagPhase || to.bMagPhase) {
00245 mProtoState=SMagPhaseBPF;
00246 return true;
00247 }
00248 if (t1.bComplex || to.bComplex) {
00249 mProtoState=SComplexBPF;
00250 return true;
00251 }
00252 if (t1.bPolar || to.bPolar) {
00253 mProtoState=SPolarBPF;
00254 return true;
00255 }
00256
00257 CLAM_ASSERT(false,
00258 "SpectrumInterpolator::SetPrototypes:"
00259 " invalid data flags");
00260 }
00261
00262 if (t1.bMagPhase && t2.bMagPhase && to.bMagPhase) {
00263 mProtoState=SMagPhase;
00264 return true;
00265 }
00266 if (t1.bComplex && t2.bComplex && to.bComplex) {
00267 mProtoState=SComplex;
00268 return true;
00269 }
00270 if (t1.bPolar && t2.bPolar && to.bPolar) {
00271 mProtoState=SPolar;
00272 return true;
00273 }
00274
00275 if ( (t1.bMagPhase && t2.bMagPhase) ||
00276 (t1.bMagPhase && to.bMagPhase) ||
00277 (t2.bMagPhase && to.bMagPhase)) {
00278 mProtoState=SMagPhase;
00279 return true;
00280 }
00281 if ( (t1.bComplex && t2.bComplex) ||
00282 (t1.bComplex && to.bComplex) ||
00283 (t2.bComplex && to.bComplex)) {
00284 mProtoState=SComplex;
00285 return true;
00286 }
00287 if ( (t1.bPolar && t2.bPolar) ||
00288 (t1.bPolar && to.bPolar) ||
00289 (t2.bPolar && to.bPolar)) {
00290 mProtoState=SPolar;
00291 return true;
00292 }
00293
00294 mProtoState=SMagPhase;
00295 return true;
00296 }
00297
00298
00299 bool SpectrumInterpolator::SetPrototypes()
00300 {
00301 CLAM_ASSERT(false, "SpectrumInterpolator::SetPrototypes(): Not implemented");
00302
00303 return true;
00304 }
00305
00306 bool SpectrumInterpolator::UnsetPrototypes()
00307 {
00308 mProtoState=SOther;
00309 return true;
00310 }
00311
00312
00313 void SpectrumInterpolator::Interpolate(Spectrum& in1, Spectrum& in2, Spectrum& out)
00314 {
00315 PrototypeState state_copy = mProtoState;
00316 ScaleState state2_copy = mScaleState;
00317
00318 SetPrototypes(in1,in2,out);
00319 Do(in1,in2,out);
00320
00321 mProtoState = state_copy;
00322 mScaleState = state2_copy;
00323 }
00324
00325
00326 void SpectrumInterpolator::InterpolateMagPhase(Spectrum& in1, Spectrum& in2, Spectrum& out)
00327 {
00328 switch(mScaleState) {
00329 case Slinlin:
00330 InterpolateMagPhaseLin(in1,in2,out);
00331 break;
00332 case Sloglog:
00333 InterpolateMagPhaseLog(in1,in2,out);
00334 break;
00335 case Slinlog:
00336 InterpolateMagPhaseLinLog(in1,in2,out);
00337 break;
00338 case Sloglin:
00339 InterpolateMagPhaseLinLog(in2,in1,out);
00340 break;
00341 }
00342 }
00343
00344 void SpectrumInterpolator::InterpolateMagPhaseLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00345 {
00346 bool remove1=false,remove2=false,remove3=false;
00347 SpecTypeFlags f;
00348
00349
00350
00351
00352
00353
00354 in1.GetType(f);
00355 if (!f.bMagPhase) {
00356 remove1=true;
00357 f.bMagPhase=true;
00358 in1.SetTypeSynchronize(f);
00359 }
00360 in2.GetType(f);
00361 if (!f.bMagPhase) {
00362 remove2=true;
00363 f.bMagPhase=true;
00364 in2.SetTypeSynchronize(f);
00365 }
00366 out.GetType(f);
00367 if (!f.bMagPhase) {
00368 remove3=true;
00369 f.bMagPhase=true;
00370 out.SetType(f);
00371 }
00372
00373 TData *m1 = in1.GetMagBuffer().GetPtr();
00374 TData *f1 = in1.GetPhaseBuffer().GetPtr();
00375 TData *m2 = in2.GetMagBuffer().GetPtr();
00376 TData *f2 = in2.GetPhaseBuffer().GetPtr();
00377 TData *mo = out.GetMagBuffer().GetPtr();
00378 TData *fo = out.GetPhaseBuffer().GetPtr();
00379
00380
00381
00382 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00383 if(intFactor>1) intFactor=1;
00384 if(intFactor<0) intFactor=0;
00385 TData invIntFactor=1-intFactor;
00386
00387 Polar polInvIntFactor=Polar(invIntFactor);
00388 Polar polIntFactor=Polar(intFactor);
00389
00390 for (int i=0;i<mSize;i++) {
00391 Polar po=polInvIntFactor*Polar(m1[i],f1[i])+polIntFactor*Polar(m2[i],f2[i]);
00392 mo[i]=po.Mag();
00393 fo[i]=po.Ang();
00394 }
00395
00396 f.bComplex=f.bPolar=f.bMagPhaseBPF=false;
00397 f.bMagPhase=true;
00398 out.SynchronizeTo(f);
00399
00400 if (remove1) {
00401 in1.RemoveMagBuffer();
00402 in1.RemovePhaseBuffer();
00403 in1.UpdateData();
00404 }
00405 if (remove2) {
00406 in2.RemoveMagBuffer();
00407 in2.RemovePhaseBuffer();
00408 in2.UpdateData();
00409 }
00410 if (remove3) {
00411 out.RemoveMagBuffer();
00412 out.RemovePhaseBuffer();
00413 out.UpdateData();
00414 }
00415
00416 }
00417
00418 void SpectrumInterpolator::InterpolateComplex(Spectrum& in1, Spectrum& in2, Spectrum& out)
00419 {
00420 switch(mScaleState) {
00421 case Slinlin:
00422 InterpolateComplexLin(in1,in2,out);
00423 break;
00424 case Sloglog:
00425 InterpolateComplexLog(in1,in2,out);
00426 break;
00427 case Slinlog:
00428 InterpolateComplexLinLog(in1,in2,out);
00429 break;
00430 case Sloglin:
00431 InterpolateComplexLinLog(in2,in1,out);
00432 break;
00433 }
00434 }
00435
00436 void SpectrumInterpolator::InterpolateComplexLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00437 {
00438 bool remove1=false,remove2=false,remove3=false;
00439 SpecTypeFlags f;
00440
00441
00442
00443
00444
00445
00446 in1.GetType(f);
00447 if (!f.bComplex) {
00448 remove1=true;
00449 f.bComplex=true;
00450 in1.SetTypeSynchronize(f);
00451 }
00452 in2.GetType(f);
00453 if (!f.bComplex) {
00454 remove2=true;
00455 f.bComplex=true;
00456 in2.SetTypeSynchronize(f);
00457 }
00458 out.GetType(f);
00459 if (!f.bComplex) {
00460 remove3=true;
00461 f.bComplex=true;
00462 out.SetType(f);
00463 }
00464
00465 Complex *c1 = in1.GetComplexArray().GetPtr();
00466 Complex *c2 = in2.GetComplexArray().GetPtr();
00467 Complex *co = out.GetComplexArray().GetPtr();
00468
00469
00470 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00471 if(intFactor>1) intFactor=1;
00472 if(intFactor<0) intFactor=0;
00473 TData invIntFactor=1-intFactor;
00474
00475 for (int i=0;i<mSize;i++)
00476 co[i]=c1[i]*invIntFactor+c2[i]*intFactor;
00477
00478 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=false;
00479 f.bComplex=true;
00480 out.SynchronizeTo(f);
00481
00482 if (remove1) {
00483 in1.RemoveComplexArray();
00484 in1.UpdateData();
00485 }
00486 if (remove2) {
00487 in2.RemoveComplexArray();
00488 in2.UpdateData();
00489 }
00490 if (remove3) {
00491 out.RemoveComplexArray();
00492 out.UpdateData();
00493 }
00494 }
00495
00496
00497 void SpectrumInterpolator::InterpolatePolar(Spectrum& in1, Spectrum& in2, Spectrum& out)
00498 {
00499 switch(mScaleState) {
00500 case Slinlin:
00501 InterpolatePolarLin(in1,in2,out);
00502 break;
00503 case Sloglog:
00504 InterpolatePolarLog(in1,in2,out);
00505 break;
00506 case Slinlog:
00507 InterpolatePolarLinLog(in1,in2,out);
00508 break;
00509 case Sloglin:
00510 InterpolatePolarLinLog(in2,in1,out);
00511 break;
00512 }
00513 }
00514
00515 void SpectrumInterpolator::InterpolatePolarLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00516 {
00517 bool remove1=false,remove2=false,remove3=false;
00518 SpecTypeFlags f;
00519
00520
00521
00522
00523
00524
00525 in1.GetType(f);
00526 if (!f.bPolar) {
00527 remove1=true;
00528 f.bPolar=true;
00529 in1.SetTypeSynchronize(f);
00530 }
00531 in2.GetType(f);
00532 if (!f.bPolar) {
00533 remove2=true;
00534 f.bPolar=true;
00535 in2.SetTypeSynchronize(f);
00536 }
00537 out.GetType(f);
00538 if (!f.bPolar) {
00539 remove3=true;
00540 f.bPolar=true;
00541 out.SetType(f);
00542 }
00543
00544 Polar *p1 = in1.GetPolarArray().GetPtr();
00545 Polar *p2 = in2.GetPolarArray().GetPtr();
00546 Polar *po = out.GetPolarArray().GetPtr();
00547
00548
00549 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00550 if(intFactor>1) intFactor=1;
00551 if(intFactor<0) intFactor=0;
00552 TData invIntFactor=1-intFactor;
00553
00554 Polar polInvIntFactor=Polar(invIntFactor);
00555 Polar polIntFactor=Polar(intFactor);
00556
00557 for (int i=0;i<mSize;i++)
00558 po[i]=polInvIntFactor*p1[i]+polIntFactor*p2[i];
00559
00560 f.bComplex=f.bMagPhase=f.bMagPhaseBPF=false;
00561 f.bPolar=true;
00562 out.SynchronizeTo(f);
00563
00564 if (remove1) {
00565 in1.RemovePolarArray();
00566 in1.UpdateData();
00567 }
00568 if (remove2) {
00569 in2.RemovePolarArray();
00570 in2.UpdateData();
00571 }
00572 if (remove3) {
00573 out.RemovePolarArray();
00574 out.UpdateData();
00575 }
00576 }
00577
00578
00579 void SpectrumInterpolator::InterpolateBPFMagPhase(Spectrum& in1, Spectrum& in2, Spectrum& out)
00580 {
00581 switch(mScaleState) {
00582 case Slinlin:
00583 InterpolateBPFMagPhaseLin(in1,in2,out);
00584 break;
00585 case Sloglog:
00586 InterpolateBPFMagPhaseLog(in1,in2,out);
00587 break;
00588 case Slinlog:
00589 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLinLog: Not implemented");
00590 break;
00591 case Sloglin:
00592 InterpolateBPFMagPhaseLogLin(in1,in2,out);
00593 break;
00594 }
00595 }
00596
00597 void SpectrumInterpolator::InterpolateMagPhaseBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
00598 {
00599 switch(mScaleState) {
00600 case Slinlin:
00601 InterpolateBPFMagPhaseLin(in2,in1,out);
00602 break;
00603 case Sloglog:
00604 InterpolateBPFMagPhaseLog(in2,in1,out);
00605 break;
00606 case Slinlog:
00607 InterpolateBPFMagPhaseLogLin(in2,in1,out);
00608 break;
00609 case Sloglin:
00610 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLinLog: Not implemented");
00611 break;
00612 }
00613 }
00614
00615 void SpectrumInterpolator::InterpolateBPFMagPhaseLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00616 {
00617 bool remove2=false,remove3=false;
00618 SpecTypeFlags f;
00619
00620
00621
00622
00623
00624
00625
00626 in2.GetType(f);
00627 if (!f.bMagPhase) {
00628 remove2=true;
00629 f.bMagPhase=true;
00630 in2.SetTypeSynchronize(f);
00631 }
00632 out.GetType(f);
00633 if (!f.bMagPhase) {
00634 remove3=true;
00635 f.bMagPhase=true;
00636 out.SetType(f);
00637 }
00638
00639 TData pos = 0.0;
00640 TData delta = out.GetSpectralRange() /
00641 ((TData)out.GetSize()-TData(1.0));
00642 BPF &m1 = in1.GetMagBPF();
00643 BPF &f1 = in1.GetPhaseBPF();
00644 TData *m2 = in2.GetMagBuffer().GetPtr();
00645 TData *f2 = in2.GetPhaseBuffer().GetPtr();
00646 TData *mo = out.GetMagBuffer().GetPtr();
00647 TData *fo = out.GetPhaseBuffer().GetPtr();
00648
00649
00650 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00651 if(intFactor>1) intFactor=1;
00652 if(intFactor<0) intFactor=0;
00653 TData invIntFactor=1-intFactor;
00654
00655 Polar polInvIntFactor=Polar(invIntFactor);
00656 Polar polIntFactor=Polar(intFactor);
00657
00658 for (int i=0;i<mSize;i++) {
00659 Polar po = polInvIntFactor*Polar(m1.GetValue(pos),f1.GetValue(pos)) +
00660 polIntFactor*Polar(m2[i],f2[i]);
00661 mo[i]=po.Mag();
00662 fo[i]=po.Ang();
00663 pos+=delta;
00664 }
00665
00666 f.bComplex=f.bPolar=f.bMagPhaseBPF=false;
00667 f.bMagPhase=true;
00668 out.SynchronizeTo(f);
00669
00670 if (remove2) {
00671 in2.RemoveMagBuffer();
00672 in2.RemovePhaseBuffer();
00673 in2.UpdateData();
00674 }
00675 if (remove3) {
00676 out.RemoveMagBuffer();
00677 out.RemovePhaseBuffer();
00678 out.UpdateData();
00679 }
00680 }
00681
00682 void SpectrumInterpolator::InterpolateBPFMagPhaseLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00683 {
00684 bool remove2=false,remove3=false;
00685 SpecTypeFlags f;
00686
00687
00688
00689
00690
00691
00692
00693 in2.GetType(f);
00694 if (!f.bMagPhase) {
00695 remove2=true;
00696 f.bMagPhase=true;
00697 in2.SetTypeSynchronize(f);
00698 }
00699 out.GetType(f);
00700 if (!f.bMagPhase) {
00701 remove3=true;
00702 f.bMagPhase=true;
00703 out.SetType(f);
00704 }
00705
00706 TData pos = 0.0;
00707 TData delta = out.GetSpectralRange() /
00708 ((TData)out.GetSize()-TData(1.0));
00709 BPF &m1 = in1.GetMagBPF();
00710 BPF &f1 = in1.GetPhaseBPF();
00711 TData *m2 = in2.GetMagBuffer().GetPtr();
00712 TData *f2 = in2.GetPhaseBuffer().GetPtr();
00713 TData *mo = out.GetMagBuffer().GetPtr();
00714 TData *fo = out.GetPhaseBuffer().GetPtr();
00715
00716
00717 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00718 if(intFactor>1) intFactor=1;
00719 if(intFactor<0) intFactor=0;
00720 TData invIntFactor=1-intFactor;
00721 Polar polInvIntFactor=Polar(invIntFactor);
00722 Polar polIntFactor=Polar(intFactor);
00723
00724 for (int i=0;i<mSize;i++) {
00725 Polar po = polInvIntFactor*Polar(CLAM_pow(TData(10),m1.GetValue(pos)/TData(10.0)),f1.GetValue(pos)) +
00726 polIntFactor*Polar(m2[i],f2[i]);
00727 mo[i]=po.Mag();
00728 fo[i]=po.Ang();
00729 pos+=delta;
00730 }
00731
00732 f.bComplex=f.bPolar=f.bMagPhaseBPF=false;
00733 f.bMagPhase=true;
00734 out.SynchronizeTo(f);
00735
00736 if (remove2) {
00737 in2.RemoveMagBuffer();
00738 in2.RemovePhaseBuffer();
00739 in2.UpdateData();
00740 }
00741 if (remove3) {
00742 out.RemoveMagBuffer();
00743 out.RemovePhaseBuffer();
00744 out.UpdateData();
00745 }
00746 }
00747
00748 void SpectrumInterpolator::InterpolateBPFComplex(Spectrum& in1, Spectrum& in2, Spectrum& out)
00749 {
00750 switch(mScaleState) {
00751 case Slinlin:
00752 InterpolateBPFComplexLin(in1,in2,out);
00753 break;
00754 case Sloglog:
00755 InterpolateBPFComplexLog(in1,in2,out);
00756 break;
00757 case Slinlog:
00758 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLinLog: Not implemented");
00759 break;
00760 case Sloglin:
00761 InterpolateBPFComplexLogLin(in1,in2,out);
00762 break;
00763 }
00764 }
00765
00766 void SpectrumInterpolator::InterpolateComplexBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
00767 {
00768 switch(mScaleState) {
00769 case Slinlin:
00770 InterpolateBPFComplexLin(in2,in1,out);
00771 break;
00772 case Sloglog:
00773 InterpolateBPFComplexLog(in2,in1,out);
00774 break;
00775 case Slinlog:
00776 InterpolateBPFComplexLogLin(in2,in1,out);
00777 break;
00778 case Sloglin:
00779 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLinLog: Not implemented");
00780 break;
00781 }
00782 }
00783
00784 void SpectrumInterpolator::InterpolateBPFComplexLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00785 {
00786 bool remove2=false,remove3=false;
00787 SpecTypeFlags f;
00788
00789
00790
00791
00792
00793
00794
00795 in2.GetType(f);
00796 if (!f.bComplex) {
00797 remove2=true;
00798 f.bComplex=true;
00799 in2.SetTypeSynchronize(f);
00800 }
00801 out.GetType(f);
00802 if (!f.bComplex) {
00803 remove3=true;
00804 f.bComplex=true;
00805 out.SetType(f);
00806 }
00807
00808 TData pos = 0.0;
00809 TData delta = out.GetSpectralRange() /
00810 ((TData)out.GetSize()-TData(1.0));
00811 BPF &m1 = in1.GetMagBPF();
00812 BPF &f1 = in1.GetPhaseBPF();
00813 Complex *c2 = in2.GetComplexArray().GetPtr();
00814 Complex *co = out.GetComplexArray().GetPtr();
00815
00816
00817 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00818 if(intFactor>1) intFactor=1;
00819 if(intFactor<0) intFactor=0;
00820 TData invIntFactor=1-intFactor;
00821
00822 for (int i=0;i<mSize;i++) {
00823 TData BRe = fabs(m1.GetValue(pos)) * CLAM_cos(f1.GetValue(pos));
00824 TData BIm = fabs(m1.GetValue(pos)) * CLAM_sin(f1.GetValue(pos));
00825 co[i]= Complex(BRe,BIm)*invIntFactor + c2[i]*intFactor;
00826 pos+=delta;
00827 }
00828
00829 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=false;
00830 f.bComplex=true;
00831 out.SynchronizeTo(f);
00832
00833 if (remove2) {
00834 in2.RemoveComplexArray();
00835 in2.UpdateData();
00836 }
00837 if (remove3) {
00838 out.RemoveComplexArray();
00839 out.UpdateData();
00840 }
00841 }
00842
00843
00844
00845
00846 void SpectrumInterpolator::InterpolateBPFComplexLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00847 {
00848 bool remove2=false,remove3=false;
00849 SpecTypeFlags f;
00850
00851
00852
00853
00854
00855
00856
00857 in2.GetType(f);
00858 if (!f.bComplex) {
00859 remove2=true;
00860 f.bComplex=true;
00861 in2.SetTypeSynchronize(f);
00862 }
00863 out.GetType(f);
00864 if (!f.bComplex) {
00865 remove3=true;
00866 f.bComplex=true;
00867 out.SetType(f);
00868 }
00869
00870 TData pos = 0.0;
00871 TData delta = out.GetSpectralRange() /
00872 ((TData)out.GetSize()-TData(1.0));
00873 BPF &m1 = in1.GetMagBPF();
00874 BPF &f1 = in1.GetPhaseBPF();
00875 Complex *c2 = in2.GetComplexArray().GetPtr();
00876 Complex *co = out.GetComplexArray().GetPtr();
00877
00878
00879 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00880 if(intFactor>1) intFactor=1;
00881 if(intFactor<0) intFactor=0;
00882 TData invIntFactor=1-intFactor;
00883
00884 for (int i=0;i<mSize;i++) {
00885 TData BRe = CLAM_pow(TData(10),fabs(m1.GetValue(pos))/TData(10.0)) * CLAM_cos(f1.GetValue(pos));
00886 TData BIm = CLAM_pow(TData(10),fabs(m1.GetValue(pos))/TData(10.0)) * CLAM_sin(f1.GetValue(pos));
00887 co[i]= Complex(BRe,BIm)*invIntFactor + c2[i]*intFactor;
00888 pos+=delta;
00889 }
00890
00891 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=false;
00892 f.bComplex=true;
00893 out.SynchronizeTo(f);
00894
00895
00896 if (remove2) {
00897 in2.RemoveComplexArray();
00898 in2.UpdateData();
00899 }
00900 if (remove3) {
00901 out.RemoveComplexArray();
00902 out.UpdateData();
00903 }
00904 }
00905
00906
00907 void SpectrumInterpolator::InterpolateBPFPolar(Spectrum& in1, Spectrum& in2, Spectrum& out)
00908 {
00909 switch(mScaleState) {
00910 case Slinlin:
00911 InterpolateBPFPolarLin(in1,in2,out);
00912 break;
00913 case Sloglog:
00914 InterpolateBPFPolarLog(in1,in2,out);
00915 break;
00916 case Slinlog:
00917 CLAM_ASSERT(false,"InterpolateBPFPolarLinLog: Not implemented");
00918 break;
00919 case Sloglin:
00920 InterpolateBPFPolarLogLin(in1,in2,out);
00921 break;
00922 }
00923 }
00924
00925 void SpectrumInterpolator::InterpolatePolarBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
00926 {
00927 switch(mScaleState) {
00928 case Slinlin:
00929 InterpolateBPFPolarLin(in2,in1,out);
00930 break;
00931 case Sloglog:
00932 InterpolateBPFPolarLog(in2,in1,out);
00933 break;
00934 case Slinlog:
00935 InterpolateBPFPolarLogLin(in2,in1,out);
00936 break;
00937 case Sloglin:
00938 CLAM_ASSERT(false,"InterpolateBPFPolarLinLog: Not implemented");
00939 break;
00940 }
00941 }
00942
00943 void SpectrumInterpolator::InterpolateBPFPolarLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
00944 {
00945 bool remove2=false,remove3=false;
00946 SpecTypeFlags f;
00947
00948
00949
00950
00951
00952
00953
00954 in2.GetType(f);
00955 if (!f.bPolar) {
00956 remove2=true;
00957 f.bPolar=true;
00958 in2.SetTypeSynchronize(f);
00959 }
00960 out.GetType(f);
00961 if (!f.bPolar) {
00962 remove3=true;
00963 f.bPolar=true;
00964 out.SetType(f);
00965 }
00966
00967 TData pos = 0.0;
00968 TData delta = out.GetSpectralRange() /
00969 ((TData)out.GetSize()-TData(1.0));
00970 BPF &m1 = in1.GetMagBPF();
00971 BPF &f1 = in1.GetPhaseBPF();
00972 Polar *p2 = in2.GetPolarArray().GetPtr();
00973 Polar *po = out.GetPolarArray().GetPtr();
00974
00975
00976 TData intFactor=mInterpolationFactorCtl.GetLastValue();
00977 if(intFactor>1) intFactor=1;
00978 if(intFactor<0) intFactor=0;
00979 TData invIntFactor=1-intFactor;
00980 Polar polInvIntFactor=Polar(invIntFactor);
00981 Polar polIntFactor=Polar(intFactor);
00982
00983 for (int i=0;i<mSize;i++) {
00984 po[i]=polInvIntFactor*Polar(m1.GetValue(pos),f1.GetValue(pos))+polIntFactor*p2[i];
00985 pos+=delta;
00986 }
00987
00988 f.bMagPhase=f.bComplex=f.bMagPhaseBPF=false;
00989 f.bPolar=true;
00990 out.SynchronizeTo(f);
00991
00992 if (remove2) {
00993 in2.RemovePolarArray();
00994 in2.UpdateData();
00995 }
00996 if (remove3) {
00997 out.RemovePolarArray();
00998 out.UpdateData();
00999 }
01000 }
01001
01002 void SpectrumInterpolator::InterpolateBPFPolarLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
01003 {
01004 bool remove2=false,remove3=false;
01005 SpecTypeFlags f;
01006
01007
01008
01009
01010
01011
01012
01013 in2.GetType(f);
01014 if (!f.bPolar) {
01015 remove2=true;
01016 f.bPolar=true;
01017 in2.SetTypeSynchronize(f);
01018 }
01019 out.GetType(f);
01020 if (!f.bPolar) {
01021 remove3=true;
01022 f.bPolar=true;
01023 out.SetType(f);
01024 }
01025
01026 TData pos = 0.0;
01027 TData delta = out.GetSpectralRange() /
01028 ((TData)out.GetSize()-TData(1.0));
01029 BPF &m1 = in1.GetMagBPF();
01030 BPF &f1 = in1.GetPhaseBPF();
01031 Polar *p2 = in2.GetPolarArray().GetPtr();
01032 Polar *po = out.GetPolarArray().GetPtr();
01033
01034
01035 TData intFactor=mInterpolationFactorCtl.GetLastValue();
01036 if(intFactor>1) intFactor=1;
01037 if(intFactor<0) intFactor=0;
01038 TData invIntFactor=1-intFactor;
01039 Polar polInvIntFactor=Polar(invIntFactor);
01040 Polar polIntFactor=Polar(intFactor);
01041
01042 for (int i=0;i<mSize;i++) {
01043 TData BMag = CLAM_pow(TData(10),m1.GetValue(pos)/TData(10.0));
01044 TData BPha = f1.GetValue(pos);
01045 po[i]=polInvIntFactor*Polar(BMag,BPha)+polIntFactor*p2[i];
01046 pos+=delta;
01047 }
01048
01049 f.bMagPhase=f.bComplex=f.bMagPhaseBPF=false;
01050 f.bPolar=true;
01051 out.SynchronizeTo(f);
01052
01053 if (remove2) {
01054 in2.RemovePolarArray();
01055 in2.UpdateData();
01056 }
01057 if (remove3) {
01058 out.RemovePolarArray();
01059 out.UpdateData();
01060 }
01061 }
01062
01063 void SpectrumInterpolator::InterpolateBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
01064 {
01065
01066 TData intFactor=mInterpolationFactorCtl.GetLastValue();
01067 if(intFactor>1) intFactor=1;
01068 if(intFactor<0) intFactor=0;
01069 TData invIntFactor=1-intFactor;
01070
01071
01072
01073 for (int i=0;i<mSize;i++) {
01074 Point &pm1=in1.GetMagBPF().GetPointArray()[i];
01075 Point &pm2=in2.GetMagBPF().GetPointArray()[i];
01076 Point &pmo=out.GetMagBPF().GetPointArray()[i];
01077 Point &pf1=in1.GetPhaseBPF().GetPointArray()[i];
01078 Point &pf2=in2.GetPhaseBPF().GetPointArray()[i];
01079 Point &pfo=out.GetPhaseBPF().GetPointArray()[i];
01080 CLAM_ASSERT(pm1.GetX() == pm2.GetX(), "InterpolateBPF: input BPF abcisas do not match "
01081 "(and BPF merging not yet iplemented)");
01082 CLAM_ASSERT(pm1.GetX() == pmo.GetX(), "InterpolateBPF: ouput BPF abcisas do not match with imput "
01083 "(and BPF merging not yet iplemented)");
01084
01085
01086 pmo.SetY(invIntFactor*pm1.GetY()+intFactor*pm2.GetY());
01087 pfo.SetY(invIntFactor*pf1.GetY()+intFactor*pf2.GetY());
01088 }
01089
01090 }
01091
01092
01093 void SpectrumInterpolator::InterpolateMagPhaseLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01094 {
01095 CLAM_ASSERT(false,"InterpolateMagPhaseLog: Not implemented");
01096 }
01097 void SpectrumInterpolator::InterpolateMagPhaseLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01098 {
01099 CLAM_ASSERT(false,"InterpolateMagPhaseLinLog: Not implemented");
01100 }
01101 void SpectrumInterpolator::InterpolateComplexLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01102 {
01103 CLAM_ASSERT(false,"InterpolateComplexLog: Not implemented");
01104 }
01105 void SpectrumInterpolator::InterpolateComplexLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01106 {
01107 CLAM_ASSERT(false,"InterpolateComplexLinLog: Not implemented");
01108 }
01109 void SpectrumInterpolator::InterpolatePolarLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01110 {
01111 CLAM_ASSERT(false,"InterpolatePolarLog: Not implemented");
01112 }
01113 void SpectrumInterpolator::InterpolatePolarLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01114 {
01115 CLAM_ASSERT(false,"InterpolatePolarLinLog: Not implemented");
01116 }
01117 void SpectrumInterpolator::InterpolateBPFComplexLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01118 {
01119 CLAM_ASSERT(false,"InterpolateBPFComplexLog: Not implemented");
01120 }
01121 void SpectrumInterpolator::InterpolateBPFComplexLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01122 {
01123 CLAM_ASSERT(false,"InterpolateBPFComplexLinLog: Not implemented");
01124 }
01125 void SpectrumInterpolator::InterpolateBPFPolarLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01126 {
01127 CLAM_ASSERT(false,"InterpolateBPFPolarLog: Not implemented");
01128 }
01129 void SpectrumInterpolator::InterpolateBPFPolarLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01130 {
01131 CLAM_ASSERT(false,"InterpolateBPFPolarLinLog: Not implemented");
01132 }
01133 void SpectrumInterpolator::InterpolateBPFMagPhaseLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01134 {
01135 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLog: Not implemented");
01136 }
01137 void SpectrumInterpolator::InterpolateBPFMagPhaseLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
01138 {
01139 CLAM_ASSERT(false,"InterpolateBPFMagPhaseLinLog: Not implemented");
01140 }
01141 }
01142