aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2023-10-03 22:36:01 -0700
committerChris Robinson <[email protected]>2023-10-03 23:19:21 -0700
commit23cc00ea16bdfbb06ae49cde0e05db6ec4a07100 (patch)
treed64871379d991d8fbc4f6845aa13e8098726514d
parent340a22be6befeb308745bea871396da94b873245 (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.h7
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});