mirror of
https://github.com/romanz/amodem.git
synced 2026-02-24 16:18:12 +08:00
optimize sampler to apply demuxing at symbols rate
This commit is contained in:
@@ -43,25 +43,25 @@ class Sampler(object):
|
||||
self.index = 0
|
||||
self.gain = 1.0
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
def take(self, size):
|
||||
frame = np.zeros(size)
|
||||
|
||||
def next(self):
|
||||
offset = self.offset
|
||||
# offset = k + (j / self.resolution)
|
||||
k = int(offset) # integer part
|
||||
j = int((offset - k) * self.resolution) # fractional part
|
||||
coeffs = self.filt[j]
|
||||
end = k + self.width
|
||||
while self.index < end:
|
||||
self.buff[:-1] = self.buff[1:]
|
||||
self.buff[-1] = next(self.src) # throws StopIteration
|
||||
self.index += 1
|
||||
for frame_index in range(size):
|
||||
offset = self.offset
|
||||
# offset = k + (j / self.resolution)
|
||||
k = int(offset) # integer part
|
||||
j = int((offset - k) * self.resolution) # fractional part
|
||||
coeffs = self.filt[j]
|
||||
end = k + self.width
|
||||
while self.index < end:
|
||||
self.buff[:-1] = self.buff[1:]
|
||||
self.buff[-1] = next(self.src) # throws StopIteration
|
||||
self.index += 1
|
||||
|
||||
self.offset += self.freq
|
||||
return np.dot(coeffs, self.buff) * self.gain
|
||||
self.offset += self.freq
|
||||
frame[frame_index] = np.dot(coeffs, self.buff) * self.gain
|
||||
|
||||
__next__ = next
|
||||
return frame
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -73,7 +73,7 @@ class Demux(object):
|
||||
return self
|
||||
|
||||
def next(self):
|
||||
frame = common.take(self.sampler, Nsym)
|
||||
frame = self.sampler.take(size=Nsym)
|
||||
return np.dot(self.filters, frame)
|
||||
|
||||
__next__ = next
|
||||
|
||||
@@ -4,8 +4,8 @@ import numpy as np
|
||||
|
||||
def test_resample():
|
||||
x = np.arange(300)
|
||||
s = sampling.Sampler(x)
|
||||
y = np.array(list(s))
|
||||
s = sampling.Sampler(x, interp=sampling.Interpolator())
|
||||
y = s.take(len(x) - s.interp.width - 1)
|
||||
|
||||
err = x[1:len(y)+1] - y
|
||||
assert np.max(np.abs(err)) < 1e-10
|
||||
|
||||
Reference in New Issue
Block a user