Browse Source

Improve AudioInputAnalog DC blocking filter

dds
PaulStoffregen 10 years ago
parent
commit
9901efdd73
1 changed files with 5 additions and 2 deletions
  1. +5
    -2
      input_adc.cpp

+ 5
- 2
input_adc.cpp View File

@@ -26,6 +26,7 @@

#include "input_adc.h"
#include "utility/pdb.h"
#include "utility/dspinst.h"

DMAMEM static uint16_t analog_rx_buffer[AUDIO_BLOCK_SAMPLES];
audio_block_t * AudioInputAnalog::block_left = NULL;
@@ -142,6 +143,7 @@ void AudioInputAnalog::update(void)
{
audio_block_t *new_left=NULL, *out_left=NULL;
unsigned int dc, offset;
int32_t tmp;
int16_t s, *p, *end;

//Serial.println("update");
@@ -191,9 +193,10 @@ void AudioInputAnalog::update(void)
p = out_left->data;
end = p + AUDIO_BLOCK_SAMPLES;
do {
s = (uint16_t)(*p) - dc; // TODO: should be saturating subtract
tmp = (uint16_t)(*p) - (int32_t)dc;
s = signed_saturate_rshift(tmp, 16, 0);
*p++ = s;
dc += s >> 13; // approx 5.38 Hz high pass filter
dc += s / 12000; // slow response, remove DC component
} while (p < end);
dc_average = dc;


Loading…
Cancel
Save