annotate dsp/rateconversion/Decimator.cpp @ 0:d7116e3183f8

* Queen Mary C++ DSP library
author cannam
date Wed, 05 Apr 2006 17:35:59 +0000
parents
children f7edcd9138bd
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.
cannam@0 7 This file copyright 2005-2006 Christian Landone.
cannam@0 8 All rights reserved.
cannam@0 9 */
cannam@0 10
cannam@0 11 #include "Decimator.h"
cannam@0 12
cannam@0 13 //////////////////////////////////////////////////////////////////////
cannam@0 14 // Construction/Destruction
cannam@0 15 //////////////////////////////////////////////////////////////////////
cannam@0 16
cannam@0 17 Decimator::Decimator( unsigned int inLength, unsigned int decFactor )
cannam@0 18 {
cannam@0 19
cannam@0 20 m_inputLength = 0;
cannam@0 21 m_outputLength = 0;
cannam@0 22 m_decFactor = 1;
cannam@0 23
cannam@0 24 initialise( inLength, decFactor );
cannam@0 25 }
cannam@0 26
cannam@0 27 Decimator::~Decimator()
cannam@0 28 {
cannam@0 29 deInitialise();
cannam@0 30 }
cannam@0 31
cannam@0 32 void Decimator::initialise( unsigned int inLength, unsigned int decFactor)
cannam@0 33 {
cannam@0 34 m_inputLength = inLength;
cannam@0 35 m_decFactor = decFactor;
cannam@0 36 m_outputLength = m_inputLength / m_decFactor;
cannam@0 37
cannam@0 38 decBuffer = new double[ m_inputLength ];
cannam@0 39
cannam@0 40 if( m_decFactor == 4 )
cannam@0 41 {
cannam@0 42 //////////////////////////////////////////////////
cannam@0 43 b[ 0 ] = 0.10133306904918619;
cannam@0 44 b[ 1 ] = -0.2447523353702363;
cannam@0 45 b[ 2 ] = 0.33622528590120965;
cannam@0 46 b[ 3 ] = -0.13936581560633518;
cannam@0 47 b[ 4 ] = -0.13936581560633382;
cannam@0 48 b[ 5 ] = 0.3362252859012087;
cannam@0 49 b[ 6 ] = -0.2447523353702358;
cannam@0 50 b[ 7 ] = 0.10133306904918594;
cannam@0 51
cannam@0 52 a[ 0 ] = 1;
cannam@0 53 a[ 1 ] = -3.9035590278139427;
cannam@0 54 a[ 2 ] = 7.5299379980621133;
cannam@0 55 a[ 3 ] = -8.6890803793177511;
cannam@0 56 a[ 4 ] = 6.4578667096099176;
cannam@0 57 a[ 5 ] = -3.0242979431223631;
cannam@0 58 a[ 6 ] = 0.83043385136748382;
cannam@0 59 a[ 7 ] = -0.094420800837809335;
cannam@0 60 //////////////////////////////////////////////////
cannam@0 61 }
cannam@0 62 else if( m_decFactor == 2 )
cannam@0 63 {
cannam@0 64 //////////////////////////////////////////////////
cannam@0 65 b[ 0 ] = 0.20898944260075727;
cannam@0 66 b[ 1 ] = 0.40011234879814367;
cannam@0 67 b[ 2 ] = 0.819741973072733;
cannam@0 68 b[ 3 ] = 1.0087419911682323;
cannam@0 69 b[ 4 ] = 1.0087419911682325;
cannam@0 70 b[ 5 ] = 0.81974197307273156;
cannam@0 71 b[ 6 ] = 0.40011234879814295;
cannam@0 72 b[ 7 ] = 0.20898944260075661;
cannam@0 73
cannam@0 74 a[ 0 ] = 1;
cannam@0 75 a[ 1 ] = 0.0077331184208358217;
cannam@0 76 a[ 2 ] = 1.9853971155964376;
cannam@0 77 a[ 3 ] = 0.19296739275341004;
cannam@0 78 a[ 4 ] = 1.2330748872852182;
cannam@0 79 a[ 5 ] = 0.18705341389316466;
cannam@0 80 a[ 6 ] = 0.23659265908013868;
cannam@0 81 a[ 7 ] = 0.032352924250533946;
cannam@0 82 }
cannam@0 83 else
cannam@0 84 {
cannam@0 85 //////////////////////////////////////////////////
cannam@0 86 b[ 0 ] = 1;
cannam@0 87 b[ 1 ] = 0;
cannam@0 88 b[ 2 ] = 0;
cannam@0 89 b[ 3 ] = 0;
cannam@0 90 b[ 4 ] = 0;
cannam@0 91 b[ 5 ] = 0;
cannam@0 92 b[ 6 ] = 0;
cannam@0 93 b[ 7 ] = 0;
cannam@0 94
cannam@0 95 a[ 0 ] = 1;
cannam@0 96 a[ 1 ] = 0;
cannam@0 97 a[ 2 ] = 0;
cannam@0 98 a[ 3 ] = 0;
cannam@0 99 a[ 4 ] = 0;
cannam@0 100 a[ 5 ] = 0;
cannam@0 101 a[ 6 ] = 0;
cannam@0 102 a[ 7 ] = 0;
cannam@0 103 }
cannam@0 104
cannam@0 105 resetFilter();
cannam@0 106 }
cannam@0 107
cannam@0 108 void Decimator::deInitialise()
cannam@0 109 {
cannam@0 110 delete [] decBuffer;
cannam@0 111 }
cannam@0 112
cannam@0 113 void Decimator::resetFilter()
cannam@0 114 {
cannam@0 115 Input = Output = 0;
cannam@0 116
cannam@0 117 o1=o2=o3=o4=o5=o6=o7=0;
cannam@0 118 }
cannam@0 119
cannam@0 120 void Decimator::doAntiAlias(double *src, double *dst, unsigned int length)
cannam@0 121 {
cannam@0 122
cannam@0 123 for( unsigned int i = 0; i < length; i++ )
cannam@0 124 {
cannam@0 125 Input = (double)src[ i ];
cannam@0 126
cannam@0 127 Output = Input * b[ 0 ] + o1;
cannam@0 128
cannam@0 129 o1 = Input * b[ 1 ] - Output * a[ 1 ] + o2;
cannam@0 130 o2 = Input * b[ 2 ] - Output * a[ 2 ] + o3;
cannam@0 131 o3 = Input * b[ 3 ] - Output * a[ 3 ] + o4;
cannam@0 132 o4 = Input * b[ 4 ] - Output * a[ 4 ] + o5;
cannam@0 133 o5 = Input * b[ 5 ] - Output * a[ 5 ] + o6;
cannam@0 134 o6 = Input * b[ 6 ] - Output * a[ 6 ] + o7;
cannam@0 135 o7 = Input * b[ 7 ] - Output * a[ 7 ] ;
cannam@0 136
cannam@0 137 dst[ i ] = Output;
cannam@0 138 }
cannam@0 139
cannam@0 140 }
cannam@0 141
cannam@0 142 void Decimator::process(double *src, double *dst)
cannam@0 143 {
cannam@0 144 if( m_decFactor != 1 )
cannam@0 145 {
cannam@0 146 doAntiAlias( src, decBuffer, m_inputLength );
cannam@0 147 }
cannam@0 148 unsigned idx = 0;
cannam@0 149
cannam@0 150 for( unsigned int i = 0; i < m_outputLength; i++ )
cannam@0 151 {
cannam@0 152 dst[ idx++ ] = decBuffer[ m_decFactor * i ];
cannam@0 153 }
cannam@0 154 }