Mercurial > hg > aimc
diff src/Modules/Features/ModuleGaussians.cc @ 1:bc394a985042
- Fixed the python SWIG wrappers
- Added stub test for the Gaussian features, and test data
- Fixed build errors
author | tomwalters |
---|---|
date | Mon, 15 Feb 2010 20:37:26 +0000 |
parents | 582cbe817f2c |
children | e91769e84be1 |
line wrap: on
line diff
--- a/src/Modules/Features/ModuleGaussians.cc Fri Feb 12 12:31:23 2010 +0000 +++ b/src/Modules/Features/ModuleGaussians.cc Mon Feb 15 20:37:26 2010 +0000 @@ -21,7 +21,7 @@ */ /*! - * \author Tom Walters <tcw24@cam.ac.uk> + * \author Thomas Walters <tom@acousticscale.org> * \date created 2008/06/23 * \version \$Id: ModuleGaussians.cc 2 2010-02-02 12:59:50Z tcw $ */ @@ -36,26 +36,21 @@ : Module(pParam) { // Set module metadata module_description_ = "Gaussian Fitting to SSI profile"; - module_identifier_ = "gaussians"; // unique identifier for the module + module_identifier_ = "gaussians"; module_type_ = "features"; module_version_ = "$Id: ModuleGaussians.cc 2 2010-02-02 12:59:50Z tcw $"; - parameters_->SetDefault("features.gaussians.ncomp", "4"); - m_iParamNComp = parameters_->GetInt("features.gaussians.ncomp"); + m_iParamNComp = parameters_->DefaultInt("features.gaussians.ncomp", 4); + m_fParamVar = parameters_->DefaultFloat("features.gaussians.var", 115.0); + m_fParamPosteriorExp = + parameters_->DefaultFloat("features.gaussians.posterior_exp", 6.0); + m_iParamMaxIt = parameters_->DefaultInt("features.gaussians.maxit", 250); - parameters_->SetDefault("features.gaussians.var", "115.0"); - m_fParamVar = parameters_->GetFloat("features.gaussians.var"); - - parameters_->SetDefault("features.gaussians.posterior_exp", "6.0"); - m_fParamPosteriorExp = - parameters_->GetFloat("features.gaussians.posterior_exp"); - - parameters_->SetDefault("features.gaussians.maxit", "250"); - m_iParamMaxIt = parameters_->GetInt("features.gaussians.maxit"); - - parameters_->SetDefault("features.gaussians.priors_converged", "1e-7"); + // The parameters system doesn't support tiny numbers well, to define this + // variable as a string, then convert it to a float afterwards + parameters_->DefaultString("features.gaussians.priors_converged", "1e-7"); m_fParamPriorsConverged = - parameters_->GetInt("features.gaussians.priors_converged"); + parameters_->GetFloat("features.gaussians.priors_converged"); } ModuleGaussians::~ModuleGaussians() { @@ -68,7 +63,7 @@ // Assuming the number of channels is greater than twice the number of // Gaussian components, this is ok if (input.channel_count() >= 2 * m_iParamNComp) { - output_.Initialize(1, m_iParamNComp, input.sample_rate()); + output_.Initialize(m_iParamNComp, 1, input.sample_rate()); } else { LOG_ERROR(_T("Too few channels in filterbank to produce sensible " "Gaussian features. Either increase the number of filterbank" @@ -88,8 +83,10 @@ } void ModuleGaussians::Process(const SignalBank &input) { - int iAudCh = 0; - + if (!initialized_) { + LOG_ERROR(_T("Module ModuleGaussians not initialized.")); + return; + } // Calculate spectral profile for (int iChannel = 0; iChannel < input.channel_count(); @@ -100,6 +97,19 @@ ++iSample) { m_pSpectralProfile[iChannel] += input[iChannel][iSample]; } + m_pSpectralProfile[iChannel] /= static_cast<float>(input.buffer_length()); + } + + float spectral_profile_sum = 0.0f; + for (int i = 0; i < input.channel_count(); ++i) { + spectral_profile_sum += m_pSpectralProfile[i]; + } + + double logsum = log(spectral_profile_sum); + if (!isinf(logsum)) { + output_.set_sample(m_iParamNComp - 1, 0, logsum); + } else { + output_.set_sample(m_iParamNComp - 1, 0, -1000.0); } for (int iChannel = 0; @@ -108,11 +118,6 @@ m_pSpectralProfile[iChannel] = pow(m_pSpectralProfile[iChannel], 0.8); } - float spectral_profile_sum = 0.0f; - for (int i = 0; i < input.channel_count(); ++i) { - spectral_profile_sum += m_pSpectralProfile[i]; - } - RubberGMMCore(2, true); float fMean1 = m_pMu[0]; @@ -142,15 +147,7 @@ output_.set_sample(i, 0, 0.0f); } } - /*for (int i = m_iParamNComp; i < m_iParamNComp * 2; ++i) { - m_pOutputData->getSignal(i)->setSample(iAudCh, 0, m_pMu[i-m_iParamNComp]); - }*/ - double logsum = log(spectral_profile_sum); - if (!isinf(logsum)) { - output_.set_sample(m_iParamNComp - 1, 0, logsum); - } else { - output_.set_sample(m_iParamNComp - 1, 0, -1000.0); - } + PushOutput(); }