Browse Source

ensure coeffs ptr is writable before using

dds
John Robinson 3 years ago
parent
commit
9faffc2d0d
No known key found for this signature in database
1 changed files with 11 additions and 8 deletions
  1. +11
    -8
      biquad.h

+ 11
- 8
biquad.h View File

@@ -31,6 +31,7 @@

#include "Arduino.h"
#include <arm_math.h>
#include <type_traits>

enum class BiquadType {
LOW_PASS, HIGH_PASS, BAND_PASS, NOTCH, ALL_PASS, PEAKING, LOW_SHELF, HIGH_SHELF
@@ -39,7 +40,7 @@ enum class BiquadType {
template <typename T>
void getCoefficients(T* coeffs, BiquadType type, double dbGain, double freq, double srate, double bandwidthOrQOrS, bool isBandwidthOrS=false){
const double A =(type == BiquadType::PEAKING || type == BiquadType::LOW_SHELF || type == BiquadType::HIGH_SHELF) ? pow(10., dbGain / 40.) : pow(10, dbGain / 20);
const double omega = 2 * M_PI * freq / srate;
const double sn = sin(omega);
const double cs = cos(omega);
@@ -124,11 +125,13 @@ void getCoefficients(T* coeffs, BiquadType type, double dbGain, double freq, dou
break;
}

*coeffs++=(T)(b0 * a0Inv);
*coeffs++=(T)(b1 * a0Inv);
*coeffs++=(T)(b2 * a0Inv);
*coeffs++=(T)(-a1 * a0Inv);
*coeffs=(T)(-a2 * a0Inv);
using writable_type = typename std::remove_const<T>::type;
writable_type* coeffs_ptr = const_cast<writable_type*>(coeffs);
*coeffs_ptr++ = (T)(b0 * a0Inv);
*coeffs_ptr++ = (T)(b1 * a0Inv);
*coeffs_ptr++ = (T)(b2 * a0Inv);
*coeffs_ptr++ = (T)(-a1 * a0Inv);
*coeffs_ptr = (T)(-a2 * a0Inv);
}

template <typename T, typename BIQUAD, typename BTYPE>
@@ -189,7 +192,7 @@ void getCoefficients(T* coeffs, BiquadType type, double dbGain, double freq, dou
*pDst++=(T)yn;
}
}
}
}

template <typename B>
void preload(const B* S, double val=0.){
@@ -201,4 +204,4 @@ void getCoefficients(T* coeffs, BiquadType type, double dbGain, double freq, dou
*(S->pState) = (*(S->pCoeffs+1) + *(S->pCoeffs+3)) * val + *(S->pState+1);
}

#endif
#endif

Loading…
Cancel
Save