RRC impulsion response

This commit is contained in:
2025-10-26 12:38:12 +01:00
parent ae04d5e2bd
commit 367eeb5847
2 changed files with 38 additions and 4 deletions

BIN
QAM/out

Binary file not shown.

View File

@ -352,7 +352,7 @@ void pll(qam_system* qam, double complex* s_with_preamble, double complex* r_cor
phase_est += Kp * filtered_error + integrator; phase_est += Kp * filtered_error + integrator;
if (fp_error) { if (fp_error) {
fprintf(fp_error, "%d % .8f\n", k, 100 * filtered_error); fprintf(fp_error, "%d % .8f\n", k, 5 * filtered_error);
fflush(fp_error); fflush(fp_error);
} }
@ -413,7 +413,7 @@ void muller_muller_sync(qam_system* qam, double complex* s_data, int nb_symbols,
d_k_minus_1 = d_k; d_k_minus_1 = d_k;
if (fp_error) { if (fp_error) {
fprintf(fp_error, "%d % .8f\n", k, 5 * timing_offset); fprintf(fp_error, "%d % .8f\n", k, 3 * timing_offset);
fflush(fp_error); fflush(fp_error);
} }
} }
@ -466,6 +466,41 @@ void demodulate_carrier(qam_system* qam, double complex* s_input, double complex
} }
} }
// Réponse impulsionnelle du filtre RRC
void rrc_impulse_response(qam_system* qam, int N_taps, double alpha, double* rrc_taps) {
double Ts_symbol = qam->N / qam->Fs;
double t;
int k;
for (int i = 0; i < N_taps; i++) {
t = ((double)i - (N_taps - 1.0) / 2.0) / qam->Fs;
k = i;
double t_norm = t / Ts_symbol;
if (fabs(t) < 1e-9) { // t = 0
rrc_taps[k] = (1.0 / Ts_symbol) * (1.0 + alpha * (4.0 / M_PI) * (1.0 / 4.0));
} else if (fabs(fabs(t_norm) - 1.0 / (4.0 * alpha)) < 1e-9) {
rrc_taps[k] = (1.0 / Ts_symbol) * (alpha / M_PI) * ( (M_PI / 4.0) * (1.0 / alpha) + 1.0) * sin(M_PI / (4.0 * alpha)) + (1.0 / Ts_symbol) * (alpha / M_PI) * ( (M_PI / 4.0) * (1.0 / alpha) - 1.0) * cos(M_PI / (4.0 * alpha));
} else {
double num = sin(M_PI * t_norm * (1.0 - alpha)) + (4.0 * alpha * t_norm) * cos(M_PI * t_norm * (1.0 + alpha));
double den = (M_PI * t_norm * (1.0 - (4.0 * alpha * t_norm) * (4.0 * alpha * t_norm)));
rrc_taps[k] = (1.0 / Ts_symbol) * num / den;
}
}
}
// Séquence d'impulsions de Dirac en base band
void generate_baseband_pulses(qam_system* qam, double complex* symbols, int L_symbols, double complex* s_pulses) {
int total_samples = L_symbols * qam->N;
memset(s_pulses, 0, total_samples * sizeof(double complex));
for (int k = 0; k < L_symbols; k++) {
int idx = k * qam->N;
s_pulses[idx] = symbols[k];
}
}
int main () { int main () {
// Initialisation du system qam // Initialisation du system qam
qam_system qam; qam_system qam;
@ -538,7 +573,7 @@ int main () {
demodulate_carrier(&qam, s_corrected + L * qam.N, s_bande_base, nb_symbols * qam.N); demodulate_carrier(&qam, s_corrected + L * qam.N, s_bande_base, nb_symbols * qam.N);
double complex* r_mm_out = malloc(sizeof(double complex) * nb_symbols); double complex* r_mm_out = malloc(sizeof(double complex) * nb_symbols);
double Kp_mm = 0.5; double Kp_mm = 0.6;
double Ki_mm = 0.01; double Ki_mm = 0.01;
FILE *fp_mm_error = fopen("mm_timing_error.dat", "w"); FILE *fp_mm_error = fopen("mm_timing_error.dat", "w");
muller_muller_sync(&qam, s_bande_base, nb_symbols, Kp_mm, Ki_mm, r_mm_out, fp_mm_error); muller_muller_sync(&qam, s_bande_base, nb_symbols, Kp_mm, Ki_mm, r_mm_out, fp_mm_error);
@ -571,6 +606,5 @@ int main () {
free(s_with_preamble); free(s_with_preamble);
free(texte_recup); free(texte_recup);
free_constellation(&qam); free_constellation(&qam);
return 0; return 0;
} }