commit 1b5aa7bf7c87654323b2315663613ae9a314cb82
parent f354fc7a4af7e5f71ce51e6cd00b6059594ca97e
Author: Egor Achkasov <eaachkasov@edu.hse.ru>
Date: Fri, 15 Nov 2024 00:14:52 +0100
Impl MSE
Diffstat:
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/include/mmserv.h b/include/mmserv.h
@@ -174,4 +174,13 @@ void cbackwardsub_TxTx(
IN complex b[NUM_TX_ANT][NUM_SC],
OUT complex result[NUM_TX_ANT][NUM_SC]);
+/** Calculate mean squared error between the original x and the estimated x
+ * \param x original x. Shape [NUM_TX_ANT][NUM_SC]
+ * \param x_MMSE estimated x. Shape [NUM_TX_ANT][NUM_SC]
+ * \return mean squared error
+ */
+acc_t mse(
+ IN complex x[NUM_TX_ANT][NUM_SC],
+ IN complex x_MMSE[NUM_TX_ANT][NUM_SC]);
+
#endif /* __MMSERV_H */
diff --git a/main.c b/main.c
@@ -65,6 +65,9 @@ int main() {
complex x_MMSE[NUM_TX_ANT][NUM_SC];
mmse(H, y, R, x_MMSE);
+ /* Print MSE */
+ printf("%f\n", mse(x, x_MMSE));
+
/* Interleave the result */
data_t res[NUM_TX_ANT][NUM_SC][2];
for (i = 0; i < NUM_TX_ANT; ++i)
@@ -74,7 +77,14 @@ int main() {
}
/* Save the result */
- for (i = 0; i < NUM_TX_ANT; ++i)
- for (j = 0; j < NUM_SC; ++j)
- printf("%f %f %f %f\n", i, j, res[i][j][0], res[i][j][1]);
+ FILE* f = fopen("out/x_mmse.bin", "w");
+ if (!f) {
+ fprintf(stderr, "Error: could not open file out/x_MMSE.bin\n");
+ exit(8);
+ }
+ if ((fwrite(res, sizeof(data_t), NUM_TX_ANT * NUM_SC * 2, f)) != NUM_TX_ANT * NUM_SC * 2) {
+ fprintf(stderr, "Error: could not write file out/x_MMSE.bin\n");
+ exit(8);
+ }
+ fclose(f);
}
diff --git a/src/mmserv.c b/src/mmserv.c
@@ -343,3 +343,14 @@ void mmse_nosqrt(
cmat_hermitian_transpose_TxTx(L, LH);
cbackwardsub_TxTx(L, z, x_MMSE);
}
+
+acc_t mse(
+ IN complex x[NUM_TX_ANT][NUM_SC],
+ IN complex x_MMSE[NUM_TX_ANT][NUM_SC])
+{
+ acc_t sum = 0;
+ for (uint32_t i = 0; i != NUM_TX_ANT; ++i)
+ for (uint32_t j = 0; j != NUM_SC; ++j)
+ sum += cabs2(csub(x[i][j], x_MMSE[i][j]));
+ return sum / (NUM_TX_ANT * NUM_SC);
+}