aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/mdct/mdct_ut.cpp
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2024-06-17 20:12:45 +0000
committerDaniil Cherednik <dan.cherednik@gmail.com>2024-06-17 22:21:52 +0200
commit23a4e5f1dd7ce24f65a2af0598d1f92af4b5c424 (patch)
tree8a259ca8363c5b15fd3605b760518cb37e6ac63c /src/lib/mdct/mdct_ut.cpp
parent73dbd1609445a0142e1e138b6b44ec6d1925cbb8 (diff)
downloadatracdenc-23a4e5f1dd7ce24f65a2af0598d1f92af4b5c424.tar.gz
[refactoring] move some libraries in to library directory
Diffstat (limited to 'src/lib/mdct/mdct_ut.cpp')
-rw-r--r--src/lib/mdct/mdct_ut.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/lib/mdct/mdct_ut.cpp b/src/lib/mdct/mdct_ut.cpp
new file mode 100644
index 0000000..31f6f81
--- /dev/null
+++ b/src/lib/mdct/mdct_ut.cpp
@@ -0,0 +1,200 @@
+/*
+ * 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
+ */
+
+#include "mdct.h"
+#include <gtest/gtest.h>
+
+#include <vector>
+#include <cstdlib>
+
+using std::vector;
+using namespace NMDCT;
+
+static vector<TFloat> mdct(TFloat* x, int N) {
+ vector<TFloat> res;
+ for (int k = 0; k < N; k++) {
+ TFloat sum = 0;
+ for (int n = 0; n < 2 * N; n++)
+ 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<TFloat> midct(TFloat* x, int N) {
+ vector<TFloat> res;
+ for (int n = 0; n < 2 * N; n++) {
+ TFloat sum = 0;
+ for (int k = 0; k < N; k++)
+ sum += (x[k] * cos((M_PI/N) * ((TFloat)n + 0.5 + N/2) * ((TFloat)k + 0.5)));
+
+ res.push_back(sum);
+ }
+ return res;
+}
+
+TEST(TMdctTest, MDCT32) {
+ const int N = 32;
+ TMDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MDCT64) {
+ const int N = 64;
+ TMDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MDCT128) {
+ const int N = 128;
+ TMDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MDCT256) {
+ const int N = 256;
+ TMDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MDCT256_RAND) {
+ const int N = 256;
+ TMDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N; i++) {
+ src[i] = rand();
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MIDCT32) {
+ const int N = 32;
+ TMIDCT<N> transform;
+ vector<TFloat> src(N);
+ for (int i = 0; i < N/2; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MIDCT64) {
+ const int N = 64;
+ TMIDCT<N> transform;
+ vector<TFloat> src(N);
+ for (int i = 0; i < N/2; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MIDCT128) {
+ const int N = 128;
+ TMIDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N/2; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MIDCT256) {
+ const int N = 256;
+ TMIDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N/2; i++) {
+ src[i] = i;
+ }
+ 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);
+ }
+}
+
+TEST(TMdctTest, MIDCT256_RAND) {
+ const int N = 256;
+ TMIDCT<N> transform(N);
+ vector<TFloat> src(N);
+ for (int i = 0; i < N/2; i++) {
+ src[i] = rand();
+ }
+ 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);
+ }
+}