diff dsp/signalconditioning/Framer.cpp @ 225:49844bc8a895

* Queen Mary C++ DSP library
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 05 Apr 2006 17:35:59 +0000
parents
children e5907ae6de17
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsp/signalconditioning/Framer.cpp	Wed Apr 05 17:35:59 2006 +0000
@@ -0,0 +1,104 @@
+/* -*- 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 ) ;
+}