parent
df7988129c
commit
318d5a5e8e
@ -0,0 +1,92 @@ |
||||
/*
|
||||
* AudioFilterFIR_F32 |
||||
*
|
||||
* Created: Chip Audette (OpenAudio) Feb 2017 |
||||
* - Building from AudioFilterFIR from Teensy Audio Library (AudioFilterFIR credited to Pete (El Supremo)) |
||||
*
|
||||
*/ |
||||
|
||||
#ifndef _filter_fir_f32 |
||||
#define _filter_fir_f32 |
||||
|
||||
#include "Arduino.h" |
||||
#include "AudioStream_F32.h" |
||||
#include "arm_math.h" |
||||
|
||||
// Indicates that the code should just pass through the audio
|
||||
// without any filtering (as opposed to doing nothing at all)
|
||||
#define FIR_F32_PASSTHRU ((const float32_t *) 1) |
||||
|
||||
#define FIR_MAX_COEFFS 200 |
||||
|
||||
class AudioFilterFIR_F32 : public AudioStream_F32 |
||||
{ |
||||
public: |
||||
AudioFilterFIR_F32(void): AudioStream_F32(1,inputQueueArray), coeff_p(FIR_F32_PASSTHRU) { |
||||
} |
||||
void begin(const float32_t *cp, int n_coeffs) { |
||||
coeff_p = cp; |
||||
// Initialize FIR instance (ARM DSP Math Library)
|
||||
if (coeff_p && (coeff_p != FIR_F32_PASSTHRU) && n_coeffs <= FIR_MAX_COEFFS) { |
||||
arm_fir_init_f32(&fir_inst, n_coeffs, (float32_t *)coeff_p, &StateF32[0], AUDIO_BLOCK_SAMPLES); |
||||
//if (arm_fir_init_f32(&fir_inst, n_coeffs, (float32_t *)coeff_p, &StateF32[0], AUDIO_BLOCK_SAMPLES) != ARM_MATH_SUCCESS) {
|
||||
// n_coeffs must be an even number, 4 or larger
|
||||
//coeff_p = NULL;
|
||||
//}
|
||||
} |
||||
} |
||||
void end(void) { |
||||
coeff_p = NULL; |
||||
} |
||||
virtual void update(void); |
||||
|
||||
void setBlockDC(void) { |
||||
//helper function that sets this up for a first-order HP filter at 20Hz
|
||||
|
||||
} |
||||
private: |
||||
audio_block_f32_t *inputQueueArray[1]; |
||||
|
||||
// pointer to current coefficients or NULL or FIR_PASSTHRU
|
||||
const float32_t *coeff_p; |
||||
|
||||
// ARM DSP Math library filter instance
|
||||
arm_fir_instance_f32 fir_inst; |
||||
float32_t StateF32[AUDIO_BLOCK_SAMPLES + FIR_MAX_COEFFS]; |
||||
}; |
||||
|
||||
|
||||
void AudioFilterFIR_F32::update(void) |
||||
{ |
||||
audio_block_f32_t *block, *b_new; |
||||
|
||||
block = AudioStream_F32::receiveReadOnly_f32(); |
||||
if (!block) return; |
||||
|
||||
// If there's no coefficient table, give up.
|
||||
if (coeff_p == NULL) { |
||||
AudioStream_F32::release(block); |
||||
return; |
||||
} |
||||
|
||||
// do passthru
|
||||
if (coeff_p == FIR_F32_PASSTHRU) { |
||||
// Just passthrough
|
||||
AudioStream_F32::transmit(block); |
||||
AudioStream_F32::release(block); |
||||
return; |
||||
} |
||||
|
||||
// get a block for the FIR output
|
||||
b_new = AudioStream_F32::allocate_f32(); |
||||
if (b_new) { |
||||
arm_fir_f32(&fir_inst, (float32_t *)block->data, (float32_t *)b_new->data, block->length); |
||||
AudioStream_F32::transmit(b_new); // send the FIR output
|
||||
AudioStream_F32::release(b_new); |
||||
} |
||||
AudioStream_F32::release(block); |
||||
} |
||||
|
||||
#endif |
||||
|
||||
|
Loading…
Reference in new issue