33 "key",
"SpectrumProduct",
34 "category",
"Arithmetic Operations",
35 "description",
"SpectrumProduct",
38 static FactoryRegistrator<ProcessingFactory, SpectrumProduct>
reg =
metadata;
44 mInput1(
"Input 1",this),
45 mInput2(
"Input 2",this),
46 mOutput(
"Output",this)
58 "SpectrumProduct::Do(): Not in execution mode");
60 switch (mProtoState) {
63 MultiplyMagPhase(in1,in2,out);
66 MultiplyComplex(in1,in2,out);
69 MultiplyPolar(in1,in2,out);
72 MultiplyBPF(in1,in2,out);
75 MultiplyBPFMagPhase(in1,in2,out);
78 MultiplyBPFComplex(in1,in2,out);
81 MultiplyBPFPolar(in1,in2,out);
84 MultiplyMagPhaseBPF(in1,in2,out);
87 MultiplyComplexBPF(in1,in2,out);
90 MultiplyPolarBPF(in1,in2,out);
97 CLAM_ASSERT(
false,
"Do(...) : internal inconsistency (invalid mProtoState)");
109 if (in1.HasComplexArray())
110 std::cout <<
"in1.HasComplexArray()" << std::endl;
142 "SpectrumProducts: First input Spectrum without content");
144 "SpectrumProducts: Second input Spectrum without content");
146 "SpectrumProducts: Output Spectrum object without content");
152 CLAM_ASSERT(mSize,
"SpectrumProduct::SetPrototypes: Zero size spectrum");
157 if (!mSize) mSize = in2.
GetSize();
159 "SpectrumProduct::SetPrototypes: Sizes Mismatch");
164 if (!mSize) mSize = out.
GetSize();
166 "SpectrumProduct::SetPrototypes: Output size Mismatch");
174 CLAM_ASSERT(in1.GetSpectralRange() == in2.GetSpectralRange(),
175 "SpectrumProduct::SetPrototypes: Spectral range mismatch on inputs");
176 CLAM_ASSERT(in1.GetSpectralRange() == out.GetSpectralRange(),
177 "SpectrumProduct::SetPrototypes: Spectral range mismatch on output");
193 "SpectrumProduct: Log Scale Output not implemented");
198 bool i1BPF=
false, i2BPF=
false, oBPF=
false;
214 mProtoState=SBPFMagPhase;
218 mProtoState=SBPFComplex;
222 mProtoState=SBPFPolar;
227 mProtoState=SBPFMagPhase;
231 mProtoState=SBPFComplex;
235 mProtoState=SBPFPolar;
240 "SpectrumProduct::SetPrototypes: Data flags internal inconsistency");
245 mProtoState=SMagPhaseBPF;
249 mProtoState=SComplexBPF;
253 mProtoState=SPolarBPF;
258 mProtoState=SMagPhaseBPF;
262 mProtoState=SComplexBPF;
265 mProtoState=SPolarBPF;
269 CLAM_ASSERT(
false,
"SpectrumProduct::SetPrototypes:"
270 " invalid data flags");
274 mProtoState=SMagPhase;
278 mProtoState=SComplex;
289 mProtoState=SMagPhase;
295 mProtoState=SComplex;
305 mProtoState=SMagPhase;
312 CLAM_ASSERT(
false,
"SpectrumProduct::SetPrototypes(): Not implemented");
325 PrototypeState state_copy = mProtoState;
326 ScaleState state2_copy = mScaleState;
331 mProtoState = state_copy;
332 mScaleState = state2_copy;
336 void SpectrumProduct::MultiplyMagPhase(Spectrum& in1, Spectrum& in2, Spectrum& out)
338 switch(mScaleState) {
340 MultiplyMagPhaseLin(in1,in2,out);
343 MultiplyMagPhaseLog(in1,in2,out);
346 MultiplyMagPhaseLinLog(in1,in2,out);
349 MultiplyMagPhaseLinLog(in2,in1,out);
354 void SpectrumProduct::MultiplyMagPhaseLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
356 bool remove1=
false,remove2=
false,remove3=
false;
368 in1.SetTypeSynchronize(f);
374 in2.SetTypeSynchronize(f);
383 TData *m1 = in1.GetMagBuffer().GetPtr();
384 TData *f1 = in1.GetPhaseBuffer().GetPtr();
385 TData *m2 = in2.GetMagBuffer().GetPtr();
386 TData *f2 = in2.GetPhaseBuffer().GetPtr();
387 TData *mo = out.GetMagBuffer().GetPtr();
388 TData *fo = out.GetPhaseBuffer().GetPtr();
389 for (
int i=0;i<mSize;i++) {
394 f.bComplex=f.bPolar=f.bMagPhaseBPF=
false;
396 out.SynchronizeTo(f);
399 in1.RemoveMagBuffer();
400 in1.RemovePhaseBuffer();
404 in2.RemoveMagBuffer();
405 in2.RemovePhaseBuffer();
409 out.RemoveMagBuffer();
410 out.RemovePhaseBuffer();
416 void SpectrumProduct::MultiplyComplex(Spectrum& in1, Spectrum& in2, Spectrum& out)
418 switch(mScaleState) {
420 MultiplyComplexLin(in1,in2,out);
423 MultiplyComplexLog(in1,in2,out);
426 MultiplyComplexLinLog(in1,in2,out);
429 MultiplyComplexLinLog(in2,in1,out);
434 void SpectrumProduct::MultiplyComplexLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
436 bool remove1=
false,remove2=
false,remove3=
false;
448 in1.SetTypeSynchronize(f);
454 in2.SetTypeSynchronize(f);
463 Complex *c1 = in1.GetComplexArray().GetPtr();
464 Complex *c2 = in2.GetComplexArray().GetPtr();
465 Complex *co = out.GetComplexArray().GetPtr();
466 for (
int i=0;i<mSize;i++)
469 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=
false;
471 out.SynchronizeTo(f);
474 in1.RemoveComplexArray();
478 in2.RemoveComplexArray();
482 out.RemoveComplexArray();
488 void SpectrumProduct::MultiplyPolar(Spectrum& in1, Spectrum& in2, Spectrum& out)
490 switch(mScaleState) {
492 MultiplyPolarLin(in1,in2,out);
495 MultiplyPolarLog(in1,in2,out);
498 MultiplyPolarLinLog(in1,in2,out);
501 MultiplyPolarLinLog(in2,in1,out);
506 void SpectrumProduct::MultiplyPolarLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
508 bool remove1=
false,remove2=
false,remove3=
false;
520 in1.SetTypeSynchronize(f);
526 in2.SetTypeSynchronize(f);
535 Polar *p1 = in1.GetPolarArray().GetPtr();
536 Polar *p2 = in2.GetPolarArray().GetPtr();
537 Polar *po = out.GetPolarArray().GetPtr();
538 for (
int i=0;i<mSize;i++)
541 f.bComplex=f.bMagPhase=f.bMagPhaseBPF=
false;
543 out.SynchronizeTo(f);
546 in1.RemovePolarArray();
550 in2.RemovePolarArray();
554 out.RemovePolarArray();
560 void SpectrumProduct::MultiplyBPFMagPhase(Spectrum& in1, Spectrum& in2, Spectrum& out)
562 switch(mScaleState) {
564 MultiplyBPFMagPhaseLin(in1,in2,out);
567 MultiplyBPFMagPhaseLog(in1,in2,out);
570 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLinLog: Not implemented");
573 MultiplyBPFMagPhaseLogLin(in1,in2,out);
578 void SpectrumProduct::MultiplyMagPhaseBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
580 switch(mScaleState) {
582 MultiplyBPFMagPhaseLin(in2,in1,out);
585 MultiplyBPFMagPhaseLog(in2,in1,out);
588 MultiplyBPFMagPhaseLogLin(in2,in1,out);
591 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLinLog: Not implemented");
596 void SpectrumProduct::MultiplyBPFMagPhaseLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
598 bool remove2=
false,remove3=
false;
611 in2.SetTypeSynchronize(f);
621 TData delta = out.GetSpectralRange() /
623 BPF &m1 = in1.GetMagBPF();
624 BPF &f1 = in1.GetPhaseBPF();
625 TData *m2 = in2.GetMagBuffer().GetPtr();
626 TData *f2 = in2.GetPhaseBuffer().GetPtr();
627 TData *mo = out.GetMagBuffer().GetPtr();
628 TData *fo = out.GetPhaseBuffer().GetPtr();
629 for (
int i=0;i<mSize;i++) {
630 mo[i]=m1.GetValue(pos)*m2[i];
631 fo[i]=f1.GetValue(pos)+f2[i];
635 f.bComplex=f.bPolar=f.bMagPhaseBPF=
false;
637 out.SynchronizeTo(f);
640 in2.RemoveMagBuffer();
641 in2.RemovePhaseBuffer();
645 out.RemoveMagBuffer();
646 out.RemovePhaseBuffer();
651 void SpectrumProduct::MultiplyBPFMagPhaseLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
653 bool remove2=
false,remove3=
false;
666 in2.SetTypeSynchronize(f);
676 TData delta = out.GetSpectralRange() /
678 BPF &m1 = in1.GetMagBPF();
679 BPF &f1 = in1.GetPhaseBPF();
680 TData *m2 = in2.GetMagBuffer().GetPtr();
681 TData *f2 = in2.GetPhaseBuffer().GetPtr();
682 TData *mo = out.GetMagBuffer().GetPtr();
683 TData *fo = out.GetPhaseBuffer().GetPtr();
684 for (
int i=0;i<mSize;i++) {
685 mo[i]=
TData(pow(10.0,m1.GetValue(pos)/10.0))*m2[i];
686 fo[i]=f1.GetValue(pos)+f2[i];
690 f.bComplex=f.bPolar=f.bMagPhaseBPF=
false;
692 out.SynchronizeTo(f);
695 in2.RemoveMagBuffer();
696 in2.RemovePhaseBuffer();
700 out.RemoveMagBuffer();
701 out.RemovePhaseBuffer();
706 void SpectrumProduct::MultiplyBPFComplex(Spectrum& in1, Spectrum& in2, Spectrum& out)
708 switch(mScaleState) {
710 MultiplyBPFComplexLin(in1,in2,out);
713 MultiplyBPFComplexLog(in1,in2,out);
716 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLinLog: Not implemented");
719 MultiplyBPFComplexLogLin(in1,in2,out);
723 void SpectrumProduct::MultiplyComplexBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
725 switch(mScaleState) {
727 MultiplyBPFComplexLin(in2,in1,out);
730 MultiplyBPFComplexLog(in2,in1,out);
733 MultiplyBPFComplexLogLin(in2,in1,out);
736 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLinLog: Not implemented");
741 void SpectrumProduct::MultiplyBPFComplexLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
743 bool remove2=
false,remove3=
false;
756 in2.SetTypeSynchronize(f);
766 TData delta = out.GetSpectralRange() /
768 BPF &m1 = in1.GetMagBPF();
769 BPF &f1 = in1.GetPhaseBPF();
770 Complex *c2 = in2.GetComplexArray().GetPtr();
771 Complex *co = out.GetComplexArray().GetPtr();
772 for (
int i=0;i<mSize;i++) {
773 TData BRe =
TData(fabs(m1.GetValue(pos)) * cos(f1.GetValue(pos)));
774 TData BIm =
TData(fabs(m1.GetValue(pos)) * sin(f1.GetValue(pos)));
775 co[i]=
Complex(BRe,BIm) * c2[i];
779 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=
false;
781 out.SynchronizeTo(f);
784 in2.RemoveComplexArray();
788 out.RemoveComplexArray();
796 void SpectrumProduct::MultiplyBPFComplexLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
798 bool remove2=
false,remove3=
false;
811 in2.SetTypeSynchronize(f);
821 TData delta = out.GetSpectralRange() /
823 BPF &m1 = in1.GetMagBPF();
824 BPF &f1 = in1.GetPhaseBPF();
825 Complex *c2 = in2.GetComplexArray().GetPtr();
826 Complex *co = out.GetComplexArray().GetPtr();
827 for (
int i=0;i<mSize;i++) {
828 TData BRe =
TData(pow(10.0,fabs(m1.GetValue(pos))/10.0) * cos(f1.GetValue(pos)));
829 TData BIm =
TData(pow(10.0,fabs(m1.GetValue(pos))/10.0) * sin(f1.GetValue(pos)));
830 co[i]=
Complex(BRe,BIm) * c2[i];
834 f.bMagPhase=f.bPolar=f.bMagPhaseBPF=
false;
836 out.SynchronizeTo(f);
839 in2.RemoveComplexArray();
843 out.RemoveComplexArray();
849 void SpectrumProduct::MultiplyBPFPolar(Spectrum& in1, Spectrum& in2, Spectrum& out)
851 switch(mScaleState) {
853 MultiplyBPFPolarLin(in1,in2,out);
856 MultiplyBPFPolarLog(in1,in2,out);
859 CLAM_ASSERT(
false,
"MultiplyBPFPolarLinLog: Not implemented");
862 MultiplyBPFPolarLogLin(in1,in2,out);
866 void SpectrumProduct::MultiplyPolarBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
868 switch(mScaleState) {
870 MultiplyBPFPolarLin(in2,in1,out);
873 MultiplyBPFPolarLog(in2,in1,out);
876 MultiplyBPFPolarLogLin(in2,in1,out);
879 CLAM_ASSERT(
false,
"MultiplyBPFPolarLinLog: Not implemented");
884 void SpectrumProduct::MultiplyBPFPolarLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
886 bool remove2=
false,remove3=
false;
899 in2.SetTypeSynchronize(f);
909 TData delta = out.GetSpectralRange() /
911 BPF &m1 = in1.GetMagBPF();
912 BPF &f1 = in1.GetPhaseBPF();
913 Polar *p2 = in2.GetPolarArray().GetPtr();
914 Polar *po = out.GetPolarArray().GetPtr();
915 for (
int i=0;i<mSize;i++) {
916 po[i]=
Polar(m1.GetValue(pos),f1.GetValue(pos))*p2[i];
920 f.bMagPhase=f.bComplex=f.bMagPhaseBPF=
false;
922 out.SynchronizeTo(f);
925 in2.RemovePolarArray();
929 out.RemovePolarArray();
934 void SpectrumProduct::MultiplyBPFPolarLogLin(Spectrum& in1, Spectrum& in2, Spectrum& out)
936 bool remove2=
false,remove3=
false;
949 in2.SetTypeSynchronize(f);
959 TData delta = out.GetSpectralRange() /
961 BPF &m1 = in1.GetMagBPF();
962 BPF &f1 = in1.GetPhaseBPF();
963 Polar *p2 = in2.GetPolarArray().GetPtr();
964 Polar *po = out.GetPolarArray().GetPtr();
965 for (
int i=0;i<mSize;i++) {
966 TData BMag =
TData(pow(10.0,m1.GetValue(pos)/10.0));
967 TData BPha = f1.GetValue(pos);
968 po[i]=
Polar(BMag,BPha)*p2[i];
972 f.bMagPhase=f.bComplex=f.bMagPhaseBPF=
false;
974 out.SynchronizeTo(f);
977 in2.RemovePolarArray();
981 out.RemovePolarArray();
986 void SpectrumProduct::MultiplyBPF(Spectrum& in1, Spectrum& in2, Spectrum& out)
989 CLAM_ASSERT(
false,
"MultiplyBPF: method not implemented");
990 for (
int i=0;i<mSize;i++) {
991 PointTmpl<TData,TData> &pm1=in1.GetMagBPF().GetPointArray()[i];
992 PointTmpl<TData,TData> &pm2=in2.GetMagBPF().GetPointArray()[i];
993 PointTmpl<TData,TData> &pmo=out.GetMagBPF().GetPointArray()[i];
994 PointTmpl<TData,TData> &pf1=in1.GetPhaseBPF().GetPointArray()[i];
995 PointTmpl<TData,TData> &pf2=in2.GetPhaseBPF().GetPointArray()[i];
996 PointTmpl<TData,TData> &pfo=out.GetPhaseBPF().GetPointArray()[i];
998 "MultiplyBPF: input BPF abcisas do not match "
999 "(and BPF merging not yet iplemented)");
1001 "MultiplyBPF: output BPF abcisas do not match "
1002 "(and BPF merging not yet iplemented)");
1003 pmo.SetY(pm1.GetY()*pm2.GetY());
1004 pfo.SetY(pf1.GetY()+pf2.GetY());
1009 void SpectrumProduct::MultiplyMagPhaseLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1011 CLAM_ASSERT(
false,
"MultiplyMagPhaseLog: Not implemented");
1013 void SpectrumProduct::MultiplyMagPhaseLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1015 CLAM_ASSERT(
false,
"MultiplyMagPhaseLinLog: Not implemented");
1017 void SpectrumProduct::MultiplyComplexLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1019 CLAM_ASSERT(
false,
"MultiplyComplexLog: Not implemented");
1021 void SpectrumProduct::MultiplyComplexLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1023 CLAM_ASSERT(
false,
"MultiplyComplexLinLog: Not implemented");
1025 void SpectrumProduct::MultiplyPolarLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1027 CLAM_ASSERT(
false,
"MultiplyPolarLog: Not implemented");
1029 void SpectrumProduct::MultiplyPolarLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1031 CLAM_ASSERT(
false,
"MultiplyPolarLinLog: Not implemented");
1033 void SpectrumProduct::MultiplyBPFComplexLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1035 CLAM_ASSERT(
false,
"MultiplyBPFComplexLog: Not implemented");
1037 void SpectrumProduct::MultiplyBPFComplexLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1039 CLAM_ASSERT(
false,
"MultiplyBPFComplexLinLog: Not implemented");
1041 void SpectrumProduct::MultiplyBPFPolarLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1043 CLAM_ASSERT(
false,
"MultiplyBPFPolarLog: Not implemented");
1045 void SpectrumProduct::MultiplyBPFPolarLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1047 CLAM_ASSERT(
false,
"MultiplyBPFPolarLinLog: Not implemented");
1049 void SpectrumProduct::MultiplyBPFMagPhaseLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1051 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLog: Not implemented");
1053 void SpectrumProduct::MultiplyBPFMagPhaseLinLog(Spectrum& in1, Spectrum& in2, Spectrum& out)
1055 CLAM_ASSERT(
false,
"MultiplyBPFMagPhaseLinLog: Not implemented");