simulation: simulate with RS-coding

This commit is contained in:
2025-12-03 21:51:23 +01:00
parent 3872ff5221
commit 1695944d82
2 changed files with 82 additions and 19 deletions

View File

@@ -2,20 +2,71 @@
import asyncio import asyncio
from time import sleep from time import sleep
import framing
from header import Onbeat_Header
PACKET_LEN=128 PACKET_LEN=255*4 + 32
DATA_LEN=223*4
HEADER_LEN=32
async def tcp_client(): async def tcp_client(file_2_send: str, callsign: str, rs_coding: bool = True):
port = 50001 port = 50001
reader, writer = await asyncio.open_connection( reader, writer = await asyncio.open_connection(
'127.0.0.1', port) '127.0.0.1', port)
with open("loremipsum", "rb") as file_to_send: with open(file_2_send, "rb") as file_to_send:
while message := file_to_send.read(PACKET_LEN): seq = 0
writer.write(message) sent: list[list[int]] = []
sleep(1) while message := file_to_send.read(DATA_LEN if rs_coding == True else (PACKET_LEN - HEADER_LEN)):
sent.append([i for i in message])
frame = bytes(framing.encode_packet([i for i in message], callsign, seq, rs_coding))
writer.write(frame)
seq += 1
sleep(0.1)
else:
frame = bytes(framing.encode_packet([], callsign, seq, rs_coding))
for _ in range(0,16):
writer.write(frame)
sleep(0.1)
sent.append([])
output: list[tuple[Onbeat_Header, list[int]]] = []
packet_loss = 0
while message := await reader.read(PACKET_LEN): while message := await reader.read(PACKET_LEN):
print(f"Got: {message.decode()}\n\n") try:
received = framing.decode_packet([i for i in message])
output.append(received)
if received[0].pkt_len == 0:
break
except Exception as e:
packet_loss += 1
print(e)
asyncio.run(tcp_client()) return sent, output
rs_coding = False
filename = "loremipsum"
sent, output = asyncio.run(tcp_client(filename, "HA5PLS", rs_coding))
output.sort(key=lambda packet: packet[0].pkt_sequence_id)
output.pop()
def hamming_dist(msg:int, got:int):
return bin(msg ^ got).count('1')
total_errors = sum([sum([hamming_dist(msg, got) for msg, got in zip(sent[pkt[0].pkt_sequence_id], pkt[1])]) for pkt in output])
rcv_len = sum([pkt[0].pkt_len for pkt in output]) * 8
ber = total_errors/rcv_len
print(f"Total errors: {total_errors}, BER: {ber}")
# file : bytes = b''
# filesize = 0
# for pkt in output:
# payload = bytes(pkt[1])
# file += payload
# filesize += pkt[0].pkt_len
# print(file.decode(errors="ignore"))
# print(f"Lost {packet_loss} packets during the transfer, filesize: {filesize}")

View File

@@ -37,7 +37,7 @@ blocks:
id: variable id: variable
parameters: parameters:
comment: '' comment: ''
value: '10' value: '2'
states: states:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
@@ -102,7 +102,7 @@ blocks:
label: '' label: ''
short_id: '' short_id: ''
type: eng_float type: eng_float
value: '100' value: '3'
states: states:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
@@ -121,7 +121,7 @@ blocks:
comment: '' comment: ''
maxoutbuf: '0' maxoutbuf: '0'
minoutbuf: '0' minoutbuf: '0'
roc_tolerance: '1' roc_tolerance: '0.8'
samp_rate: samp_rate samp_rate: samp_rate
symbol_map: symbol_map symbol_map: symbol_map
syncword: syncword syncword: syncword
@@ -140,7 +140,6 @@ blocks:
affinity: '' affinity: ''
alias: '' alias: ''
comment: '' comment: ''
data_len: data_len
maxoutbuf: '0' maxoutbuf: '0'
minoutbuf: '0' minoutbuf: '0'
preamble: '[0x33 for i in range(0, 128*2, 8)]' preamble: '[0x33 for i in range(0, 128*2, 8)]'
@@ -149,7 +148,7 @@ blocks:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
bus_structure: null bus_structure: null
coordinate: [464, 256.0] coordinate: [480, 264.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: blocks_tag_gate_0 - name: blocks_tag_gate_0
@@ -168,7 +167,7 @@ blocks:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
bus_structure: null bus_structure: null
coordinate: [752, 264.0] coordinate: [744, 280.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: blocks_throttle2_0 - name: blocks_throttle2_0
@@ -189,7 +188,7 @@ blocks:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
bus_structure: null bus_structure: null
coordinate: [1136, 264.0] coordinate: [1144, 280.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: channels_channel_model_0 - name: channels_channel_model_0
@@ -203,14 +202,14 @@ blocks:
freq_offset: freq_offset freq_offset: freq_offset
maxoutbuf: '0' maxoutbuf: '0'
minoutbuf: '0' minoutbuf: '0'
noise_voltage: (1/EbN0*(1+RRC_ALPHA)/2)**0.5 noise_voltage: 1.0/sqrt(2* 10**(float(EbN0) / 10)) * sqrt(OVERSAMPLING/2)
seed: '0' seed: '0'
taps: '1.0' taps: '1.0'
states: states:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
bus_structure: null bus_structure: null
coordinate: [928, 232.0] coordinate: [928, 248.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: data_len - name: data_len
@@ -222,7 +221,7 @@ blocks:
label: '' label: ''
short_id: '' short_id: ''
type: intx type: intx
value: '128' value: 255*4 + 32
states: states:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
@@ -247,6 +246,19 @@ blocks:
coordinate: [960, 136.0] coordinate: [960, 136.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: import_0
id: import
parameters:
alias: ''
comment: ''
imports: from math import log10, log2, sqrt
states:
bus_sink: false
bus_source: false
bus_structure: null
coordinate: [968, 24.0]
rotation: 0
state: enabled
- name: network_socket_pdu_1 - name: network_socket_pdu_1
id: network_socket_pdu id: network_socket_pdu
parameters: parameters:
@@ -647,7 +659,7 @@ blocks:
bus_sink: false bus_sink: false
bus_source: false bus_source: false
bus_structure: null bus_structure: null
coordinate: [1320, 272.0] coordinate: [1320, 288.0]
rotation: 0 rotation: 0
state: enabled state: enabled
- name: virtual_source_0 - name: virtual_source_0