aboutsummaryrefslogtreecommitdiffstats
path: root/src/atrac/atrac3plus_pqf
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2024-06-16 20:43:56 +0000
committerDaniil Cherednik <dan.cherednik@gmail.com>2024-06-16 20:54:48 +0000
commit482f247c6a3a0615491eab6b90c19b929a87ab56 (patch)
tree354d0378018485a407fc7369e2a91cc6705ec4f2 /src/atrac/atrac3plus_pqf
parent80a30dc68671d7e88082bd28684320a2680824a1 (diff)
downloadatracdenc-482f247c6a3a0615491eab6b90c19b929a87ab56.tar.gz
[AT3P] Use fast DCT-IV calculation for PQF
Diffstat (limited to 'src/atrac/atrac3plus_pqf')
-rw-r--r--src/atrac/atrac3plus_pqf/atrac3plus_pqf.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/atrac/atrac3plus_pqf/atrac3plus_pqf.c b/src/atrac/atrac3plus_pqf/atrac3plus_pqf.c
index 30dbbc8..151e0e8 100644
--- a/src/atrac/atrac3plus_pqf/atrac3plus_pqf.c
+++ b/src/atrac/atrac3plus_pqf/atrac3plus_pqf.c
@@ -30,6 +30,8 @@
#include "atrac3plus_pqf.h"
#include "atrac3plus_pqf_data.h"
+#include "../../mdct/dct.h"
+
/*
* Number of subbands to split input signal
*/
@@ -49,18 +51,9 @@
static float fir[PROTO_SZ];
-static void dct4(float* out, const float* x, int N, float scale) {
- for (int k = 0; k < N; k++) {
- double sum = 0;
- for (int n = 0; n < N; n++) {
- sum += ((double)x[n] * cosl((M_PI/(double)N) * ((double)n + 0.5) * ((double)k + 0.5)));
- }
- out[N - 1 - k] = sum * scale;
- }
-}
-
struct at3plus_pqf_a_ctx {
float buf[FRAME_SZ + OVERLAP_SZ];
+ atde_dct_ctx_t dct_ctx;
};
static void init(void)
@@ -95,7 +88,7 @@ static void vectoring(const float* const x, float* y)
}
}
-static void matrixing(const float* y, float* samples )
+static void matrixing(atde_dct_ctx_t ctx, const float* y, float* samples )
{
float yy[SUBBANDS_NUM];
float res[SUBBANDS_NUM];
@@ -105,7 +98,7 @@ static void matrixing(const float* y, float* samples )
yy[i + 8] = y[i + 16] + y[31 - i];
}
- dct4(res, yy, SUBBANDS_NUM, 128.0 * 512.0);
+ atde_do_dct4_16(ctx, yy, res);
for (int i = 0; i < SUBBANDS_NUM; i++) {
samples[i * SUBBAND_SIZE] = res[SUBBANDS_NUM - 1 - i];
@@ -120,6 +113,8 @@ at3plus_pqf_a_ctx_t at3plus_pqf_create_a_ctx()
ctx->buf[i] = 0.0;
}
+ ctx->dct_ctx = atde_create_dct4_16(128 * 512.0);
+
init();
return ctx;
@@ -127,6 +122,8 @@ at3plus_pqf_a_ctx_t at3plus_pqf_create_a_ctx()
void at3plus_pqf_free_a_ctx(at3plus_pqf_a_ctx_t ctx)
{
+ atde_free_dct_ctx(ctx->dct_ctx);
+
free(ctx);
}
@@ -142,7 +139,7 @@ void at3plus_pqf_do_analyse(at3plus_pqf_a_ctx_t ctx, const float* in, float* out
for (int i = 0; i < SUBBAND_SIZE; i++) {
vectoring(x, y);
- matrixing (y, &out[i]);
+ matrixing (ctx->dct_ctx, y, &out[i]);
x += SUBBANDS_NUM;
}