00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "SNR.h"
00020
00021 using namespace std;
00022 using namespace Marsyas;
00023
00024 SNR::SNR(mrs_string name):MarSystem("SNR", name)
00025 {
00026 addControls();
00027 nsum_ = 0.0;
00028 nbsum_ = 0.0;
00029 psum_ = 0.0;
00030 dsum_ = 0.0;
00031 }
00032
00033 SNR::SNR(const SNR& a) : MarSystem(a)
00034 {
00035 ctrl_mode_ = getctrl("mrs_string/mode");
00036 ctrl_done_ = getctrl("mrs_bool/done");
00037 nsum_ = 0.0;
00038 dsum_ = 0.0;
00039 nbsum_ = 0.0;
00040 psum_ = 0.0;
00041 }
00042
00043
00044 SNR::~SNR()
00045 {
00046 }
00047
00048 MarSystem*
00049 SNR::clone() const
00050 {
00051 return new SNR(*this);
00052 }
00053
00054 void
00055 SNR::addControls()
00056 {
00057 addctrl("mrs_string/mode", "standard", ctrl_mode_);
00058 addctrl("mrs_bool/done", false, ctrl_done_);
00059
00060 }
00061
00062 void
00063 SNR::myUpdate(MarControlPtr sender)
00064 {
00065 (void) sender;
00066 MRSDIAG("SNR.cpp - SNR:myUpdate");
00067 ctrl_onSamples_->setValue((mrs_natural)1, NOUPDATE);
00068 ctrl_onObservations_->setValue((mrs_natural)2, NOUPDATE);
00069 ctrl_osrate_->setValue(ctrl_israte_, NOUPDATE);
00070 ctrl_onObsNames_->setValue("SNR_" + ctrl_inObsNames_->to<mrs_string>() , NOUPDATE);
00071
00072
00073 }
00074
00075 void
00076 SNR::myProcess(realvec& in, realvec& out)
00077 {
00078 const mrs_string& mode = ctrl_mode_->to<mrs_string>();
00079 mrs_bool accumulateNow = true;
00080
00081 out.setval (0.);
00082
00083 mrs_real nsum = 0,
00084 nbsum = 0,
00085 psum = 0,
00086 diff = 0,
00087 dsum = 0;
00088
00089 for (mrs_natural t = 0; t < inSamples_; t++)
00090 {
00091 nsum += (in(0,t) * in(0,t));
00092 nbsum += (in(1,t) * in(1,t));
00093 psum += (in(0,t) * in(1,t));
00094 diff = (in(0,t) - in(1,t));
00095 dsum += (diff * diff);
00096 }
00097
00098 if (mode == "checkRef4Silence")
00099 {
00100 if (nbsum/inSamples_ < 1e-6)
00101 accumulateNow = false;
00102 }
00103
00104 if (accumulateNow)
00105 {
00106 nsum_ += nsum;
00107 nbsum_ += nbsum;
00108 psum_ += psum;
00109 dsum_ += dsum;
00110 }
00111
00112 if (nsum_ != 0 && dsum_ != 0)
00113 out(0,0) = 10. * log10(nsum_ / dsum_);
00114
00115 if (nsum_ != 0 && nbsum_ != 0)
00116 r_ = (psum_ / sqrt(nsum_ * nbsum_));
00117 else
00118 r_ = 0;
00119
00120 out(1,0) = 10. * log10(1 / (1 - (r_ * r_)));
00121
00122 if (ctrl_done_->to<mrs_bool>() == true)
00123 {
00124 nsum_ = 0.0;
00125 nbsum_ = 0.0;
00126 dsum_ = 0.0;
00127 psum_ = 0.0;
00128 }
00129
00130
00131
00132 }