clear main
This commit is contained in:
@ -1,74 +1,13 @@
|
||||
mod analysis;
|
||||
mod channel;
|
||||
mod code;
|
||||
mod construction;
|
||||
mod decoder;
|
||||
mod encoder;
|
||||
mod matrix;
|
||||
mod simulation;
|
||||
mod tanner;
|
||||
|
||||
use code::LdpcCode;
|
||||
use construction::random::generate_random_h;
|
||||
use decoder::bit_flip::BitFlipDecoder;
|
||||
use encoder::dense::DenseEncoder;
|
||||
|
||||
fn main() {
|
||||
// TODO : Changer la logique pour trouver k => calculer n selon la longueur du message k (en
|
||||
// rapport des poids) n = (k * w_r) / (w_r - w_c)
|
||||
println!("LDPC\n");
|
||||
|
||||
let n = 12;
|
||||
let m = 6;
|
||||
let wc = 2;
|
||||
let wr = 4;
|
||||
|
||||
let mut h_matrix = generate_random_h(m, n, wc, wr);
|
||||
println!("H aléatoire {m}x{n} :");
|
||||
h_matrix.print();
|
||||
|
||||
let ldpc = LdpcCode::new(h_matrix.clone());
|
||||
println!("\nLDPC instancié");
|
||||
|
||||
println!("Extraction de G");
|
||||
let encoder = DenseEncoder::new(&ldpc);
|
||||
|
||||
println!("\n-> Matrcie H après Gauss-Jordan avec inversion de colonne de la forme [I | A]");
|
||||
encoder.h_reduced.print();
|
||||
|
||||
println!("G {}x{}", encoder.k, encoder.n);
|
||||
encoder.g_matrix.print();
|
||||
|
||||
let message = vec![1; encoder.k];
|
||||
let codeword = encoder.encode(&message);
|
||||
|
||||
println!("\nMessage u : {:?}", message);
|
||||
println!("\nCodeword s : {:?}", codeword);
|
||||
|
||||
let is_valid = (0..m).all(|r| {
|
||||
let sum = codeword
|
||||
.iter()
|
||||
.enumerate()
|
||||
.fold(0, |acc, (c, &bit)| acc ^ (bit & h_matrix.get(r, c)));
|
||||
sum == 0
|
||||
});
|
||||
|
||||
println!("\n{}", if is_valid { "Vrai" } else { "Faux" });
|
||||
|
||||
println!("\nCorrection (bit-flipping)");
|
||||
|
||||
let decoder = BitFlipDecoder::new(&ldpc);
|
||||
let max_iter = 50;
|
||||
let receiver_codeword = codeword.clone();
|
||||
|
||||
match decoder.decode(&receiver_codeword, max_iter) {
|
||||
Some(corrected_codeword) => {
|
||||
if corrected_codeword == codeword {
|
||||
println!("Code reconstrui");
|
||||
} else {
|
||||
println!("Convergence mais mauvais codeword")
|
||||
}
|
||||
println!("Message original : {:?}", codeword);
|
||||
println!("Message original : {:?}", corrected_codeword);
|
||||
}
|
||||
None => println!("Pas de convergence..."),
|
||||
}
|
||||
simulation::run_simulation(6, 2, 4, 0.1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user