diff options
author | Chris Robinson <[email protected]> | 2023-10-03 22:36:01 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2023-10-03 23:19:21 -0700 |
commit | 23cc00ea16bdfbb06ae49cde0e05db6ec4a07100 (patch) | |
tree | d64871379d991d8fbc4f6845aa13e8098726514d | |
parent | 340a22be6befeb308745bea871396da94b873245 (diff) |
Clear the 0 and half-frequency bins for the phase shift filter
This doesn't change the filter response, but is more correct since a real
signal won't have an imaginary value on them (it can only have a magnitude with
a phase of 0 or pi).
-rw-r--r-- | common/phase_shifter.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/common/phase_shifter.h b/common/phase_shifter.h index 061e9176..6b0ad512 100644 --- a/common/phase_shifter.h +++ b/common/phase_shifter.h @@ -9,6 +9,7 @@ #include <array> #include <stddef.h> +#include <type_traits> #include "alcomplex.h" #include "alspan.h" @@ -54,13 +55,15 @@ struct PhaseShifterT { fftBuffer[half_size] = 1.0; forward_fft(al::span{fftBuffer.get(), fft_size}); - for(size_t i{0};i < half_size+1;++i) + fftBuffer[0] *= std::numeric_limits<double>::epsilon(); + for(size_t i{1};i < half_size;++i) fftBuffer[i] = complex_d{-fftBuffer[i].imag(), fftBuffer[i].real()}; + fftBuffer[half_size] *= std::numeric_limits<double>::epsilon(); for(size_t i{half_size+1};i < fft_size;++i) fftBuffer[i] = std::conj(fftBuffer[fft_size - i]); inverse_fft(al::span{fftBuffer.get(), fft_size}); - auto fftiter = fftBuffer.get() + half_size + (FilterSize/2 - 1); + auto fftiter = fftBuffer.get() + fft_size - 1; for(float &coeff : mCoeffs) { coeff = static_cast<float>(fftiter->real() / double{fft_size}); |