mmserv

Minimum Mean Square Error detection on RISC-V Vector Extention
git clone https://git.ea.contact/mmserv
Log | Files | Refs | README

commit 67688ce342005fab74260f5e56ea278fae29ec51
parent d838f0bd87ace7c216a57728eab59694b9fb996a
Author: Egor Achkasov <eaachkasov@edu.hse.ru>
Date:   Fri, 15 Nov 2024 00:14:52 +0100

Impl MSE

Diffstat:
Minclude/mmserv.h | 9+++++++++
Mmain.c | 16+++++++++++++---
Msrc/mmserv.c | 11+++++++++++
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 @@ -42,6 +42,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) @@ -51,7 +54,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); +}