1 |
//////////////////////////////////////////////////////////////////////////////// |
2 |
/// |
3 |
/// General FIR digital filter routines with MMX optimization. |
4 |
/// |
5 |
/// Note : MMX optimized functions reside in a separate, platform-specific file, |
6 |
/// e.g. 'mmx_win.cpp' or 'mmx_gcc.cpp' |
7 |
/// |
8 |
/// Author : Copyright (c) Olli Parviainen |
9 |
/// Author e-mail : oparviai 'at' iki.fi |
10 |
/// SoundTouch WWW: http://www.surina.net/soundtouch |
11 |
/// |
12 |
//////////////////////////////////////////////////////////////////////////////// |
13 |
// |
14 |
// Last changed : $Date: 2009-02-21 18:00:14 +0200 (Sat, 21 Feb 2009) $ |
15 |
// File revision : $Revision: 4 $ |
16 |
// |
17 |
// $Id: FIRFilter.h 63 2009-02-21 16:00:14Z oparviai $ |
18 |
// |
19 |
//////////////////////////////////////////////////////////////////////////////// |
20 |
// |
21 |
// License : |
22 |
// |
23 |
// SoundTouch audio processing library |
24 |
// Copyright (c) Olli Parviainen |
25 |
// |
26 |
// This library is free software; you can redistribute it and/or |
27 |
// modify it under the terms of the GNU Lesser General Public |
28 |
// License as published by the Free Software Foundation; either |
29 |
// version 2.1 of the License, or (at your option) any later version. |
30 |
// |
31 |
// This library is distributed in the hope that it will be useful, |
32 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
33 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
34 |
// Lesser General Public License for more details. |
35 |
// |
36 |
// You should have received a copy of the GNU Lesser General Public |
37 |
// License along with this library; if not, write to the Free Software |
38 |
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
39 |
// |
40 |
//////////////////////////////////////////////////////////////////////////////// |
41 |
|
42 |
#ifndef FIRFilter_H |
43 |
#define FIRFilter_H |
44 |
|
45 |
#include <stddef.h> |
46 |
#include "STTypes.h" |
47 |
|
48 |
namespace soundtouch |
49 |
{ |
50 |
|
51 |
class FIRFilter |
52 |
{ |
53 |
protected: |
54 |
// Number of FIR filter taps |
55 |
uint length; |
56 |
// Number of FIR filter taps divided by 8 |
57 |
uint lengthDiv8; |
58 |
|
59 |
// Result divider factor in 2^k format |
60 |
uint resultDivFactor; |
61 |
|
62 |
// Result divider value. |
63 |
SAMPLETYPE resultDivider; |
64 |
|
65 |
// Memory for filter coefficients |
66 |
SAMPLETYPE *filterCoeffs; |
67 |
|
68 |
virtual uint evaluateFilterStereo(SAMPLETYPE *dest, |
69 |
const SAMPLETYPE *src, |
70 |
uint numSamples) const; |
71 |
virtual uint evaluateFilterMono(SAMPLETYPE *dest, |
72 |
const SAMPLETYPE *src, |
73 |
uint numSamples) const; |
74 |
|
75 |
public: |
76 |
FIRFilter(); |
77 |
virtual ~FIRFilter(); |
78 |
|
79 |
/// Operator 'new' is overloaded so that it automatically creates a suitable instance |
80 |
/// depending on if we've a MMX-capable CPU available or not. |
81 |
static void * operator new(size_t s); |
82 |
|
83 |
static FIRFilter *newInstance(); |
84 |
|
85 |
/// Applies the filter to the given sequence of samples. |
86 |
/// Note : The amount of outputted samples is by value of 'filter_length' |
87 |
/// smaller than the amount of input samples. |
88 |
/// |
89 |
/// \return Number of samples copied to 'dest'. |
90 |
uint evaluate(SAMPLETYPE *dest, |
91 |
const SAMPLETYPE *src, |
92 |
uint numSamples, |
93 |
uint numChannels) const; |
94 |
|
95 |
uint getLength() const; |
96 |
|
97 |
virtual void setCoefficients(const SAMPLETYPE *coeffs, |
98 |
uint newLength, |
99 |
uint uResultDivFactor); |
100 |
}; |
101 |
|
102 |
|
103 |
// Optional subclasses that implement CPU-specific optimizations: |
104 |
|
105 |
#ifdef ALLOW_MMX |
106 |
|
107 |
/// Class that implements MMX optimized functions exclusive for 16bit integer samples type. |
108 |
class FIRFilterMMX : public FIRFilter |
109 |
{ |
110 |
protected: |
111 |
short *filterCoeffsUnalign; |
112 |
short *filterCoeffsAlign; |
113 |
|
114 |
virtual uint evaluateFilterStereo(short *dest, const short *src, uint numSamples) const; |
115 |
public: |
116 |
FIRFilterMMX(); |
117 |
~FIRFilterMMX(); |
118 |
|
119 |
virtual void setCoefficients(const short *coeffs, uint newLength, uint uResultDivFactor); |
120 |
}; |
121 |
|
122 |
#endif // ALLOW_MMX |
123 |
|
124 |
|
125 |
#ifdef ALLOW_3DNOW |
126 |
|
127 |
/// Class that implements 3DNow! optimized functions exclusive for floating point samples type. |
128 |
class FIRFilter3DNow : public FIRFilter |
129 |
{ |
130 |
protected: |
131 |
float *filterCoeffsUnalign; |
132 |
float *filterCoeffsAlign; |
133 |
|
134 |
virtual uint evaluateFilterStereo(float *dest, const float *src, uint numSamples) const; |
135 |
public: |
136 |
FIRFilter3DNow(); |
137 |
~FIRFilter3DNow(); |
138 |
virtual void setCoefficients(const float *coeffs, uint newLength, uint uResultDivFactor); |
139 |
}; |
140 |
|
141 |
#endif // ALLOW_3DNOW |
142 |
|
143 |
|
144 |
#ifdef ALLOW_SSE |
145 |
/// Class that implements SSE optimized functions exclusive for floating point samples type. |
146 |
class FIRFilterSSE : public FIRFilter |
147 |
{ |
148 |
protected: |
149 |
float *filterCoeffsUnalign; |
150 |
float *filterCoeffsAlign; |
151 |
|
152 |
virtual uint evaluateFilterStereo(float *dest, const float *src, uint numSamples) const; |
153 |
public: |
154 |
FIRFilterSSE(); |
155 |
~FIRFilterSSE(); |
156 |
|
157 |
virtual void setCoefficients(const float *coeffs, uint newLength, uint uResultDivFactor); |
158 |
}; |
159 |
|
160 |
#endif // ALLOW_SSE |
161 |
|
162 |
} |
163 |
|
164 |
#endif // FIRFilter_H |