diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2025-07-21 22:39:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-21 22:39:37 +0200 |
commit | e9eb8305dcdbdbf5a9cbabf766c6e908e63a19b1 (patch) | |
tree | 0ec04711cfc260fd40554b78510975142e714e11 /src | |
parent | ba996d09e9c9cb6b296912da630726cb2ce284b5 (diff) | |
download | atracdenc-e9eb8305dcdbdbf5a9cbabf766c6e908e63a19b1.tar.gz |
Clean qmf code. (#51)
- Remove unused TQmf template pcm type parameter
- Do not copy buffer twice in the synthesis fb
Diffstat (limited to 'src')
-rw-r--r-- | src/atrac/atrac1_qmf.h | 19 | ||||
-rw-r--r-- | src/atrac/atrac3_qmf.h | 11 | ||||
-rw-r--r-- | src/atrac1denc.h | 4 | ||||
-rw-r--r-- | src/atrac3denc.h | 2 | ||||
-rw-r--r-- | src/qmf/qmf.h | 27 |
5 files changed, 29 insertions, 34 deletions
diff --git a/src/atrac/atrac1_qmf.h b/src/atrac/atrac1_qmf.h index 0276160..9f6d5ae 100644 --- a/src/atrac/atrac1_qmf.h +++ b/src/atrac/atrac1_qmf.h @@ -22,20 +22,19 @@ namespace NAtracDEnc { -template<class TIn> class Atrac1AnalysisFilterBank { const static int nInSamples = 512; const static int delayComp = 39; - TQmf<TIn, nInSamples> Qmf1; - TQmf<TIn, nInSamples / 2> Qmf2; + TQmf<nInSamples> Qmf1; + TQmf<nInSamples / 2> Qmf2; std::vector<float> MidLowTmp; std::vector<float> DelayBuf; public: - Atrac1AnalysisFilterBank() { + Atrac1AnalysisFilterBank() noexcept { MidLowTmp.resize(512); DelayBuf.resize(delayComp + 512); } - void Analysis(TIn* pcm, float* low, float* mid, float* hi) { + void Analysis(const float* pcm, float* low, float* mid, float* hi) noexcept { memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp); Qmf1.Analysis(pcm, &MidLowTmp[0], &DelayBuf[delayComp]); Qmf2.Analysis(&MidLowTmp[0], low, mid); @@ -43,20 +42,20 @@ public: } }; -template<class TOut> + class Atrac1SynthesisFilterBank { const static int nInSamples = 512; const static int delayComp = 39; - TQmf<TOut, nInSamples> Qmf1; - TQmf<TOut, nInSamples / 2> Qmf2; + TQmf<nInSamples> Qmf1; + TQmf<nInSamples / 2> Qmf2; std::vector<float> MidLowTmp; std::vector<float> DelayBuf; public: - Atrac1SynthesisFilterBank() { + Atrac1SynthesisFilterBank() noexcept { MidLowTmp.resize(512); DelayBuf.resize(delayComp + 512); } - void Synthesis(TOut* pcm, float* low, float* mid, float* hi) { + void Synthesis(float* pcm, const float* low, const float* mid, const float* hi) noexcept { memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp); memcpy(&DelayBuf[delayComp], hi, sizeof(float) * 256); Qmf2.Synthesis(&MidLowTmp[0], &low[0], &mid[0]); diff --git a/src/atrac/atrac3_qmf.h b/src/atrac/atrac3_qmf.h index 1ed137e..6c15846 100644 --- a/src/atrac/atrac3_qmf.h +++ b/src/atrac/atrac3_qmf.h @@ -22,20 +22,19 @@ namespace NAtracDEnc { -template<class TIn> class Atrac3AnalysisFilterBank { const static int nInSamples = 1024; - TQmf<TIn, nInSamples> Qmf1; - TQmf<TIn, nInSamples / 2> Qmf2; - TQmf<TIn, nInSamples / 2> Qmf3; + TQmf<nInSamples> Qmf1; + TQmf<nInSamples / 2> Qmf2; + TQmf<nInSamples / 2> Qmf3; std::vector<float> Buf1; std::vector<float> Buf2; public: - Atrac3AnalysisFilterBank() { + Atrac3AnalysisFilterBank() noexcept { Buf1.resize(nInSamples); Buf2.resize(nInSamples); } - void Analysis(TIn* pcm, float* subs[4]) { + void Analysis(const float* pcm, float* subs[4]) noexcept { Qmf1.Analysis(pcm, Buf1.data(), Buf2.data()); Qmf2.Analysis(Buf1.data(), subs[0], subs[1]); Qmf3.Analysis(Buf2.data(), subs[3], subs[2]); diff --git a/src/atrac1denc.h b/src/atrac1denc.h index c3b5f11..d709177 100644 --- a/src/atrac1denc.h +++ b/src/atrac1denc.h @@ -63,7 +63,7 @@ class TAtrac1Encoder : public IProcessor, public TAtrac1MDCT { std::array<std::array<float, 256 + 16>, 2> PcmBufMid; std::array<std::array<float, 512 + 16>, 2> PcmBufHi; - Atrac1AnalysisFilterBank<float> AnalysisFilterBank[2]; + Atrac1AnalysisFilterBank AnalysisFilterBank[2]; const std::vector<float> LoudnessCurve; std::vector<std::unique_ptr<NAtrac1::IAtrac1BitAlloc>> BitAllocs; @@ -117,7 +117,7 @@ class TAtrac1Decoder : public IProcessor, public TAtrac1MDCT { int32_t PcmValueMax = 1; int32_t PcmValueMin = -1; - Atrac1SynthesisFilterBank<float> SynthesisFilterBank[2]; + Atrac1SynthesisFilterBank SynthesisFilterBank[2]; public: TAtrac1Decoder(TCompressedInputPtr&& aea); TPCMEngine::TProcessLambda GetLambda() override; diff --git a/src/atrac3denc.h b/src/atrac3denc.h index 3f136d5..778efeb 100644 --- a/src/atrac3denc.h +++ b/src/atrac3denc.h @@ -89,7 +89,7 @@ class TAtrac3Encoder : public IProcessor, public TAtrac3MDCT { float PrevPeak[2][4] = {{0.0}}; //2 channel, 4 band - peak level (after windowing), used to check overflow during scalling - Atrac3AnalysisFilterBank<float> AnalysisFilterBank[2]; + Atrac3AnalysisFilterBank AnalysisFilterBank[2]; TScaler<TAtrac3Data> Scaler; std::vector<NAtrac3::TAtrac3BitStreamWriter::TSingleChannelElement> SingleChannelElements; diff --git a/src/qmf/qmf.h b/src/qmf/qmf.h index 81977f3..15b507c 100644 --- a/src/qmf/qmf.h +++ b/src/qmf/qmf.h @@ -21,15 +21,14 @@ #include "../config.h" -template<class TPCM, int nIn> +template<size_t nIn> class TQmf { static const float TapHalf[24]; float QmfWindow[48]; - TPCM PcmBuffer[nIn + 46]; + float PcmBuffer[nIn + 46]; float PcmBufferMerge[nIn + 46]; - float DelayBuff[46]; public: - TQmf() { + TQmf() noexcept { const int sz = sizeof(QmfWindow)/sizeof(QmfWindow[0]); for (size_t i = 0 ; i < sz/2; i++) { @@ -41,13 +40,12 @@ public: } } - void Analysis(TPCM* in, float* lower, float* upper) { + void Analysis(const float* in, float* lower, float* upper) noexcept { float temp; - for (size_t i = 0; i < 46; i++) - PcmBuffer[i] = PcmBuffer[nIn + i]; - for (size_t i = 0; i < nIn; i++) - PcmBuffer[46+i] = in[i]; + memcpy(&PcmBuffer[0], &PcmBuffer[nIn], 46 * sizeof(float)); + + memcpy(&PcmBuffer[46], in, nIn * sizeof(float)); for (size_t j = 0; j < nIn; j+=2) { lower[j/2] = upper[j/2] = 0.0; @@ -61,10 +59,9 @@ public: } } - void Synthesis(TPCM* out, float* lower, float* upper) { - memcpy(&PcmBufferMerge[0], &DelayBuff[0], 46*sizeof(float)); + void Synthesis(float* out, const float* lower, const float* upper) noexcept { float* newPart = &PcmBufferMerge[46]; - for (int i = 0; i < nIn; i+=4) { + for (size_t i = 0; i < nIn; i+=4) { newPart[i+0] = lower[i/2] + upper[i/2]; newPart[i+1] = lower[i/2] - upper[i/2]; newPart[i+2] = lower[i/2 + 1] + upper[i/2 + 1]; @@ -84,12 +81,12 @@ public: winP += 2; out += 2; } - memcpy(&DelayBuff[0], &PcmBufferMerge[nIn], 46*sizeof(float)); + memcpy(&PcmBufferMerge[0], &PcmBufferMerge[nIn], 46 * sizeof(float)); } }; -template<class TPCM, int nIn> -const float TQmf<TPCM, nIn>::TapHalf[24] = { +template<size_t nIn> +const float TQmf<nIn>::TapHalf[24] = { -0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269, 0.0002422519, -0.00085293897, -0.0005205574, 0.0020340169, 0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944, |