aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2024-07-09 21:55:23 +0000
committerDaniil Cherednik <dan.cherednik@gmail.com>2024-07-09 22:08:38 +0000
commitf1c9056c40e22b6aea21da5281e469b93a334778 (patch)
tree8d6658c4fdbf4d25d3a593fba14b93ac158a4cd0 /src/lib
parent73619bbbcd1f0c3d6ff3cada2b06379031f856b7 (diff)
parentc4b19af8391640f143aaf446658354dcf01432d1 (diff)
downloadatracdenc-f1c9056c40e22b6aea21da5281e469b93a334778.tar.gz
Merge branch 'master' into at3plus-dev
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/bitstream/bitstream.h3
-rw-r--r--src/lib/fft/kissfft_impl/kiss_fft.h1
-rw-r--r--src/lib/mdct/mdct_ut.cpp37
-rw-r--r--src/lib/mdct/mdct_ut_common.h28
4 files changed, 56 insertions, 13 deletions
diff --git a/src/lib/bitstream/bitstream.h b/src/lib/bitstream/bitstream.h
index cfba790..2e71c02 100644
--- a/src/lib/bitstream/bitstream.h
+++ b/src/lib/bitstream/bitstream.h
@@ -17,9 +17,10 @@
*/
#pragma once
-#include <vector>
+#include <cstdint>
#include <iostream>
+#include <vector>
namespace NBitStream {
diff --git a/src/lib/fft/kissfft_impl/kiss_fft.h b/src/lib/fft/kissfft_impl/kiss_fft.h
index 7786eb6..64c50f4 100644
--- a/src/lib/fft/kissfft_impl/kiss_fft.h
+++ b/src/lib/fft/kissfft_impl/kiss_fft.h
@@ -44,7 +44,6 @@ extern "C" {
#else
# ifndef kiss_fft_scalar
/* default is float */
-# error "wrong type"
# define kiss_fft_scalar float
# endif
#endif
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));
+}
+