41 complex_bufs(0),polar_bufs(0),mag_bufs(0),phase_bufs(0),
52 complex_bufs(0),polar_bufs(0),mag_bufs(0),phase_bufs(0),
60 std::string SpectrumAdder::NewUniqueName()
62 static int ObjectCount=0;
64 std::stringstream name;
66 name <<
"SpectrumAdder_" << ObjectCount++;
71 bool SpectrumAdder::ConcreteConfigure(
const ProcessingConfig&c)
76 if (mConfig.HasNInputs())
77 oldNInputs = mConfig.GetNInputs();
82 if ( !mConfig.HasNInputs() ||
83 mConfig.GetNInputs() <= 0 ) {
88 mNInputs = mConfig.GetNInputs();
90 if (mNInputs == oldNInputs)
118 mInputs =
new InPort<Spectrum>*[mNInputs];
119 complex_bufs =
new Complex*[mNInputs];
120 polar_bufs =
new Polar*[mNInputs];
121 mag_bufs =
new TData*[mNInputs];
122 phase_bufs =
new TData*[mNInputs];
123 remove =
new bool[mNInputs];
125 for (
int i=0; i<mNInputs; i++) {
126 std::stringstream name;
127 name <<
"Input " << i;
128 mInputs[i]=
new InPort<Spectrum>(name.str(),
this);
140 delete(complex_bufs);
166 "SpectrumAdder::Do(): Not in execution mode");
168 switch (mProtoState) {
171 AddMagPhase(inputs,out);
174 AddComplex(inputs,out);
177 AddPolar(inputs,out);
180 CLAM_ASSERT(
false,
"SpectrumAdder::Do(): BPF addition not implemented");
187 CLAM_ASSERT(
false,
"Do(...) : internal inconsistency (invalid mProtoState)");
195 CLAM_ASSERT(
false,
"SpectrumAdder::Do(): Not implemented");
203 "SpectrumAdder::SetPrototypes(): Not configured");
205 "SpectrumAdder::SetPrototypes(): Inconsistent mNInputs");
213 for (
int i=0; i<mNInputs; i++) {
223 for (
int i=0;i<mNInputs; i++)
224 CLAM_ASSERT(ti[i].bMagPhase || ti[i].bComplex || ti[i].bPolar,
225 "SpectrumAdders: Output spectrum object with no non-BPF attributes");
227 "SpectrumAdders: Output spectrum object with no non-BPF attributes");
229 CLAM_ASSERT(so.GetSize(),
"SpectrumAdder::SetPrototypes: Zero size spectrum output");
233 TData range = so.GetSpectralRange();
234 EScale scale = so.GetScale();
237 for (
int i=0; i<mNInputs; i++) {
239 "SpectrumAdder::SetPrototypes: Size mismatch in spectrum sum");
241 "SpectrumAdder::SetPrototypes: Spectral range mismatch in spectrum sum");
243 "SpectrumAdder::SetPrototypes: Scale mismatch in spectrum sum");
256 int Ncomplex=0,Npolar=0,Nmagphase=0;
257 for (
int i=0; i<mNInputs;i++) {
273 for (
int i=mNInputs+1; i>0; i--) {
274 if (Nmagphase == i) {
275 mProtoState=SMagPhase;
279 mProtoState=SComplex;
287 CLAM_ASSERT(
false,
"SpectrumAdder::SetPrototypes: Prototype inconsistency");
293 CLAM_ASSERT(
false,
"SpectrumAdder::SetPrototypes(): Not implemented");
305 PrototypeState state_copy = mProtoState;
306 ScaleState state2_copy = mScaleState;
311 mProtoState = state_copy;
312 mScaleState = state2_copy;
316 void SpectrumAdder::AddMagPhase(Spectrum **inputs, Spectrum& out)
318 switch(mScaleState) {
320 AddMagPhaseLin(inputs,out);
323 AddMagPhaseLog(inputs,out);
328 void SpectrumAdder::AddMagPhaseLin(Spectrum **inputs, Spectrum& out)
338 for (i=0;i<mNInputs; i++) {
339 inputs[i]->GetType(f);
343 inputs[i]->SetTypeSynchronize(f);
347 mag_bufs[i] = inputs[i]->GetMagBuffer().GetPtr();
348 phase_bufs[i] = inputs[i]->GetPhaseBuffer().GetPtr();
357 TData *mo = out.GetMagBuffer().GetPtr();
358 TData *fo = out.GetPhaseBuffer().GetPtr();
360 for (
int s=0;s<mSize; s++) {
362 for (i=0;i<mNInputs; i++) {
363 re+=mag_bufs[i][s]*
TData(cos(phase_bufs[i][s]));
364 im+=mag_bufs[i][s]*
TData(sin(phase_bufs[i][s]));
366 mo[s]=
TData(sqrt(re*re+im*im));
367 fo[s]=
TData(atan2(im,re));
370 f.bComplex=f.bPolar=f.bMagPhaseBPF=
false;
372 out.SynchronizeTo(f);
374 for (i=0; i<mNInputs; i++)
376 inputs[i]->RemoveMagBuffer();
377 inputs[i]->RemovePhaseBuffer();
378 inputs[i]->UpdateData();
381 out.RemoveMagBuffer();
382 out.RemovePhaseBuffer();
388 void SpectrumAdder::AddComplex(Spectrum **inputs, Spectrum& out)
390 switch(mScaleState) {
392 AddComplexLin(inputs,out);
395 AddComplexLog(inputs,out);
400 void SpectrumAdder::AddComplexLin(Spectrum **inputs, Spectrum& out)
411 for (i=0;i<mNInputs; i++) {
412 inputs[i]->GetType(f);
416 inputs[i]->SetTypeSynchronize(f);
420 complex_bufs[i] = inputs[i]->GetComplexArray().GetPtr();
429 Complex *co = out.GetComplexArray().GetPtr();
431 for (
int s=0;s<mSize;s++) {
433 for (i=0;i<mNInputs; i++)
434 co[s]+=complex_bufs[i][s];
437 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=
false;
439 out.SynchronizeTo(f);
441 for (i=0; i<mNInputs; i++)
443 inputs[i]->RemoveComplexArray();
444 inputs[i]->UpdateData();
447 out.RemoveComplexArray();
453 void SpectrumAdder::AddPolar(Spectrum **inputs, Spectrum& out)
455 switch(mScaleState) {
457 AddPolarLin(inputs,out);
460 AddPolarLog(inputs,out);
465 void SpectrumAdder::AddPolarLin(Spectrum **inputs, Spectrum& out)
476 for (i=0;i<mNInputs; i++) {
477 inputs[i]->GetType(f);
481 inputs[i]->SetTypeSynchronize(f);
485 polar_bufs[i] = inputs[i]->GetPolarArray().GetPtr();
495 Polar *po = out.GetPolarArray().GetPtr();
496 for (
int s=0;s<mSize;s++) {
497 po[s]=
Polar(0.0,0.0);
498 for (i=0;i<mNInputs;i++)
499 po[s]+=polar_bufs[i][s];
502 f.bComplex=f.bMagPhase=f.bMagPhaseBPF=
false;
504 out.SynchronizeTo(f);
506 for (i=0; i<mNInputs; i++)
508 inputs[i]->RemovePolarArray();
509 inputs[i]->UpdateData();
512 out.RemovePolarArray();
519 void SpectrumAdder::AddMagPhaseLog(Spectrum **inputs, Spectrum& out)
521 CLAM_ASSERT(
false,
"AddMagPhaseLog: Not implemented");
523 void SpectrumAdder::AddComplexLog(Spectrum **inputs, Spectrum& out)
525 CLAM_ASSERT(
false,
"AddComplexLog: Not implemented");
527 void SpectrumAdder::AddPolarLog(Spectrum **inputs, Spectrum& out)