mirror of
https://github.com/romanz/amodem.git
synced 2026-02-06 08:38:06 +08:00
optimize testing when no interpolation is needed
This commit is contained in:
@@ -112,9 +112,8 @@ class QAM(object):
|
||||
|
||||
|
||||
class Demux(object):
|
||||
def __init__(self, src, freqs):
|
||||
interp = sampling.Interpolator()
|
||||
self.sampler = sampling.Sampler(src, interp)
|
||||
def __init__(self, src, freqs, sampler=None):
|
||||
self.sampler = sampling.Sampler(src) if sampler is None else sampler
|
||||
self.filters = [exp_iwt(-f, Nsym) / (0.5*Nsym) for f in freqs]
|
||||
self.filters = np.array(self.filters)
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ log = logging.getLogger(__name__)
|
||||
|
||||
from . import stream
|
||||
from . import dsp
|
||||
from . import sampling
|
||||
from . import train
|
||||
from . import common
|
||||
from . import config
|
||||
@@ -205,7 +206,8 @@ def demodulate(symbols, filters, freqs, sampler):
|
||||
|
||||
|
||||
def receive(signal, freqs, gain=1.0):
|
||||
symbols = dsp.Demux(signal, freqs)
|
||||
sampler = sampling.Sampler(signal, sampling.Interpolator())
|
||||
symbols = dsp.Demux(signal, freqs, sampler)
|
||||
symbols.sampler.gain = gain
|
||||
|
||||
freq_err, offset_err = receive_prefix(symbols)
|
||||
|
||||
@@ -3,6 +3,8 @@ import numpy as np
|
||||
import itertools
|
||||
import logging
|
||||
|
||||
from amodem import common
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -26,22 +28,27 @@ class Interpolator(object):
|
||||
|
||||
|
||||
class Sampler(object):
|
||||
def __init__(self, src, interp):
|
||||
def __init__(self, src, interp=None):
|
||||
self.freq = 1.0
|
||||
self.interp = interp
|
||||
self.resolution = self.interp.resolution
|
||||
self.filt = self.interp.filt
|
||||
self.width = self.interp.width
|
||||
|
||||
# TODO: explain indices arithmetic
|
||||
padding = [0.0] * self.interp.width
|
||||
self.src = itertools.chain(padding, src)
|
||||
self.offset = self.interp.width + 1
|
||||
self.buff = np.zeros(self.interp.coeff_len)
|
||||
self.index = 0
|
||||
self.gain = 1.0
|
||||
if interp is not None:
|
||||
self.interp = interp
|
||||
self.resolution = self.interp.resolution
|
||||
self.filt = self.interp.filt
|
||||
self.width = self.interp.width
|
||||
|
||||
def take(self, size):
|
||||
# TODO: explain indices arithmetic
|
||||
padding = [0.0] * self.interp.width
|
||||
self.src = itertools.chain(padding, src)
|
||||
self.offset = self.interp.width + 1
|
||||
self.buff = np.zeros(self.interp.coeff_len)
|
||||
self.index = 0
|
||||
self.take = self._take
|
||||
else:
|
||||
# skip interpolation
|
||||
self.take = lambda size: common.take(src, size)
|
||||
|
||||
def _take(self, size):
|
||||
frame = np.zeros(size)
|
||||
count = 0
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user