refactor training

This commit is contained in:
Roman Zeyde
2014-07-05 18:23:53 +03:00
parent e2bba5c298
commit 443217a51d
3 changed files with 17 additions and 16 deletions

14
recv.py
View File

@@ -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
View File

@@ -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)

2
train.py Normal file
View File

@@ -0,0 +1,2 @@
prefix = [1]*400 + [0]*50
equalizer = ([1]*10 + [0]*10)*10 + [0]*20