From f614b794aa1da889657c3c741686d6b8247cebf5 Mon Sep 17 00:00:00 2001 From: zeefaad Date: Mon, 29 Sep 2025 15:47:14 +0200 Subject: [PATCH] Start of QAM --- QAM/out | Bin 0 -> 16224 bytes QAM/qam.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100755 QAM/out create mode 100644 QAM/qam.c diff --git a/QAM/out b/QAM/out new file mode 100755 index 0000000000000000000000000000000000000000..c0a5bb16291d439fc229103c0adaae2001557770 GIT binary patch literal 16224 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 literal 0 HcmV?d00001 diff --git a/QAM/qam.c b/QAM/qam.c new file mode 100644 index 0000000..b7dd74e --- /dev/null +++ b/QAM/qam.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include + +struct qam_system_s { + int M; // Nombre de symboles M-QAM + int k; // Nombre de bits/symboles + double Fs; // Fréquence d'échantillionage + double Ts; // Temps d'échantillionage + int N; // Nombre d'échantillions + double Fc; // Fréquence de la porteuse + double complex** constellation; // Tableau de symboles I + j Q +}; +typedef struct qam_system_s qam_system; + +void init_constellation (qam_system *qam) { + int sm = sqrt(qam->M); + qam->constellation = (double complex**)malloc(sizeof(double complex*) * sm); + + for (int i = 0; i < sm; i++) { + qam->constellation[i] = (double complex*)malloc(sizeof(double complex) * sm); + } + + for (int i = 0; i < sm; i++) { + double complex ip = -(sm - 1) + 2 * i; + for (int j = 0; j < sm; j++) { + double complex qp = -(sm - 1) + 2 * j; + qam->constellation[i][j] = ip + I * qp; + qam->constellation[i][j] /= sqrt((qam->M-1)/3.0); // Pour puissance unitaire + } + } +} + +void bits_to_symbols (qam_system *qam, int *bits, int nb_bits, double complex *symbols) { + int nb_symbols = nb_bits / qam->k; + int sm = sqrt(qam->M); + for (int k = 0; k < nb_symbols; k++) { + int id = 0; + for (int b = 0 ; b < qam->k; b++) { + id = id * 2 + bits[k * qam->k + b]; + } + int i = id / sm; + int j = id % sm; + symbols[k] = qam->constellation[i][j]; + } +} + +void modulate (qam_system *qam,double complex *symbols, int nb_symbols, double complex *s) { + for (int k = 0; k < nb_symbols; k++) { + double complex iq = symbols[k]; + for (int n = 0; n < qam->N; n++) { + s[k * qam->N + n] = iq * cexp(2 * M_PI * qam->Fc * ((double)n / qam->Fs)); + } + } +} + +int main () { + qam_system qam; + qam.M = 16; + qam.k = (int)log2((double)(qam.M)); + qam.Fs = 44100; + qam.Ts = 0.01; + qam.N = (int)qam.Fs * qam.Ts; + qam.Fc = 2000; + init_constellation(&qam); + + // Nombre de bit multiple de k sinon remplir de zero jusqu'a ce que ce le soit + int bits[16] = {1,0,1,1, 0,1,1,0, 1,1,0,0, 0,0,0,1}; + + int nb_symbols = 16 / qam.k; + double complex symbols[nb_symbols]; + bits_to_symbols(&qam, bits, 16, symbols); + + int total_samples = qam.N * nb_symbols; + double complex* s = (double complex*)malloc(sizeof(double complex) * total_samples); + modulate(&qam, symbols, nb_symbols, s); + + for(int i=0; i