summaryrefslogtreecommitdiff
path: root/libs/qm-dsp/dsp/signalconditioning/Framer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/qm-dsp/dsp/signalconditioning/Framer.cpp')
-rw-r--r--libs/qm-dsp/dsp/signalconditioning/Framer.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/libs/qm-dsp/dsp/signalconditioning/Framer.cpp b/libs/qm-dsp/dsp/signalconditioning/Framer.cpp
new file mode 100644
index 0000000000..e352278ada
--- /dev/null
+++ b/libs/qm-dsp/dsp/signalconditioning/Framer.cpp
@@ -0,0 +1,109 @@
+/* -*- 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 2005-2006 Christian Landone.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#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 ) ;
+}