annotate dsp/signalconditioning/FiltFilt.cpp @ 209:ccd2019190bf msvc

Some MSVC fixes, including (temporarily, probably) renaming the FFT source file to avoid getting it mixed up with the Vamp SDK one in our object dir
author Chris Cannam
date Thu, 01 Feb 2018 16:34:08 +0000
parents ca658c7215a9
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 "FiltFilt.h"
cannam@0 17
cannam@0 18 //////////////////////////////////////////////////////////////////////
cannam@0 19 // Construction/Destruction
cannam@0 20 //////////////////////////////////////////////////////////////////////
cannam@0 21
Chris@193 22 FiltFilt::FiltFilt(Filter::Parameters parameters) :
Chris@193 23 m_filter(parameters)
cannam@0 24 {
Chris@193 25 m_ord = m_filter.getOrder();
cannam@0 26 }
cannam@0 27
cannam@0 28 FiltFilt::~FiltFilt()
cannam@0 29 {
cannam@0 30 }
cannam@0 31
cannam@0 32 void FiltFilt::process(double *src, double *dst, unsigned int length)
cannam@0 33 {
cannam@0 34 unsigned int i;
cannam@0 35
cannam@58 36 if (length == 0) return;
cannam@58 37
cannam@0 38 unsigned int nFilt = m_ord + 1;
cannam@0 39 unsigned int nFact = 3 * ( nFilt - 1);
cannam@0 40 unsigned int nExt = length + 2 * nFact;
cannam@0 41
Chris@193 42 double *filtScratchIn = new double[ nExt ];
Chris@193 43 double *filtScratchOut = new double[ nExt ];
cannam@0 44
cannam@0 45 for( i = 0; i< nExt; i++ )
cannam@0 46 {
Chris@193 47 filtScratchIn[ i ] = 0.0;
Chris@193 48 filtScratchOut[ i ] = 0.0;
cannam@0 49 }
cannam@0 50
cannam@0 51 // Edge transients reflection
cannam@0 52 double sample0 = 2 * src[ 0 ];
cannam@0 53 double sampleN = 2 * src[ length - 1 ];
cannam@0 54
cannam@0 55 unsigned int index = 0;
cannam@0 56 for( i = nFact; i > 0; i-- )
cannam@0 57 {
Chris@193 58 filtScratchIn[ index++ ] = sample0 - src[ i ];
cannam@0 59 }
cannam@0 60 index = 0;
cannam@0 61 for( i = 0; i < nFact; i++ )
cannam@0 62 {
Chris@193 63 filtScratchIn[ (nExt - nFact) + index++ ] = sampleN - src[ (length - 2) - i ];
cannam@0 64 }
cannam@0 65
cannam@0 66 index = 0;
cannam@0 67 for( i = 0; i < length; i++ )
cannam@0 68 {
Chris@193 69 filtScratchIn[ i + nFact ] = src[ i ];
cannam@0 70 }
cannam@0 71
cannam@0 72 ////////////////////////////////
cannam@0 73 // Do 0Ph filtering
Chris@193 74 m_filter.process( filtScratchIn, filtScratchOut, nExt);
cannam@0 75
cannam@0 76 // reverse the series for FILTFILT
cannam@0 77 for ( i = 0; i < nExt; i++)
cannam@0 78 {
Chris@193 79 filtScratchIn[ i ] = filtScratchOut[ nExt - i - 1];
cannam@0 80 }
cannam@0 81
cannam@0 82 // do FILTER again
Chris@193 83 m_filter.process( filtScratchIn, filtScratchOut, nExt);
cannam@0 84
cannam@0 85 // reverse the series back
cannam@0 86 for ( i = 0; i < nExt; i++)
cannam@0 87 {
Chris@193 88 filtScratchIn[ i ] = filtScratchOut[ nExt - i - 1 ];
cannam@0 89 }
cannam@0 90 for ( i = 0;i < nExt; i++)
cannam@0 91 {
Chris@193 92 filtScratchOut[ i ] = filtScratchIn[ i ];
cannam@0 93 }
cannam@0 94
cannam@0 95 index = 0;
cannam@0 96 for( i = 0; i < length; i++ )
cannam@0 97 {
Chris@193 98 dst[ index++ ] = filtScratchOut[ i + nFact ];
cannam@0 99 }
cannam@0 100
Chris@193 101 delete [] filtScratchIn;
Chris@193 102 delete [] filtScratchOut;
cannam@0 103
cannam@0 104 }
cannam@0 105
cannam@0 106 void FiltFilt::reset()
cannam@0 107 {
cannam@0 108
cannam@0 109 }