optimize testing when no interpolation is needed

This commit is contained in:
Roman Zeyde
2014-08-23 18:55:27 +03:00
parent 93a94bb728
commit df4cd4cd3f
3 changed files with 25 additions and 17 deletions

View File

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

View File

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

View File

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