mirror of
https://github.com/romanz/amodem.git
synced 2026-03-24 11:22:00 +08:00
fix carriers initialization
make sure tested process won't exit before killing it
This commit is contained in:
@@ -137,6 +137,10 @@ class MODEM(object):
|
||||
self.freqs = config.frequencies
|
||||
self.bits_per_baud = self.qam.bits_per_symbol * len(self.freqs)
|
||||
self.modem_bps = self.baud * self.bits_per_baud
|
||||
self.carriers = np.array([
|
||||
np.exp(2j * np.pi * freq * np.arange(0, Nsym) * Ts)
|
||||
for freq in self.freqs
|
||||
])
|
||||
|
||||
|
||||
def power(x):
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import numpy as np
|
||||
from numpy.linalg import lstsq
|
||||
|
||||
from amodem import dsp, config, send
|
||||
from amodem import dsp, config
|
||||
|
||||
import itertools
|
||||
import random
|
||||
|
||||
_constellation = [1, 1j, -1, -1j]
|
||||
modem = dsp.MODEM(config)
|
||||
|
||||
|
||||
def train_symbols(length, seed=0, Nfreq=config.Nfreq):
|
||||
@@ -15,7 +16,7 @@ def train_symbols(length, seed=0, Nfreq=config.Nfreq):
|
||||
return np.array([choose() for i in range(length)])
|
||||
|
||||
|
||||
def modulator(symbols, carriers=send.sym.carrier):
|
||||
def modulator(symbols, carriers=modem.carriers):
|
||||
gain = 1.0 / len(carriers)
|
||||
result = []
|
||||
for s in symbols:
|
||||
@@ -34,7 +35,7 @@ def demodulator(signal, size):
|
||||
def equalize(signal, symbols, order):
|
||||
Nsym = config.Nsym
|
||||
Nfreq = config.Nfreq
|
||||
carriers = send.sym.carrier
|
||||
carriers = modem.carriers
|
||||
|
||||
assert symbols.shape[1] == Nfreq
|
||||
length = symbols.shape[0]
|
||||
|
||||
@@ -17,14 +17,6 @@ from . import ecc
|
||||
modem = dsp.MODEM(config)
|
||||
|
||||
|
||||
class Symbol(object):
|
||||
def __init__(self):
|
||||
t = np.arange(0, config.Nsym) * config.Ts
|
||||
self.carrier = [np.exp(2j * np.pi * F * t) for F in modem.freqs]
|
||||
|
||||
sym = Symbol()
|
||||
|
||||
|
||||
class Writer(object):
|
||||
def __init__(self):
|
||||
self.last = time.time()
|
||||
@@ -55,9 +47,9 @@ def training(fd, c):
|
||||
def modulate(fd, bits):
|
||||
symbols_iter = modem.qam.encode(bits)
|
||||
symbols_iter = itertools.chain(symbols_iter, itertools.repeat(0))
|
||||
carriers = np.array(sym.carrier) / len(sym.carrier)
|
||||
carriers = modem.carriers / config.Nfreq
|
||||
while True:
|
||||
symbols = itertools.islice(symbols_iter, len(sym.carrier))
|
||||
symbols = itertools.islice(symbols_iter, config.Nfreq)
|
||||
symbols = np.array(list(symbols))
|
||||
writer.write(fd, np.dot(symbols, carriers))
|
||||
if all(symbols == 0): # EOF marker
|
||||
@@ -70,8 +62,8 @@ def main(args):
|
||||
# padding audio with silence
|
||||
writer.write(args.output, np.zeros(int(config.Fs * args.silence_start)))
|
||||
|
||||
start(args.output, sym.carrier[config.carrier_index])
|
||||
for c in sym.carrier:
|
||||
start(args.output, modem.carriers[config.carrier_index])
|
||||
for c in modem.carriers:
|
||||
training(args.output, c)
|
||||
training_size = writer.offset
|
||||
log.info('%.3f seconds of training audio',
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from numpy.linalg import norm
|
||||
import numpy as np
|
||||
|
||||
from amodem import train, dsp, config, send
|
||||
from amodem import train, dsp, config
|
||||
from amodem import equalizer
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ def test_commutation():
|
||||
def test_modem():
|
||||
L = 1000
|
||||
sent = equalizer.train_symbols(L)
|
||||
gain = len(send.sym.carrier)
|
||||
gain = config.Nfreq
|
||||
x = equalizer.modulator(sent) * gain
|
||||
received = equalizer.demodulator(x, L)
|
||||
assert_approx(sent, received)
|
||||
|
||||
Reference in New Issue
Block a user