aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/mdct/mdct_ut.cpp
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/mdct/mdct_ut.cpp
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/mdct/mdct_ut.cpp')
-rw-r--r--src/lib/mdct/mdct_ut.cpp37
1 files changed, 26 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);
}
}