use ldpc::{ channel::{AwgnChannel, Channel}, code::{CodeTopology, GenerationMethod, LdpcCode, LdpcParams}, decoder::{build_decoder, DecoderConfig, DecoderMethod}, encoder::{build_encoder, EncodingMethod}, }; use rand::{Rng, SeedableRng}; fn main() -> ldpc::Result<()> { // ── 1. Générer le code ──────────────────────────────────────────────────── let params = LdpcParams { n: 100, k: 50, topology: CodeTopology::Regular { wc: 3, wr: 6 }, generation: GenerationMethod::MacKayNeal { max_attempts: 500 }, seed: Some(42), }; let mut code = LdpcCode::new(params)?; println!( "Code LDPC : n={}, k={}, taux={:.2}, girth={}", code.n(), code.k(), code.rate(), code.girth() ); // ── 2. Encodeur ─────────────────────────────────────────────────────────── let encoder = build_encoder(&mut code, EncodingMethod::Systematic)?; // ── 3. Canal ────────────────────────────────────────────────────────────── let channel = AwgnChannel::new(2.0, code.rate())?; // 2 dB Eb/N0 println!("Capacité AWGN ≈ {:.4} bits/utilisation", channel.capacity()); // ── 4. Décodeur ─────────────────────────────────────────────────────────── let decoder = build_decoder(&code, DecoderMethod::SumProduct, DecoderConfig::default()); // ── 5. Simulation ───────────────────────────────────────────────────────── let mut rng = rand::rngs::StdRng::seed_from_u64(123); let n_trials = 100; let mut errors = 0usize; for _ in 0..n_trials { // Message aléatoire let message: Vec = (0..code.k()).map(|_| rng.gen::() & 1).collect(); // Encodage let codeword = encoder.encode(&message)?; // Transmission AWGN let received_llr = channel.transmit(&codeword, &mut rng); // Décodage let result = decoder.decode(&received_llr); // Vérification if !result.is_success() { errors += 1; } } let ber = errors as f64 / n_trials as f64; println!("FER sur {} essais à 2dB : {:.2}%", n_trials, ber * 100.0); Ok(()) }