aboutsummaryrefslogtreecommitdiffstats
path: root/src/mdct
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2016-06-19 02:58:23 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2016-06-19 03:31:55 +0300
commit1151d5831f19a9f24dd0c545a4968606712a62d2 (patch)
treec978c1b9a3fc86fef531dd412fe6b7668b7c0567 /src/mdct
parent8d65a0bd0774e03b3d10354e15f2f3361a2ce26a (diff)
downloadatracdenc-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.h10
-rw-r--r--src/mdct/mdct_ut.cpp64
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);