Implement calculation of L, P, and P1

This commit is contained in:
Christopher Berner 2019-01-23 22:30:19 -08:00
parent 12ac0988d9
commit 0f12cf6182
3 changed files with 31 additions and 1 deletions

@ -6,10 +6,10 @@ version = "0.0.0"
authors = ["Christopher Berner <christopherberner@gmail.com>"]
[dependencies]
primal = "0.2"
[dev-dependencies]
criterion = "0.2"
primal = "0.2"
rand = "0.6"
[[bench]]

@ -1,6 +1,7 @@
use base::EncodingPacket;
use PayloadId;
use systematic_constants::extended_source_block_symbols;
use systematic_constants::num_pi_symbols;
pub struct SourceBlockEncoder {
source_block_id: u8,
@ -29,6 +30,7 @@ impl SourceBlockEncoder {
for i in 0..((extended_source_symbols - self.num_source_symbols())*self.symbol_size as u32) {
extended_data.push(0);
}
}
pub fn all_source_packets(&self) -> Vec<EncodingPacket> {

@ -541,6 +541,34 @@ pub fn num_lt_symbols(source_block_symbols: u32) -> u32 {
panic!(); // unreachable
}
// Calculates, L, the number of intermediate symbols, for a given number of source block symbols
// See section 5.3.3.3
pub fn num_intermediate_symbols(source_block_symbols: u32) -> u32 {
extended_source_block_symbols(source_block_symbols) +
num_ldpc_symbols(source_block_symbols) +
num_hdpc_symbols(source_block_symbols)
}
// Calculates, P, the number of PI symbols, for a given number of source block symbols
// See section 5.3.3.3
pub fn num_pi_symbols(source_block_symbols: u32) -> u32 {
num_intermediate_symbols(source_block_symbols) - num_lt_symbols(source_block_symbols)
}
// Calculates P1, smallest prime greater than P. See 5.3.3.3
pub fn calculate_p1(source_block_symbols: u32) -> u32 {
let mut p1 = num_pi_symbols(source_block_symbols);
while !primal::is_prime(p1 as u64) {
if p1 % 2 == 0 {
p1 += 1;
}
else {
p1 += 2;
}
}
p1
}
#[cfg(test)]
mod tests {
use systematic_constants::MAX_SOURCE_SYMBOLS_PER_BLOCK;