OpenWareLaboratory
DcBlockingFilter.h
Go to the documentation of this file.
1 #ifndef __DcBlockingFilter_h__
2 #define __DcBlockingFilter_h__
3 
4 #include "FloatArray.h"
5 #include "SignalProcessor.h"
6 
12 private:
13  float x1, y1;
14  float R;
15 public:
16  DcBlockingFilter(float R = 0.995): R(R), x1(0), y1(0) {}
17 
21  float getTimeConstant(){
22  return 1/(1-R); // approximate
23  }
27  void setTimeConstant(float tc){
28  R = (tc - 1) / tc;
29  }
30  void reset(){
31  x1 = y1 = 0;
32  }
33 
34  /* process a single sample and return the result */
35  float process(float x){
36  y1 = x - x1 + R*y1;
37  x1 = x;
38  return y1;
39  }
40 
41  void process(float* input, float* output, size_t size){
42  float x;
43  float y = y1;
44  while(size--){
45  x = *input++;
46  y = x - x1 + R*y;
47  x1 = x;
48  *output++ = y;
49  }
50  y1 = y;
51  }
52 
53  /* perform in-place processing */
54  void process(float* buf, int size){
55  process(buf, buf, size);
56  }
57 
58  void process(FloatArray in){
59  process(in, in, in.getSize());
60  }
61 
62  void process(FloatArray in, FloatArray out){
63  ASSERT(out.getSize() >= in.getSize(), "output array must be at least as long as input");
64  process(in, out, in.getSize());
65  }
66 
67  static DcBlockingFilter* create(float R=0.995){
68  return new DcBlockingFilter(R);
69  }
70 
71  static void destroy(DcBlockingFilter* obj){
72  delete obj;
73  }
74 };
75 
77 private:
78  DcBlockingFilter left, right;
79 public:
80  StereoDcBlockingFilter(float R = 0.995): left(R), right(R) {}
81 
85  float getTimeConstant(){
86  return left.getTimeConstant();
87  }
91  void setTimeConstant(float tc){
92  left.setTimeConstant(tc);
93  right.setTimeConstant(tc);
94  }
95 
96  void process(AudioBuffer& input, AudioBuffer& output){
99  }
100 
101  static StereoDcBlockingFilter* create(float R=0.995){
102  return new StereoDcBlockingFilter(R);
103  }
104 
105  static void destroy(StereoDcBlockingFilter* obj){
106  delete obj;
107  }
108 };
109 
110 #endif // __DcBlockingFilter_h__
@ RIGHT_CHANNEL
Definition: Patch.h:18
@ LEFT_CHANNEL
Definition: Patch.h:17
virtual FloatArray getSamples(int channel)=0
DC Blocking IIR filter, aka Leaky differentiator.
static void destroy(DcBlockingFilter *obj)
void process(float *input, float *output, size_t size)
float getTimeConstant()
Get adaptation time constant in samples.
DcBlockingFilter(float R=0.995)
void process(float *buf, int size)
void process(FloatArray in)
float process(float x)
static DcBlockingFilter * create(float R=0.995)
void process(FloatArray in, FloatArray out)
void setTimeConstant(float tc)
Set adaptation time constant in samples.
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
Base class for signal processors such as Filters.
size_t getSize() const
Definition: SimpleArray.h:31
static void destroy(StereoDcBlockingFilter *obj)
StereoDcBlockingFilter(float R=0.995)
void process(AudioBuffer &input, AudioBuffer &output)
void setTimeConstant(float tc)
Set adaptation time constant in samples.
static StereoDcBlockingFilter * create(float R=0.995)
float getTimeConstant()
Get adaptation time constant in samples.
#define ASSERT(cond, msg)
Definition: message.h:16