Mercurial > hg > qm-dsp
view dsp/signalconditioning/Framer.cpp @ 30:a251fb0de594
* Make MFCC able to accept already-FFT'd input, and simplify API a bit
* Add log power value to MFCC, restore windowing, and avoid some heap allocs
* In HMM, bail out of iteration if loglik hits NaN
author | cannam |
---|---|
date | Fri, 18 Jan 2008 13:24:12 +0000 |
parents | d7116e3183f8 |
children | e5907ae6de17 |
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ /* QM DSP Library Centre for Digital Music, Queen Mary, University of London. This file copyright 2005-2006 Christian Landone. All rights reserved. */ #include "Framer.h" #include <math.h> ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Framer::Framer() { m_dataFrame = NULL; m_strideFrame = NULL; } Framer::~Framer() { if( m_dataFrame != NULL ) delete [] m_dataFrame; if( m_strideFrame != NULL ) delete [] m_strideFrame; } void Framer::configure( unsigned int frameLength, unsigned int hop ) { m_frameLength = frameLength; m_stepSize = hop; resetCounters(); if( m_dataFrame != NULL ) { delete [] m_dataFrame; m_dataFrame = NULL; } m_dataFrame = new double[ m_frameLength ]; if( m_strideFrame != NULL ) { delete [] m_strideFrame; m_strideFrame = NULL; } m_strideFrame = new double[ m_stepSize ]; } void Framer::getFrame(double *dst) { if( (m_ulSrcIndex + ( m_frameLength) ) < m_ulSampleLen ) { for( unsigned int u = 0; u < m_frameLength; u++) { dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; } m_ulSrcIndex -= ( m_frameLength - m_stepSize ); } else { unsigned int rem = (m_ulSampleLen - m_ulSrcIndex ); unsigned int zero = m_frameLength - rem; for( unsigned int u = 0; u < rem; u++ ) { dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ]; } for( unsigned int u = 0; u < zero; u++ ) { dst[ rem + u ] = 0; } m_ulSrcIndex -= (( rem - m_stepSize ) ); } m_framesRead++; } void Framer::resetCounters() { m_framesRead = 0; m_ulSrcIndex = 0; } unsigned int Framer::getMaxNoFrames() { return m_maxFrames; } void Framer::setSource(double *src, unsigned int length) { m_srcBuffer = src; m_ulSampleLen = length; m_maxFrames = (unsigned int)ceil( (double)m_ulSampleLen/(double)m_stepSize ) ; }