aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2024-07-08 21:42:48 +0000
committerDaniil Cherednik <dan.cherednik@gmail.com>2024-07-09 23:07:40 +0200
commitc4b19af8391640f143aaf446658354dcf01432d1 (patch)
tree68ebb11f38eaec53e16879e59ce776bd249d8491 /src/lib
parentf8eabde1e1a2fa6bdb2b09dcdee5cecb750beb30 (diff)
downloadatracdenc-c4b19af8391640f143aaf446658354dcf01432d1.tar.gz
Allow to configure atracdenc to use float instead of double
The default is double for hystorical reason. Actually no any reason to use double precision float point calculation for all processing. AT3P encoding will use float except places were we really need double precision. So this default will be changed to float in near future and this option will be removed.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/mdct/mdct_ut.cpp37
-rw-r--r--src/lib/mdct/mdct_ut_common.h28
2 files changed, 54 insertions, 11 deletions
diff --git a/src/lib/mdct/mdct_ut.cpp b/src/lib/mdct/mdct_ut.cpp
index 31f6f81..6f49b59 100644
--- a/src/lib/mdct/mdct_ut.cpp
+++ b/src/lib/mdct/mdct_ut.cpp
@@ -17,6 +17,7 @@
*/
#include "mdct.h"
+#include "mdct_ut_common.h"
#include <gtest/gtest.h>
#include <vector>
@@ -35,7 +36,7 @@ static vector<TFloat> mdct(TFloat* x, int N) {
res.push_back(sum);
}
return res;
-}
+}
static vector<TFloat> midct(TFloat* x, int N) {
vector<TFloat> res;
@@ -59,8 +60,9 @@ TEST(TMdctTest, MDCT32) {
const vector<TFloat> res1 = mdct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N);
for (int i = 0; i < res1.size(); i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -74,8 +76,9 @@ TEST(TMdctTest, MDCT64) {
const vector<TFloat> res1 = mdct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N);
for (int i = 0; i < res1.size(); i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -89,8 +92,9 @@ TEST(TMdctTest, MDCT128) {
const vector<TFloat> res1 = mdct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N * 4);
for (int i = 0; i < res1.size(); i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -104,8 +108,9 @@ TEST(TMdctTest, MDCT256) {
const vector<TFloat> res1 = mdct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N * 4);
for (int i = 0; i < res1.size(); i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.00000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -113,14 +118,17 @@ TEST(TMdctTest, MDCT256_RAND) {
const int N = 256;
TMDCT<N> transform(N);
vector<TFloat> src(N);
+ TFloat m = 0.0;
for (int i = 0; i < N; i++) {
src[i] = rand();
+ m = std::max(m, src[i]);
}
const vector<TFloat> res1 = mdct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(m * 8);
for (int i = 0; i < res1.size(); i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.01);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -134,8 +142,9 @@ TEST(TMdctTest, MIDCT32) {
const vector<TFloat> res1 = midct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N);
for (int i = 0; i < N; i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -149,8 +158,9 @@ TEST(TMdctTest, MIDCT64) {
const vector<TFloat> res1 = midct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N);
for (int i = 0; i < N; i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -164,8 +174,9 @@ TEST(TMdctTest, MIDCT128) {
const vector<TFloat> res1 = midct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N);
for (int i = 0; i < N; i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.0000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -179,8 +190,9 @@ TEST(TMdctTest, MIDCT256) {
const vector<TFloat> res1 = midct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(N * 2);
for (int i = 0; i < N; i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.000000001);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
@@ -188,13 +200,16 @@ TEST(TMdctTest, MIDCT256_RAND) {
const int N = 256;
TMIDCT<N> transform(N);
vector<TFloat> src(N);
+ TFloat m = 0.0;
for (int i = 0; i < N/2; i++) {
src[i] = rand();
+ m = std::max(m, src[i]);
}
const vector<TFloat> res1 = midct(&src[0], N/2);
const vector<TFloat> res2 = transform(&src[0]);
EXPECT_EQ(res1.size(), res2.size());
+ auto eps = CalcEps(m * 4);
for (int i = 0; i < N; i++) {
- EXPECT_NEAR(res1[i], res2[i], 0.01);
+ EXPECT_NEAR(res1[i], res2[i], eps);
}
}
diff --git a/src/lib/mdct/mdct_ut_common.h b/src/lib/mdct/mdct_ut_common.h
new file mode 100644
index 0000000..5c1096c
--- /dev/null
+++ b/src/lib/mdct/mdct_ut_common.h
@@ -0,0 +1,28 @@
+/*
+ * This file is part of AtracDEnc.
+ *
+ * AtracDEnc is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * AtracDEnc is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with AtracDEnc; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#pragma once
+
+#include "mdct.h"
+
+// Calculate value of error for given magnitude
+inline TFloat CalcEps(TFloat magn) {
+ const float snr = (sizeof(TFloat) == 4) ? -114.0 : -240.0;
+ return magn * pow(10, (snr / 20.0));
+}
+