QAM add noise
This commit is contained in:
26
QAM/qam.c
26
QAM/qam.c
@ -41,6 +41,23 @@ void init_constellation (qam_system* qam) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calcul du bruit gaussien pour un sigma donné
|
||||||
|
// Formule de Box-Muller
|
||||||
|
double gaussian_noise (double sigma) {
|
||||||
|
double u1 = (rand() + 1) / ((double)RAND_MAX + 2);
|
||||||
|
double u2 = (rand() + 1) / ((double)RAND_MAX + 2);
|
||||||
|
return sigma * sqrt(-2 * log(u1)) * cos(2 * M_PI * u2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ajout du bruit
|
||||||
|
void add_noise (double complex* s, int len, double sigma) {
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
double nr = gaussian_noise(sigma);
|
||||||
|
double ni = gaussian_noise(sigma);
|
||||||
|
s[i] += nr + I * ni;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Changer le tableau de bits en boolen ou alors la represenation binaire et shifter pour extraire les bits (pas bien si M plus grand)
|
// 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) {
|
void bits_to_symbols (qam_system* qam, uint8_t* bits, int nb_bits, double complex* symbols) {
|
||||||
int nb_symbols = nb_bits / qam->k;
|
int nb_symbols = nb_bits / qam->k;
|
||||||
@ -129,7 +146,7 @@ int main (int argc, char *argv[]) {
|
|||||||
qam.M = 256;
|
qam.M = 256;
|
||||||
qam.k = (int)log2((double)(qam.M));
|
qam.k = (int)log2((double)(qam.M));
|
||||||
qam.Fs = 44100;
|
qam.Fs = 44100;
|
||||||
qam.Ts = 0.00003;
|
qam.Ts = 0.003;
|
||||||
qam.N = (int)qam.Fs * qam.Ts;
|
qam.N = (int)qam.Fs * qam.Ts;
|
||||||
qam.Fc = 2000;
|
qam.Fc = 2000;
|
||||||
init_constellation(&qam);
|
init_constellation(&qam);
|
||||||
@ -155,6 +172,13 @@ int main (int argc, char *argv[]) {
|
|||||||
int total_samples = qam.N * nb_symbols;
|
int total_samples = qam.N * nb_symbols;
|
||||||
double complex* s = (double complex*)malloc(sizeof(double complex) * total_samples);
|
double complex* s = (double complex*)malloc(sizeof(double complex) * total_samples);
|
||||||
modulate(&qam, symbols, nb_symbols, s);
|
modulate(&qam, symbols, nb_symbols, s);
|
||||||
|
// Ajout du bruit
|
||||||
|
double signal_power = (2.0/3.0)*(qam.M-1); // puissance moyenne avant échelle
|
||||||
|
double snr_dB = -27; // Signal to noise ratio
|
||||||
|
double snr_lin = pow(10.0, snr_dB / 10.0);
|
||||||
|
double sigma = sqrt(signal_power / snr_lin);
|
||||||
|
printf("Ajout du bruit \n puissance du signal : %f\n SNR db : %f\n sigma : %f\n", signal_power, snr_dB, sigma);
|
||||||
|
add_noise(s, total_samples, sigma);
|
||||||
|
|
||||||
printf("Demodulation\n");
|
printf("Demodulation\n");
|
||||||
|
|
||||||
|
|||||||
46409
QAM/sin.txt
46409
QAM/sin.txt
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user