diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-06-19 02:58:23 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-06-19 03:31:55 +0300 |
commit | 1151d5831f19a9f24dd0c545a4968606712a62d2 (patch) | |
tree | c978c1b9a3fc86fef531dd412fe6b7668b7c0567 /src/mdct | |
parent | 8d65a0bd0774e03b3d10354e15f2f3361a2ce26a (diff) | |
download | atracdenc-1151d5831f19a9f24dd0c545a4968606712a62d2.tar.gz |
some improvements of ATRAC3 implementation:atrac3
- simple (ATRAC1 like) psychoacoustic added
- possibility to encode tonal components
- simple tonal component extractor
- refactoring
Diffstat (limited to 'src/mdct')
-rw-r--r-- | src/mdct/mdct.h | 10 | ||||
-rw-r--r-- | src/mdct/mdct_ut.cpp | 64 |
2 files changed, 37 insertions, 37 deletions
diff --git a/src/mdct/mdct.h b/src/mdct/mdct.h index ced049c..33863fb 100644 --- a/src/mdct/mdct.h +++ b/src/mdct/mdct.h @@ -8,7 +8,7 @@ namespace NMDCT { class TMDCTBase { protected: MDCTContext Ctx; - TMDCTBase(int n, double scale) { + TMDCTBase(int n, TFloat scale) { mdct_ctx_init(&Ctx, n, scale); }; virtual ~TMDCTBase() { @@ -19,13 +19,13 @@ protected: template<int N> class TMDCT : public TMDCTBase { - std::vector<double> Buf; + std::vector<TFloat> Buf; public: TMDCT(float scale = 1.0) : TMDCTBase(N, scale) , Buf(N/2) {} - const std::vector<double>& operator()(double* in) { + const std::vector<TFloat>& operator()(TFloat* in) { mdct(&Ctx, &Buf[0], in); return Buf; } @@ -33,13 +33,13 @@ public: template<int N> class TMIDCT : public TMDCTBase { - std::vector<double> Buf; + std::vector<TFloat> Buf; public: TMIDCT(float scale = 1.0) : TMDCTBase(N, scale) , Buf(N) {} - const std::vector<double>& operator()(double* in) { + const std::vector<TFloat>& operator()(TFloat* in) { midct(&Ctx, &Buf[0], in); return Buf; } diff --git a/src/mdct/mdct_ut.cpp b/src/mdct/mdct_ut.cpp index e81bea1..3552afd 100644 --- a/src/mdct/mdct_ut.cpp +++ b/src/mdct/mdct_ut.cpp @@ -7,24 +7,24 @@ using std::vector; using namespace NMDCT; -static vector<double> mdct(double* x, int N) { - vector<double> res; +static vector<TFloat> mdct(TFloat* x, int N) { + vector<TFloat> res; for (int k = 0; k < N; k++) { - double sum = 0; + TFloat sum = 0; for (int n = 0; n < 2 * N; n++) - sum += x[n]* cos((M_PI/N) * ((double)n + 0.5 + N/2) * ((double)k + 0.5)); + sum += x[n]* cos((M_PI/N) * ((TFloat)n + 0.5 + N/2) * ((TFloat)k + 0.5)); res.push_back(sum); } return res; } -static vector<double> midct(double* x, int N) { - vector<double> res; +static vector<TFloat> midct(TFloat* x, int N) { + vector<TFloat> res; for (int n = 0; n < 2 * N; n++) { - double sum = 0; + TFloat sum = 0; for (int k = 0; k < N; k++) - sum += (x[k] * cos((M_PI/N) * ((double)n + 0.5 + N/2) * ((double)k + 0.5))); + sum += (x[k] * cos((M_PI/N) * ((TFloat)n + 0.5 + N/2) * ((TFloat)k + 0.5))); res.push_back(sum); } @@ -35,12 +35,12 @@ static vector<double> midct(double* x, int N) { TEST(TBitStream, MDCT64) { const int N = 64; TMDCT<N> transform(N); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N; i++) { src[i] = i; } - const vector<double> res1 = mdct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = mdct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < res1.size(); i++) { EXPECT_NEAR(res1[i], res2[i], 0.0000000001); @@ -50,12 +50,12 @@ TEST(TBitStream, MDCT64) { TEST(TBitStream, MDCT128) { const int N = 128; TMDCT<N> transform(N); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N; i++) { src[i] = i; } - const vector<double> res1 = mdct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = mdct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < res1.size(); i++) { EXPECT_NEAR(res1[i], res2[i], 0.0000000001); @@ -65,12 +65,12 @@ TEST(TBitStream, MDCT128) { TEST(TBitStream, MDCT256) { const int N = 256; TMDCT<N> transform(N); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N; i++) { src[i] = i; } - const vector<double> res1 = mdct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = mdct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < res1.size(); i++) { EXPECT_NEAR(res1[i], res2[i], 0.00000001); @@ -80,12 +80,12 @@ TEST(TBitStream, MDCT256) { TEST(TBitStream, MDCT256_RAND) { const int N = 256; TMDCT<N> transform(N); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N; i++) { src[i] = rand(); } - const vector<double> res1 = mdct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = mdct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < res1.size(); i++) { EXPECT_NEAR(res1[i], res2[i], 0.01); @@ -96,12 +96,12 @@ TEST(TBitStream, MDCT256_RAND) { TEST(TBitStream, MIDCT64) { const int N = 64; TMIDCT<N> transform(1); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N/2; i++) { src[i] = i; } - const vector<double> res1 = midct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = midct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < N; i++) { EXPECT_NEAR(res1[i], res2[i], 0.0000000001); @@ -111,12 +111,12 @@ TEST(TBitStream, MIDCT64) { TEST(TBitStream, MIDCT128) { const int N = 128; TMIDCT<N> transform(1); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N/2; i++) { src[i] = i; } - const vector<double> res1 = midct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = midct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < N; i++) { EXPECT_NEAR(res1[i], res2[i], 0.0000000001); @@ -126,12 +126,12 @@ TEST(TBitStream, MIDCT128) { TEST(TBitStream, MIDCT256) { const int N = 256; TMIDCT<N> transform(1); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N/2; i++) { src[i] = i; } - const vector<double> res1 = midct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = midct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < N; i++) { EXPECT_NEAR(res1[i], res2[i], 0.000000001); @@ -141,12 +141,12 @@ TEST(TBitStream, MIDCT256) { TEST(TBitStream, MIDCT256_RAND) { const int N = 256; TMIDCT<N> transform(1); - vector<double> src(N); + vector<TFloat> src(N); for (int i = 0; i < N/2; i++) { src[i] = rand(); } - const vector<double> res1 = midct(&src[0], N/2); - const vector<double> res2 = transform(&src[0]); + const vector<TFloat> res1 = midct(&src[0], N/2); + const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); for (int i = 0; i < N; i++) { EXPECT_NEAR(res1[i], res2[i], 0.01); |