// accumulate statistics void DTAccumulator::accumulate(Alignment *alignment, MatrixBase<float> &mFeatures, bool bNumerator) { Accumulator *accumulator = NULL; double dOccupationTotal = 0.0; for(unsigned int t=0 ; t < alignment->getFrames() ; ++t) { FrameAlignment *frameAlignment = alignment->getFrameAlignment(t); VectorStatic<float> vFeatureVector = mFeatures.getRow(t); for(FrameAlignment::iterator it = frameAlignment->begin() ; it != frameAlignment->end() ; ++it) { double dOccupationNum = (*it)->dOccupation; HMMState *hmmState = m_hmmManager->getHMMState((*it)->iHMMState); // get Gaussian occupation from the mixture occupation // (1) compute the mixture likelihood (all Gaussian components) double dLikelihoodTotal = -DBL_MAX; int iGaussianComponents = hmmState->getMixture().getNumberComponents(); double *dLikelihoodGaussian = new double[iGaussianComponents]; for(int iGaussian = 0 ; iGaussian < iGaussianComponents ; ++iGaussian) { dLikelihoodGaussian[iGaussian] = hmmState->computeEmissionProbabilityGaussian(iGaussian, mFeatures.getRow(t).getData(),-1); dLikelihoodGaussian[iGaussian] += log(hmmState->getMixture()(iGaussian)->weight()); dLikelihoodTotal = Numeric::logAddition(dLikelihoodTotal,dLikelihoodGaussian[iGaussian]); } // (2) accumulate statistics for each mixture component for(int iGaussian = 0 ; iGaussian < iGaussianComponents ; ++iGaussian) { double dProbGaussian = exp(dLikelihoodGaussian[iGaussian]-dLikelihoodTotal); assert(dProbGaussian >= 0.0); double dOccupationGaussian = dOccupationNum*dProbGaussian; unsigned int iKey = Accumulator::getPhysicalAccumulatorKey(hmmState->getId(),iGaussian); if (bNumerator) { accumulator = m_mAccumulatorNum[iKey]; } else { accumulator = m_mAccumulatorDen[iKey]; } accumulator->accumulateObservation(vFeatureVector,dOccupationGaussian); dOccupationTotal += dOccupationGaussian; } delete [] dLikelihoodGaussian; } } printf("accumulated: %12.6f\n",dOccupationTotal); }