Fix applying the UHJ phase-shift filter

This commit is contained in:
Chris Robinson
2020-05-11 17:42:08 -07:00
parent 2574b98f8a
commit 3ce8a9914c
2 changed files with 8 additions and 9 deletions
+2 -3
View File
@@ -70,7 +70,7 @@ std::array<float,Uhj2Encoder::sFilterSize> GenerateFilter()
}
return ret;
}
const auto PShiftCoeffs = GenerateFilter();
alignas(16) const auto PShiftCoeffs = GenerateFilter();
void allpass_process(al::span<float> dst, const float *RESTRICT src)
@@ -78,9 +78,8 @@ void allpass_process(al::span<float> dst, const float *RESTRICT src)
for(float &output : dst)
{
#ifdef HAVE_SSE_INTRINSICS
constexpr size_t todo{PShiftCoeffs.size()>>2};
__m128 r4{_mm_setzero_ps()};
for(size_t i{0};i < todo;i+=4)
for(size_t i{0};i < PShiftCoeffs.size();i+=4)
{
const __m128 coeffs{_mm_load_ps(&PShiftCoeffs[i])};
/* NOTE: This could alternatively be done with two unaligned loads
+6 -6
View File
@@ -29,16 +29,16 @@ struct Uhj2Encoder {
constexpr static size_t sFilterSize{128};
/* Delays for the unfiltered signal. */
alignas(16) std::array<float,sFilterSize> mMidDelay;
alignas(16) std::array<float,sFilterSize> mSideDelay;
alignas(16) std::array<float,sFilterSize> mMidDelay{};
alignas(16) std::array<float,sFilterSize> mSideDelay{};
/* History for the FIR filter. */
alignas(16) std::array<float,sFilterSize*2 - 1> mSideHistory;
alignas(16) std::array<float,sFilterSize*2 - 1> mSideHistory{};
alignas(16) std::array<float,BUFFERSIZE + sFilterSize*2> mTemp;
alignas(16) std::array<float,BUFFERSIZE + sFilterSize*2> mTemp{};
alignas(16) std::array<float,BUFFERSIZE> mMid;
alignas(16) std::array<float,BUFFERSIZE> mSide;
alignas(16) std::array<float,BUFFERSIZE> mMid{};
alignas(16) std::array<float,BUFFERSIZE> mSide{};
/**
* Encodes a 2-channel UHJ (stereo-compatible) signal from a B-Format input