Repository navigation
Expand file tree
/
Copy pathsend.py
More file actions
111 lines (95 loc) · 4.13 KB
/
Copy pathsend.py
File metadata and controls
111 lines (95 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
"""send.py - zakodira sliko v signal (preamble + glava + payload).
Payload pipeline: slika -> (format/kompresija) -> [FEC] -> modulacija
Uporaba:
python send.py images/test.png out.wav
python send.py images/test.png --play --format 1
python send.py images/test.png out.wav --dct 50
python send.py images/test.png out.wav --dct-color 50 --fec 32
Formati: 0=RGB888 1=GRAY8 2=RGB332 3=RGB565 4=GRAY4 5=BW1
Kompresija: --compress (RLE), --dct Q (DCT gray), --dct-color Q (DCT barvni)
FEC: --fec N (N ECC bajtov, popravi do N/2 napak; npr. --fec 32)
"""
import sys
import numpy as np
from modem.image_codec import load_image, pack
from modem.encoder import encode
from modem.sync import prepend_preamble
from modem.audio_io import save_wav, play
from modem.header import make_header
from modem.compress import rle_encode
from modem.dct_codec import compress as dct_compress
from modem.dct_codec import compress_color as dct_compress_color
from modem.fec import fec_encode
from modem.specplot import save_spectrogram
HEADER_NSYM = 8 # FEC za glavo
from modem.protocol import HEADER_PARALLEL, FMT_NAMES
def main():
args = sys.argv[1:]
if len(args) < 2:
print("Uporaba: python send.py <slika> <out.wav | --play> "
"[--format F] [--compress] [--dct Q] [--dct-color Q] [--fec N]")
sys.exit(1)
image_path, target = args[0], args[1]
parallel = int(args[args.index("--parallel") + 1]) if "--parallel" in args else 1
fmt = int(args[args.index("--format") + 1]) if "--format" in args else 0
fec_nsym = int(args[args.index("--fec") + 1]) if "--fec" in args else 0
use_rle = "--compress" in args
spec_path = args[args.index("--spec") + 1] if "--spec" in args else None
spec_show = "--show-spec" in args
use_dct = "--dct" in args
use_dct_color = "--dct-color" in args
dct_q = 50
if use_dct:
dct_q = int(args[args.index("--dct") + 1])
if use_dct_color:
dct_q = int(args[args.index("--dct-color") + 1])
arr = load_image(image_path)
h, w = arr.shape[0], arr.shape[1]
if use_dct_color:
payload = dct_compress_color(arr, dct_q)
compress_mode = 3
raw = w * h * 3
print(f"barvni DCT Q={dct_q}: {raw} -> {len(payload)} B ({raw/len(payload):.1f}x)")
elif use_dct:
gray = (0.299*arr[:,:,0] + 0.587*arr[:,:,1] + 0.114*arr[:,:,2]).astype("uint8")
payload = dct_compress(gray, dct_q)
compress_mode = 2
raw = w * h
print(f"DCT grayscale Q={dct_q}: {raw} -> {len(payload)} B ({raw/len(payload):.1f}x)")
elif use_rle:
rawb = pack(arr, fmt)
payload = rle_encode(rawb)
if len(payload) >= len(rawb):
payload, compress_mode = rawb, 0
print("RLE ne pomaga, surovo")
else:
compress_mode = 1
print(f"RLE: {len(rawb)} -> {len(payload)} B ({len(rawb)/len(payload):.2f}x)")
else:
payload = pack(arr, fmt)
compress_mode = 0
if fec_nsym > 0:
before = len(payload)
payload = fec_encode(payload, fec_nsym)
print(f"FEC nsym={fec_nsym}: {before} -> {len(payload)} B "
f"(+{len(payload)-before} ECC, popravi do {fec_nsym//2}/blok)")
print(f"Slika {w}x{h}, {FMT_NAMES[fmt]}, payload {len(payload)} B, parallel={parallel}")
header = make_header(w, h, fmt, parallel, compress_mode, fec_nsym, len(payload))
header_protected = fec_encode(header, HEADER_NSYM) # zaščiti glavo s FEC
sig_h = encode(header_protected, HEADER_PARALLEL, normalize=False)
sig_d = encode(payload, parallel, normalize=False)
body = np.concatenate([sig_h, sig_d])
body = body / np.max(np.abs(body))
tx = prepend_preamble(body)
print(f"Signal: {len(tx)/44100:.1f} s")
if spec_path or spec_show:
save_spectrogram(tx, spec_path or "spec_send.png",
title="poslano (send)", show=spec_show)
if not spec_show:
print(f"Spektrogram poslanega: {spec_path}")
if target == "--play":
print("Predvajam..."); play(tx); print("Konec.")
else:
save_wav(tx, target); print(f"Shranjeno v {target}")
if __name__ == "__main__":
main()