Repair project layout and fix Lab024B spectrum detection
This commit is contained in:
72
tools/virtual_channel.py
Normal file
72
tools/virtual_channel.py
Normal file
@@ -0,0 +1,72 @@
|
||||
"""
|
||||
Виртуальный канал связи SDR Rover Link.
|
||||
|
||||
Имитирует:
|
||||
1. Полную потерю пакета.
|
||||
2. Случайное изменение отдельных битов.
|
||||
"""
|
||||
|
||||
import random
|
||||
|
||||
|
||||
def transmit(
|
||||
packet: bytes,
|
||||
drop_probability: float,
|
||||
bit_error_probability: float,
|
||||
random_generator: random.Random,
|
||||
):
|
||||
"""
|
||||
Передать пакет через виртуальный канал.
|
||||
|
||||
Возвращает:
|
||||
received_packet:
|
||||
Пакет после прохождения канала.
|
||||
None означает полную потерю пакета.
|
||||
|
||||
flipped_bits:
|
||||
Количество изменённых битов.
|
||||
"""
|
||||
|
||||
if not isinstance(packet, (bytes, bytearray)):
|
||||
raise TypeError(
|
||||
"packet должен иметь тип bytes или bytearray"
|
||||
)
|
||||
|
||||
if not 0.0 <= drop_probability <= 1.0:
|
||||
raise ValueError(
|
||||
"drop_probability должен находиться "
|
||||
"в диапазоне 0.0...1.0"
|
||||
)
|
||||
|
||||
if not 0.0 <= bit_error_probability <= 1.0:
|
||||
raise ValueError(
|
||||
"bit_error_probability должен находиться "
|
||||
"в диапазоне 0.0...1.0"
|
||||
)
|
||||
|
||||
# Решаем, потерян ли пакет полностью.
|
||||
if random_generator.random() < drop_probability:
|
||||
return None, 0
|
||||
|
||||
corrupted_packet = bytearray(packet)
|
||||
flipped_bits = 0
|
||||
|
||||
# Перебираем каждый байт.
|
||||
for byte_index in range(len(corrupted_packet)):
|
||||
|
||||
# В каждом байте восемь битов.
|
||||
for bit_index in range(8):
|
||||
|
||||
if (
|
||||
random_generator.random()
|
||||
< bit_error_probability
|
||||
):
|
||||
bit_mask = 1 << bit_index
|
||||
|
||||
# XOR меняет выбранный бит:
|
||||
# 0 → 1 или 1 → 0.
|
||||
corrupted_packet[byte_index] ^= bit_mask
|
||||
|
||||
flipped_bits += 1
|
||||
|
||||
return bytes(corrupted_packet), flipped_bits
|
||||
Reference in New Issue
Block a user