annotate dsp/signalconditioning/FiltFilt.cpp @ 193:ca658c7215a9

Faster filter implementation with explicit FIR support
author Chris Cannam
date Wed, 07 Oct 2015 10:36:09 +0100
parents 715f779d0b4f
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 }