Repair project layout and fix Lab024B spectrum detection

This commit is contained in:
LittleSam129
2026-07-21 13:51:41 +03:00
parent acf7a76546
commit 1ff04b12b9
108 changed files with 8270 additions and 8221 deletions

72
tools/virtual_channel.py Normal file
View 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