Skip to content

Commit e9eb830

Browse files
authored
Clean qmf code. (#51)
- Remove unused TQmf template pcm type parameter - Do not copy buffer twice in the synthesis fb
1 parent ba996d0 commit e9eb830

5 files changed

Lines changed: 29 additions & 34 deletions

File tree

src/atrac/atrac1_qmf.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,41 +22,40 @@
2222

2323
namespace NAtracDEnc {
2424

25-
template<class TIn>
2625
class Atrac1AnalysisFilterBank {
2726
const static int nInSamples = 512;
2827
const static int delayComp = 39;
29-
TQmf<TIn, nInSamples> Qmf1;
30-
TQmf<TIn, nInSamples / 2> Qmf2;
28+
TQmf<nInSamples> Qmf1;
29+
TQmf<nInSamples / 2> Qmf2;
3130
std::vector<float> MidLowTmp;
3231
std::vector<float> DelayBuf;
3332
public:
34-
Atrac1AnalysisFilterBank() {
33+
Atrac1AnalysisFilterBank() noexcept {
3534
MidLowTmp.resize(512);
3635
DelayBuf.resize(delayComp + 512);
3736
}
38-
void Analysis(TIn* pcm, float* low, float* mid, float* hi) {
37+
void Analysis(const float* pcm, float* low, float* mid, float* hi) noexcept {
3938
memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp);
4039
Qmf1.Analysis(pcm, &MidLowTmp[0], &DelayBuf[delayComp]);
4140
Qmf2.Analysis(&MidLowTmp[0], low, mid);
4241
memcpy(hi, &DelayBuf[0], sizeof(float) * 256);
4342

4443
}
4544
};
46-
template<class TOut>
45+
4746
class Atrac1SynthesisFilterBank {
4847
const static int nInSamples = 512;
4948
const static int delayComp = 39;
50-
TQmf<TOut, nInSamples> Qmf1;
51-
TQmf<TOut, nInSamples / 2> Qmf2;
49+
TQmf<nInSamples> Qmf1;
50+
TQmf<nInSamples / 2> Qmf2;
5251
std::vector<float> MidLowTmp;
5352
std::vector<float> DelayBuf;
5453
public:
55-
Atrac1SynthesisFilterBank() {
54+
Atrac1SynthesisFilterBank() noexcept {
5655
MidLowTmp.resize(512);
5756
DelayBuf.resize(delayComp + 512);
5857
}
59-
void Synthesis(TOut* pcm, float* low, float* mid, float* hi) {
58+
void Synthesis(float* pcm, const float* low, const float* mid, const float* hi) noexcept {
6059
memcpy(&DelayBuf[0], &DelayBuf[256], sizeof(float) * delayComp);
6160
memcpy(&DelayBuf[delayComp], hi, sizeof(float) * 256);
6261
Qmf2.Synthesis(&MidLowTmp[0], &low[0], &mid[0]);

src/atrac/atrac3_qmf.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,19 @@
2222

2323
namespace NAtracDEnc {
2424

25-
template<class TIn>
2625
class Atrac3AnalysisFilterBank {
2726
const static int nInSamples = 1024;
28-
TQmf<TIn, nInSamples> Qmf1;
29-
TQmf<TIn, nInSamples / 2> Qmf2;
30-
TQmf<TIn, nInSamples / 2> Qmf3;
27+
TQmf<nInSamples> Qmf1;
28+
TQmf<nInSamples / 2> Qmf2;
29+
TQmf<nInSamples / 2> Qmf3;
3130
std::vector<float> Buf1;
3231
std::vector<float> Buf2;
3332
public:
34-
Atrac3AnalysisFilterBank() {
33+
Atrac3AnalysisFilterBank() noexcept {
3534
Buf1.resize(nInSamples);
3635
Buf2.resize(nInSamples);
3736
}
38-
void Analysis(TIn* pcm, float* subs[4]) {
37+
void Analysis(const float* pcm, float* subs[4]) noexcept {
3938
Qmf1.Analysis(pcm, Buf1.data(), Buf2.data());
4039
Qmf2.Analysis(Buf1.data(), subs[0], subs[1]);
4140
Qmf3.Analysis(Buf2.data(), subs[3], subs[2]);

src/atrac1denc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class TAtrac1Encoder : public IProcessor, public TAtrac1MDCT {
6363
std::array<std::array<float, 256 + 16>, 2> PcmBufMid;
6464
std::array<std::array<float, 512 + 16>, 2> PcmBufHi;
6565

66-
Atrac1AnalysisFilterBank<float> AnalysisFilterBank[2];
66+
Atrac1AnalysisFilterBank AnalysisFilterBank[2];
6767

6868
const std::vector<float> LoudnessCurve;
6969
std::vector<std::unique_ptr<NAtrac1::IAtrac1BitAlloc>> BitAllocs;
@@ -117,7 +117,7 @@ class TAtrac1Decoder : public IProcessor, public TAtrac1MDCT {
117117
int32_t PcmValueMax = 1;
118118
int32_t PcmValueMin = -1;
119119

120-
Atrac1SynthesisFilterBank<float> SynthesisFilterBank[2];
120+
Atrac1SynthesisFilterBank SynthesisFilterBank[2];
121121
public:
122122
TAtrac1Decoder(TCompressedInputPtr&& aea);
123123
TPCMEngine::TProcessLambda GetLambda() override;

src/atrac3denc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class TAtrac3Encoder : public IProcessor, public TAtrac3MDCT {
8989

9090
float PrevPeak[2][4] = {{0.0}}; //2 channel, 4 band - peak level (after windowing), used to check overflow during scalling
9191

92-
Atrac3AnalysisFilterBank<float> AnalysisFilterBank[2];
92+
Atrac3AnalysisFilterBank AnalysisFilterBank[2];
9393

9494
TScaler<TAtrac3Data> Scaler;
9595
std::vector<NAtrac3::TAtrac3BitStreamWriter::TSingleChannelElement> SingleChannelElements;

src/qmf/qmf.h

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,14 @@
2121

2222
#include "../config.h"
2323

24-
template<class TPCM, int nIn>
24+
template<size_t nIn>
2525
class TQmf {
2626
static const float TapHalf[24];
2727
float QmfWindow[48];
28-
TPCM PcmBuffer[nIn + 46];
28+
float PcmBuffer[nIn + 46];
2929
float PcmBufferMerge[nIn + 46];
30-
float DelayBuff[46];
3130
public:
32-
TQmf() {
31+
TQmf() noexcept {
3332
const int sz = sizeof(QmfWindow)/sizeof(QmfWindow[0]);
3433

3534
for (size_t i = 0 ; i < sz/2; i++) {
@@ -41,13 +40,12 @@ class TQmf {
4140
}
4241
}
4342

44-
void Analysis(TPCM* in, float* lower, float* upper) {
43+
void Analysis(const float* in, float* lower, float* upper) noexcept {
4544
float temp;
46-
for (size_t i = 0; i < 46; i++)
47-
PcmBuffer[i] = PcmBuffer[nIn + i];
4845

49-
for (size_t i = 0; i < nIn; i++)
50-
PcmBuffer[46+i] = in[i];
46+
memcpy(&PcmBuffer[0], &PcmBuffer[nIn], 46 * sizeof(float));
47+
48+
memcpy(&PcmBuffer[46], in, nIn * sizeof(float));
5149

5250
for (size_t j = 0; j < nIn; j+=2) {
5351
lower[j/2] = upper[j/2] = 0.0;
@@ -61,10 +59,9 @@ class TQmf {
6159
}
6260
}
6361

64-
void Synthesis(TPCM* out, float* lower, float* upper) {
65-
memcpy(&PcmBufferMerge[0], &DelayBuff[0], 46*sizeof(float));
62+
void Synthesis(float* out, const float* lower, const float* upper) noexcept {
6663
float* newPart = &PcmBufferMerge[46];
67-
for (int i = 0; i < nIn; i+=4) {
64+
for (size_t i = 0; i < nIn; i+=4) {
6865
newPart[i+0] = lower[i/2] + upper[i/2];
6966
newPart[i+1] = lower[i/2] - upper[i/2];
7067
newPart[i+2] = lower[i/2 + 1] + upper[i/2 + 1];
@@ -84,12 +81,12 @@ class TQmf {
8481
winP += 2;
8582
out += 2;
8683
}
87-
memcpy(&DelayBuff[0], &PcmBufferMerge[nIn], 46*sizeof(float));
84+
memcpy(&PcmBufferMerge[0], &PcmBufferMerge[nIn], 46 * sizeof(float));
8885
}
8986
};
9087

91-
template<class TPCM, int nIn>
92-
const float TQmf<TPCM, nIn>::TapHalf[24] = {
88+
template<size_t nIn>
89+
const float TQmf<nIn>::TapHalf[24] = {
9390
-0.00001461907, -0.00009205479, -0.000056157569, 0.00030117269,
9491
0.0002422519, -0.00085293897, -0.0005205574, 0.0020340169,
9592
0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944,

0 commit comments

Comments
 (0)