You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
hexefx_audiolib_F32/src/basic_allpass.h

98 lines
1.8 KiB

/**
* @file basic_allpass.h
* @author Piotr Zapart
* @brief basic allpass filter
* @version 1.0
* @date 2024-01-09
*
* @copyright Copyright (c) 2024
*
*/
#ifndef _FILTER_ALLPASS_H_
#define _FILTER_ALLPASS_H_
#include "Arduino.h"
template <int N>
class AudioFilterAllpass
{
public:
~AudioFilterAllpass()
{
if (bf) free(bf);
}
/**
* @brief Allocate the filter buffer in RAM
* set the pointer to the allpass coeff
*
* @param coeffPtr pointer to the allpas coeff variable
*/
bool init(float* coeffPtr)
{
bf = (float *)malloc(N*sizeof(float)); // allocate buffer
if (!bf) return false;
kPtr = coeffPtr;
reset();
return true;
}
/**
* @brief zero the allpass buffer
*
*/
void reset()
{
memset(bf, 0, N*sizeof(float));
idx = 0;
}
/**
* @brief process new sample
*
* @param in input sample
* @return float output sample
*/
float process(float in)
{
float out = bf[idx] + (*kPtr) * in;
bf[idx] = in - (*kPtr) * out;
if (++idx >= N) idx = 0;
return out;
}
/**
* @brief Set new coeff pointer
*
* @param coeffPtr
*/
void coeff(float* coeffPtr)
{
kPtr = coeffPtr;
}
/**
* @brief get the tap from the delay buffer
*
* @param offset delay time
* @return float
*/
inline float getTap(uint32_t offset, float frac=0.0f)
{
int32_t read_idx, read_idx_next;
read_idx = idx - offset;
if (read_idx < 0) read_idx += N;
if (frac == 0.0f) return bf[read_idx];
read_idx_next = read_idx - 1;
if (read_idx_next < 0) read_idx_next += N;
return (bf[read_idx]*(1.0f-frac) + bf[read_idx_next]*frac);
}
inline void write_toOffset(float newSample, uint32_t offset)
{
int32_t write_idx;
write_idx = idx - offset;
if (write_idx < 0) write_idx += N;
bf[write_idx] = newSample;
}
private:
float *kPtr;
float *bf;
uint32_t idx;
};
#endif // _FILTER_ALLPASS_H_