00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "EnhADRess.h"
00020
00021 using std::ostringstream;
00022 using std::abs;
00023
00024 using namespace Marsyas;
00025
00026 EnhADRess::EnhADRess(mrs_string name):MarSystem("EnhADRess", name)
00027 {
00028 addControls();
00029 }
00030
00031 EnhADRess::EnhADRess(const EnhADRess& a) : MarSystem(a)
00032 {
00033
00034 }
00035
00036 EnhADRess::~EnhADRess()
00037 {
00038 }
00039
00040 MarSystem*
00041 EnhADRess::clone() const
00042 {
00043 return new EnhADRess(*this);
00044 }
00045
00046 void
00047 EnhADRess::addControls()
00048 {
00049 }
00050
00051 void
00052 EnhADRess::myUpdate(MarControlPtr sender)
00053 {
00054 MRSDIAG("EnhADRess.cpp - EnhADRess:myUpdate");
00055 (void) sender;
00056
00057 N2_ = inObservations_ / 2;
00058 N4_ = N2_/2 + 1;
00059
00060 ctrl_onSamples_->setValue(ctrl_inSamples_, NOUPDATE);
00061 ctrl_onObservations_->setValue(N4_*3, NOUPDATE);
00062 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00063
00064 ostringstream oss;
00065 for(mrs_natural n=0; n< N4_; ++n)
00066 {
00067 oss << "EnhADRess_Mag_bin_" << n <<",";
00068 }
00069 for(mrs_natural n=0; n< N4_; ++n)
00070 {
00071 oss << "EnhADRess_Phase_bin_" << n <<",";
00072 }
00073 for(mrs_natural n=0; n< N4_; ++n)
00074 {
00075 oss << "EnhADRess_Pan_bin_" << n <<",";
00076 }
00077 ctrl_onObsNames_->setValue(oss.str(), NOUPDATE);
00078 }
00079
00080 void
00081 EnhADRess::myProcess(realvec& in, realvec& out)
00082 {
00083 out.setval(0.0);
00084
00085 for(mrs_natural t=0; t < inSamples_; ++t)
00086 {
00087 for (mrs_natural k=0; k < N4_; k++)
00088 {
00089
00090 if (k==0)
00091 {
00092 rel_ = in(0,t);
00093 iml_ = 0.0;
00094 }
00095 else if (k == N4_-1)
00096 {
00097 rel_ = in(1, t);
00098 iml_ = 0.0;
00099 }
00100 else
00101 {
00102 rel_ = in(2*k, t);
00103 iml_ = in(2*k+1, t);
00104 }
00105
00106
00107 if (k==0)
00108 {
00109 rer_ = in(N2_,t);
00110 imr_ = 0.0;
00111 }
00112 else if (k == N4_-1)
00113 {
00114 rer_ = in(N2_+1, t);
00115 imr_ = 0.0;
00116 }
00117 else
00118 {
00119 rer_ = in(N2_ + 2*k, t);
00120 imr_ = in(N2_ + 2*k+1, t);
00121 }
00122
00123 phaseL_ = atan2(iml_, rel_);
00124 phaseR_ = atan2(imr_, rer_);
00125
00126 deltaPhase_ = abs(phaseL_ - phaseR_);
00127
00128
00129 deltaPhase_ = (mrs_real)fmod((double)deltaPhase_, (double)2*PI);
00130
00131
00132 Lk_ = sqrt(rel_*rel_ + iml_*iml_);
00133
00134
00135 Rk_ = sqrt(rer_*rer_ + imr_*imr_);
00136
00137 if(deltaPhase_ < PI/2)
00138 {
00139 minLk_ = Lk_ * sin(deltaPhase_);
00140 minRk_ = Rk_ * sin(deltaPhase_);
00141
00142 if(Lk_ < Rk_)
00143 {
00144
00145 mrs_real mag = Rk_ - minLk_;
00146
00147 if(20.0*log10(mag*mag+0.000000001) > -100.0)
00148 {
00149 out(k,t) = mag;
00150
00151
00152 out(k+N4_,t) = phaseR_;
00153
00154
00155 out(k+N4_*2,t) = 1.0 - Lk_ * cos(deltaPhase_) / Rk_ ;
00156 }
00157 }
00158 else if(Lk_ > Rk_)
00159 {
00160
00161 mrs_real mag = Lk_ - minRk_;
00162
00163 if(20.0*log10(mag*mag+0.000000001) > -100.0)
00164 {
00165 out(k,t) = mag;
00166
00167
00168 out(k+N4_,t) = phaseL_;
00169
00170
00171 out(k+N4_*2,t) = Rk_ * cos(deltaPhase_) / Lk_ -1.0;
00172 }
00173 }
00174 else if(Lk_ == Rk_)
00175 {
00176
00177 mrs_real mag = Lk_ - minRk_;
00178
00179 if(20.0*log10(mag*mag+0.000000001) > -100.0)
00180 {
00181 out(k,t) = mag;
00182
00183
00184 out(k+N4_,t) = phaseL_;
00185
00186
00187 out(k+N4_*2,t) = 0.0;
00188 }
00189 }
00190 }
00191 else
00192 {
00193 if(20.0*log10(Lk_*Lk_+0.000000001) < -100.0)
00194 Lk_ = 0.0;
00195 if(20.0*log10(Rk_*Rk_+0.000000001) < -100.0)
00196 Rk_ = 0.0;
00197
00198 if(Lk_ > Rk_)
00199 {
00200 out(k,t) = Lk_;
00201 out(k+N4_,t) = phaseL_;
00202 out(k+N4_*2,t) = 0.0;
00203 }
00204 else if(Rk_ > Lk_)
00205 {
00206 out(k,t) = Rk_;
00207 out(k+N4_,t) = phaseR_;
00208 out(k+N4_*2,t) = 0.0;
00209 }
00210 else if(Lk_ == Rk_ && Lk_ != 0.0)
00211 {
00212 out(k,t) = Lk_;
00213 out(k+N4_,t) = phaseL_;
00214 out(k+N4_*2,t) = 0.0;
00215 }
00216 }
00217 }
00218 }
00219
00220
00221
00222 }