mirror of
https://github.com/romanz/amodem.git
synced 2026-02-08 10:28:00 +08:00
refactor training
This commit is contained in:
14
recv.py
14
recv.py
@@ -10,11 +10,12 @@ log = logging.getLogger(__name__)
|
||||
import sigproc
|
||||
import loop
|
||||
import show
|
||||
import train
|
||||
from common import *
|
||||
|
||||
COHERENCE_THRESHOLD = 0.95
|
||||
|
||||
CARRIER_DURATION = 300
|
||||
CARRIER_DURATION = sum(train.prefix)
|
||||
CARRIER_THRESHOLD = int(0.95 * CARRIER_DURATION)
|
||||
|
||||
def detect(x, freq):
|
||||
@@ -52,24 +53,23 @@ def receive(x, freqs):
|
||||
|
||||
symbols = iter(lp)
|
||||
|
||||
prefix = [1]*300 + [0]*100
|
||||
S = take(symbols, carrier_index, len(prefix))
|
||||
S = take(symbols, carrier_index, len(train.prefix))
|
||||
y = np.abs(S)
|
||||
bits = np.round(y)
|
||||
|
||||
bits = np.array(bits, dtype=int)
|
||||
if all(bits != prefix):
|
||||
if all(bits != train.prefix):
|
||||
return None
|
||||
log.info('Prefix OK')
|
||||
|
||||
err = sigproc.drift( S[np.array(prefix, dtype=bool)] ) / (Tsym * Fc)
|
||||
err = sigproc.drift( S[np.array(train.prefix, dtype=bool)] ) / (Tsym * Fc)
|
||||
log.info('Frequency error: %.2f ppm', err * 1e6)
|
||||
lp.sampler.freq -= err
|
||||
|
||||
filters = {}
|
||||
|
||||
full_scale = len(freqs)
|
||||
training_bits = np.array(([1]*10 + [0]*10)*20 + [0]*100)
|
||||
training_bits = np.array(train.equalizer)
|
||||
expected = full_scale * training_bits
|
||||
for i, freq in enumerate(freqs):
|
||||
S = take(symbols, i, len(expected))
|
||||
@@ -88,7 +88,7 @@ def receive(x, freqs):
|
||||
|
||||
noise = y - expected
|
||||
Pnoise = sigproc.power(noise)
|
||||
log.debug('{:10.1f}Hz: Noise sigma={:.4f}, SNR={:.1f} dB'.format( freq, Pnoise**0.5, 10*np.log10(1/Pnoise) ))
|
||||
log.debug('{:10.1f} kHz: Noise sigma={:.4f}, SNR={:.1f} dB'.format( freq/1e3, Pnoise**0.5, 10*np.log10(1/Pnoise) ))
|
||||
|
||||
sz = int(np.ceil(np.sqrt(len(freqs))))
|
||||
|
||||
|
||||
17
send.py
17
send.py
@@ -8,6 +8,7 @@ logging.basicConfig(level=0, format='%(message)s')
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
import sigproc
|
||||
import train
|
||||
from common import *
|
||||
|
||||
class Symbol(object):
|
||||
@@ -22,15 +23,13 @@ def write(fd, sym, n=1):
|
||||
fd.write(dumps(sym, n))
|
||||
|
||||
def start(sig, c):
|
||||
write(sig, c*0, n=100)
|
||||
write(sig, c*1, n=300)
|
||||
write(sig, c*0, n=100)
|
||||
write(sig, c*0, n=50)
|
||||
write(sig, c*1, n=400)
|
||||
write(sig, c*0, n=50)
|
||||
|
||||
def train(sig, c):
|
||||
for i in range(20):
|
||||
write(sig, c*1, n=10)
|
||||
write(sig, c*0, n=10)
|
||||
write(sig, c*0, n=100)
|
||||
def training(sig, c):
|
||||
for b in train.equalizer:
|
||||
write(sig, c * b)
|
||||
|
||||
def modulate(sig, bits):
|
||||
symbols_iter = sigproc.modulator.encode(list(bits))
|
||||
@@ -52,7 +51,7 @@ if __name__ == '__main__':
|
||||
with open('tx.int16', 'wb') as fd:
|
||||
start(fd, sym.carrier[carrier_index])
|
||||
for c in sym.carrier:
|
||||
train(fd, c)
|
||||
training(fd, c)
|
||||
|
||||
bits = to_bits(ecc.encode(data))
|
||||
modulate(fd, bits)
|
||||
|
||||
Reference in New Issue
Block a user