PLL modif
This commit is contained in:
26
QAM/qam.c
26
QAM/qam.c
@ -122,10 +122,10 @@ void demodulate(qam_system* qam, double complex* s, int nb_symbols, uint8_t* bit
|
||||
}
|
||||
|
||||
// PLL pour corriger le déphasage
|
||||
void pll_qam_symbol(qam_system* qam, double complex* symbols_rx, double complex* r_corr, int nb_symbols, double Kp, double Ki) {
|
||||
|
||||
void pll_qam_symbol(qam_system* qam, double complex* symbols_rx, double complex* r_corr, int nb_symbols, double Kp, double Ki, double alpha, FILE* fp_error) {
|
||||
double phase_est = 0.0;
|
||||
double integrator = 0.0;
|
||||
double filtered_error = 0.0;
|
||||
|
||||
int sm = (int)sqrt(qam->M);
|
||||
int N = qam->N;
|
||||
@ -134,7 +134,7 @@ void pll_qam_symbol(qam_system* qam, double complex* symbols_rx, double complex*
|
||||
double complex r_symbol = 0;
|
||||
for (int n = 0; n < N; n++) {
|
||||
int idx = k * N + n;
|
||||
r_symbol += symbols_rx[idx] * cexp(2.0 * -I * M_PI * qam->Fc * ((double)idx / qam->Fs));
|
||||
r_symbol += symbols_rx[idx] * cexp(-2.0 * I * M_PI * qam->Fc * ((double)idx / qam->Fs));
|
||||
}
|
||||
r_symbol /= N;
|
||||
|
||||
@ -154,8 +154,15 @@ void pll_qam_symbol(qam_system* qam, double complex* symbols_rx, double complex*
|
||||
|
||||
double error = carg(r_symbol * conj(closest));
|
||||
|
||||
integrator += Ki * error;
|
||||
phase_est += Kp * error + integrator;
|
||||
filtered_error = (1.0 - alpha) * filtered_error + alpha * error;
|
||||
integrator += Ki * filtered_error;
|
||||
phase_est += Kp * filtered_error + integrator;
|
||||
|
||||
// Écriture de l'erreur PLL dans le fichier
|
||||
if (fp_error) {
|
||||
fprintf(fp_error, "%d % .8f\n", k, 100 * filtered_error);
|
||||
fflush(fp_error);
|
||||
}
|
||||
|
||||
for (int n = 0; n < N; n++) {
|
||||
int idx = k * N + n;
|
||||
@ -265,7 +272,7 @@ int main () {
|
||||
double snr_dB = 5; // SNR en dB
|
||||
double snr_lin = pow(10.0, snr_dB / 10.0);
|
||||
double sigma = sqrt(signal_power / snr_lin);
|
||||
add_noise(s, total_samples, 20);
|
||||
add_noise(s, total_samples, 10);
|
||||
|
||||
|
||||
FILE *fp_ref = fopen("constellation_ref.dat", "w");
|
||||
@ -296,9 +303,12 @@ int main () {
|
||||
//memmove(s + offset_samples, s, (total_samples - offset_samples) * sizeof(double complex));
|
||||
|
||||
double complex* r_corr = malloc(sizeof(double complex) * total_samples);
|
||||
double Kp = 0.25;
|
||||
double Kp = 0.2;
|
||||
double Ki = 0.02;
|
||||
pll_qam_symbol(&qam, s, r_corr, nb_symbols, Kp, Ki);
|
||||
double alpha = 0.1;
|
||||
FILE* fp_error = fopen("pll_error.dat", "w");
|
||||
pll_qam_symbol(&qam, s, r_corr, nb_symbols, Kp, Ki, alpha, fp_error);
|
||||
fclose(fp_error);
|
||||
|
||||
// Démodulation
|
||||
uint8_t* output_bits = (uint8_t*)malloc(nb_bits * sizeof(uint8_t));
|
||||
|
||||
Reference in New Issue
Block a user