annotate dsp/signalconditioning/Framer.cpp @ 129:6ec45e85ed81 kissfft

Drop in kissfft to replace the "old" fft, and add tests for newly-supported sizes
author Chris Cannam
date Tue, 15 Oct 2013 11:38:18 +0100
parents e5907ae6de17
children fdaa63607c15
rev   line source
cannam@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@0 2
cannam@0 3 /*
cannam@0 4 QM DSP Library
cannam@0 5
cannam@0 6 Centre for Digital Music, Queen Mary, University of London.
Chris@84 7 This file 2005-2006 Christian Landone.
Chris@84 8
Chris@84 9 This program is free software; you can redistribute it and/or
Chris@84 10 modify it under the terms of the GNU General Public License as
Chris@84 11 published by the Free Software Foundation; either version 2 of the
Chris@84 12 License, or (at your option) any later version. See the file
Chris@84 13 COPYING included with this distribution for more information.
cannam@0 14 */
cannam@0 15
cannam@0 16 #include "Framer.h"
cannam@0 17 #include <math.h>
cannam@0 18
cannam@0 19 //////////////////////////////////////////////////////////////////////
cannam@0 20 // Construction/Destruction
cannam@0 21 //////////////////////////////////////////////////////////////////////
cannam@0 22
cannam@0 23 Framer::Framer()
cannam@0 24 {
cannam@0 25 m_dataFrame = NULL;
cannam@0 26 m_strideFrame = NULL;
cannam@0 27 }
cannam@0 28
cannam@0 29 Framer::~Framer()
cannam@0 30 {
cannam@0 31 if( m_dataFrame != NULL )
cannam@0 32 delete [] m_dataFrame;
cannam@0 33
cannam@0 34 if( m_strideFrame != NULL )
cannam@0 35 delete [] m_strideFrame;
cannam@0 36 }
cannam@0 37
cannam@0 38 void Framer::configure( unsigned int frameLength, unsigned int hop )
cannam@0 39 {
cannam@0 40 m_frameLength = frameLength;
cannam@0 41 m_stepSize = hop;
cannam@0 42
cannam@0 43 resetCounters();
cannam@0 44
cannam@0 45 if( m_dataFrame != NULL )
cannam@0 46 {
cannam@0 47 delete [] m_dataFrame;
cannam@0 48 m_dataFrame = NULL;
cannam@0 49 }
cannam@0 50 m_dataFrame = new double[ m_frameLength ];
cannam@0 51
cannam@0 52 if( m_strideFrame != NULL )
cannam@0 53 {
cannam@0 54 delete [] m_strideFrame;
cannam@0 55 m_strideFrame = NULL;
cannam@0 56 }
cannam@0 57 m_strideFrame = new double[ m_stepSize ];
cannam@0 58 }
cannam@0 59
cannam@0 60 void Framer::getFrame(double *dst)
cannam@0 61 {
cannam@0 62
cannam@0 63 if( (m_ulSrcIndex + ( m_frameLength) ) < m_ulSampleLen )
cannam@0 64 {
cannam@0 65 for( unsigned int u = 0; u < m_frameLength; u++)
cannam@0 66 {
cannam@0 67 dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ];
cannam@0 68 }
cannam@0 69 m_ulSrcIndex -= ( m_frameLength - m_stepSize );
cannam@0 70 }
cannam@0 71 else
cannam@0 72 {
cannam@0 73 unsigned int rem = (m_ulSampleLen - m_ulSrcIndex );
cannam@0 74 unsigned int zero = m_frameLength - rem;
cannam@0 75
cannam@0 76 for( unsigned int u = 0; u < rem; u++ )
cannam@0 77 {
cannam@0 78 dst[ u ] = m_srcBuffer[ m_ulSrcIndex++ ];
cannam@0 79 }
cannam@0 80
cannam@0 81 for( unsigned int u = 0; u < zero; u++ )
cannam@0 82 {
cannam@0 83 dst[ rem + u ] = 0;
cannam@0 84 }
cannam@0 85
cannam@0 86 m_ulSrcIndex -= (( rem - m_stepSize ) );
cannam@0 87 }
cannam@0 88
cannam@0 89 m_framesRead++;
cannam@0 90 }
cannam@0 91
cannam@0 92 void Framer::resetCounters()
cannam@0 93 {
cannam@0 94 m_framesRead = 0;
cannam@0 95 m_ulSrcIndex = 0;
cannam@0 96 }
cannam@0 97
cannam@0 98 unsigned int Framer::getMaxNoFrames()
cannam@0 99 {
cannam@0 100 return m_maxFrames;
cannam@0 101 }
cannam@0 102
cannam@0 103 void Framer::setSource(double *src, unsigned int length)
cannam@0 104 {
cannam@0 105 m_srcBuffer = src;
cannam@0 106 m_ulSampleLen = length;
cannam@0 107
cannam@0 108 m_maxFrames = (unsigned int)ceil( (double)m_ulSampleLen/(double)m_stepSize ) ;
cannam@0 109 }