From cffea6d754c814efca62e639888068ff662ac80a Mon Sep 17 00:00:00 2001 From: zeefaad Date: Thu, 23 Oct 2025 13:07:49 +0200 Subject: [PATCH] 1D constellation + precalculated sqrt(M) --- QAM/out | Bin 20896 -> 20896 bytes QAM/qam.c | 36 +++++++++++++++--------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/QAM/out b/QAM/out index 50b6c9ccacf8fbb99bf6f9bdddd160204ffb47c6..bd70fa06ec215ab3b5eb1d5e5d9b2270ed622201 100755 GIT binary patch delta 3849 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 SAC~^p^2MQ}8$F9W(*FUtqyF{) delta 4295 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 diff --git a/QAM/qam.c b/QAM/qam.c index 71293bd..ad494a8 100644 --- a/QAM/qam.c +++ b/QAM/qam.c @@ -10,6 +10,7 @@ struct qam_system_s { int M; // Nombre de symboles M-QAM int k; // Nombre de bits/symboles + int sm; // sqrt M double Fs; // Fréquence d'échantillionage double Ts; // Temps d'échantillionage int N; // Nombre d'échantillions @@ -20,16 +21,15 @@ typedef struct qam_system_s qam_system; // Initialisation de la constellation (double tableau de taille sqrt(M)), void init_constellation (qam_system* qam) { - int sm = (int)sqrt(qam->M); qam->constellation = (double complex*)malloc(sizeof(double complex) * qam->M); double norm_factor = sqrt((double)(qam->M - 1) / 3.0); // Pour puissance unitaire - for (int i = 0; i < sm; i++) { - double ip = -(sm - 1) + 2 * i; - for (int j = 0; j < sm; j++) { - double qp = -(sm - 1) + 2 * j; - int idx = i * sm + j; + for (int i = 0; i < qam->sm; i++) { + double ip = -(qam->sm - 1) + 2 * i; + for (int j = 0; j < qam->sm; j++) { + double qp = -(qam->sm - 1) + 2 * j; + int idx = i * qam->sm + j; qam->constellation[idx] = (ip + I * qp) / norm_factor; } } @@ -73,7 +73,6 @@ void demodulate(qam_system* qam, double complex* s, int nb_symbols, uint8_t* bit } // Distance euclidien de Ir et Qr pour avoir le point le plus proche de la constellation (lent) - int sm = (int)sqrt(qam->M); double min_d = INFINITY; int i_cl = 0; int j_cl = 0; @@ -81,8 +80,8 @@ void demodulate(qam_system* qam, double complex* s, int nb_symbols, uint8_t* bit double d = cabs(r - qam->constellation[idx]); if (d < min_d) { min_d = d; - i_cl = idx / sm; - j_cl = idx % sm; + i_cl = idx / qam->sm; + j_cl = idx % qam->sm; } } @@ -127,7 +126,6 @@ void add_noise (double complex* s, int len, double sigma) { // Changer le tableau de bits en boolen ou alors la represenation binaire et shifter pour extraire les bits (pas bien si M plus grand) void bits_to_symbols (qam_system* qam, uint8_t* bits, int nb_bits, double complex* symbols) { int nb_symbols = nb_bits / qam->k; - int sm = (int)sqrt(qam->M); // k pair if (qam->k % 2 != 0) { @@ -148,11 +146,11 @@ void bits_to_symbols (qam_system* qam, uint8_t* bits, int nb_bits, double comple int i_gray = bin_to_gray(i_bin); int j_gray = bin_to_gray(j_bin); - if (i_gray < 0 || i_gray >= sm || j_gray < 0 || j_gray >= sm) { - printf("bits_to_symbols : IOOR i_gray = %d j_gray = %d sm = %d \n", i_gray, j_gray, sm); + if (i_gray < 0 || i_gray >= qam->sm || j_gray < 0 || j_gray >= qam->sm) { + printf("bits_to_symbols : IOOR i_gray = %d j_gray = %d sm = %d \n", i_gray, j_gray, qam->sm); exit(1); } - symbols[sym] = qam->constellation[i_gray * sm + j_gray]; + symbols[sym] = qam->constellation[i_gray * qam->sm + j_gray]; } } @@ -178,10 +176,9 @@ void add_freq(qam_system* qam, double complex* s, double freq_offset, int total_ } void fill_constellation_data(qam_system* qam, FILE *fp_ref) { - int sm = (int)sqrt(qam->M); - for (int i = 0; i < sm; i++) { - for (int j = 0; j < sm; j++) { - int idx = i * sm + j; + for (int i = 0; i < qam->sm; i++) { + for (int j = 0; j < qam->sm; j++) { + int idx = i * qam->sm + j; fprintf(fp_ref, "% .8f % .8f\n", creal(qam->constellation[idx]), cimag(qam->constellation[idx])); } } @@ -208,11 +205,7 @@ void text_to_bits(int nb_chars, int nb_bits, char* texte, uint8_t* input_bits) { // Libération de la mémoire void free_constellation(qam_system* qam) { - int sm = (int)sqrt(qam->M); - for (int i = 0; i < sm; i++) - free(qam->constellation[i]); free(qam->constellation); - } int main () { @@ -220,6 +213,7 @@ int main () { qam_system qam; qam.M = 16; qam.k = (int)log2((double)(qam.M)); + qam.sm = (int)sqrt(qam.M); qam.Fs = 44100; qam.Ts = 0.01; qam.N = (int)(qam.Fs * qam.Ts);