From ca14f0862b0884db011f953ed30e3c9c13510dd4 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Tue, 2 Dec 2014 22:18:24 +0200 Subject: [PATCH] configuration should be specified explicitly --- amodem-cli | 6 ++- amodem/config.py | 83 +++++++++++++++++++++++------------------ setup.py | 14 ++----- tests/test_calib.py | 1 + tests/test_dsp.py | 3 +- tests/test_equalizer.py | 4 +- tests/test_recv.py | 3 +- tests/test_whole.py | 1 + 8 files changed, 62 insertions(+), 53 deletions(-) diff --git a/amodem-cli b/amodem-cli index b961385..0dbfa42 100755 --- a/amodem-cli +++ b/amodem-cli @@ -19,7 +19,7 @@ import logging log = logging.getLogger('__name__') -from amodem import config +from amodem.config import bitrates from amodem import recv from amodem import send from amodem import audio @@ -27,6 +27,10 @@ from amodem import calib null = open('/dev/null', 'wb') +import os +bitrate = os.environ.get('BITRATE', 1) +config = bitrates.get(int(bitrate)) + def FileType(mode, process=None): def opener(fname): diff --git a/amodem/config.py b/amodem/config.py index f34430e..02a4b32 100644 --- a/amodem/config.py +++ b/amodem/config.py @@ -1,42 +1,51 @@ -Fs = 32000.0 # sampling frequency [Hz] -Tsym = 0.001 # symbol duration [seconds] -Nfreq = 8 # number of frequencies used -Npoints = 64 -F0 = 1e3 - -# Update default configuration from environment variables -settings = {k: v for k, v in locals().items() if not k.startswith('_')} - -_prefix = 'AMODEM_' -import os -for k in settings.keys(): - v = settings[k] - settings[k] = type(v)(os.environ.get(_prefix + k, v)) -locals().update(settings) - import numpy as np -Ts = 1.0 / Fs -Fsym = 1 / Tsym -frequencies = F0 + np.arange(Nfreq) * Fsym -carrier_index = 0 -Fc = frequencies[carrier_index] -Tc = 1.0 / Fc -Nsym = int(Tsym / Ts) -baud = int(1 / Tsym) +class Configuration(object): + Fs = 32000.0 # sampling frequency [Hz] + Tsym = 0.001 # symbol duration [seconds] + Nfreq = 8 # number of frequencies used + Npoints = 64 + F0 = 1e3 -bits_per_symbol = np.log2(Npoints) -assert int(bits_per_symbol) == bits_per_symbol -bits_per_baud = bits_per_symbol * Nfreq -modem_bps = baud * bits_per_baud -carriers = np.array([ - np.exp(2j * np.pi * f * np.arange(0, Nsym) * Ts) for f in frequencies -]) + def __init__(self, **kwargs): + self.__dict__.update(**kwargs) -# Hexagonal symbol constellation (optimal "sphere packing") -Nx = 2 ** int(np.ceil(bits_per_symbol / 2)) -Ny = Npoints // Nx -symbols = np.array([complex(x, y) for x in range(Nx) for y in range(Ny)]) -symbols = symbols - symbols[-1]/2 -symbols = symbols / np.max(np.abs(symbols)) + self.Ts = 1.0 / self.Fs + self.Fsym = 1 / self.Tsym + self.frequencies = self.F0 + np.arange(self.Nfreq) * self.Fsym + self.carrier_index = 0 + self.Fc = self.frequencies[self.carrier_index] + + self.Nsym = int(self.Tsym / self.Ts) + self.baud = int(1.0 / self.Tsym) + + bits_per_symbol = np.log2(self.Npoints) + assert int(bits_per_symbol) == bits_per_symbol + self.bits_per_baud = bits_per_symbol * self.Nfreq + self.modem_bps = self.baud * self.bits_per_baud + self.carriers = np.array([ + np.exp(2j * np.pi * f * np.arange(0, self.Nsym) * self.Ts) + for f in self.frequencies + ]) + + # QAM constellation + Nx = 2 ** int(np.ceil(bits_per_symbol / 2)) + Ny = self.Npoints // Nx + symbols = np.array([complex(x, y) for x in range(Nx) for y in range(Ny)]) + symbols = symbols - symbols[-1]/2 + self.symbols = symbols / np.max(np.abs(symbols)) + +# MODEM configurations for various bitrates [kbps] +bitrates = { + 1: Configuration(F0=8e3, Npoints=2, Nfreq=1), + 2: Configuration(F0=8e3, Npoints=4, Nfreq=1), + 4: Configuration(F0=8e3, Npoints=16, Nfreq=1), + 8: Configuration(F0=8e3, Npoints=16, Nfreq=2), + 16: Configuration(F0=6e3, Npoints=16, Nfreq=4), + 32: Configuration(F0=3e3, Npoints=16, Nfreq=8), + 48: Configuration(F0=3e3, Npoints=64, Nfreq=8), +} + +fastest = lambda: bitrates[max(bitrates)] +slowest = lambda: bitrates[min(bitrates)] diff --git a/setup.py b/setup.py index 6f93617..67ae89c 100644 --- a/setup.py +++ b/setup.py @@ -1,14 +1,5 @@ #!/usr/bin/env python -import os -import sys - -try: - from setuptools import setup -except ImportError: - from distutils.core import setup - -pwd = os.path.dirname(__file__) - +from setuptools import setup from setuptools.command.test import test as TestCommand @@ -19,12 +10,13 @@ class PyTest(TestCommand): self.test_suite = True def run_tests(self): + import sys import pytest sys.exit(pytest.main(['tests'])) setup( name="amodem", - version="1.3", + version="1.4", description="Audio Modem Communication Library", author="Roman Zeyde", author_email="roman.zeyde@gmail.com", diff --git a/tests/test_calib.py b/tests/test_calib.py index 1848036..0265087 100644 --- a/tests/test_calib.py +++ b/tests/test_calib.py @@ -1,5 +1,6 @@ from amodem import calib from amodem import config +config = config.fastest() from io import BytesIO diff --git a/tests/test_dsp.py b/tests/test_dsp.py index e3145e7..c9a1989 100644 --- a/tests/test_dsp.py +++ b/tests/test_dsp.py @@ -2,8 +2,9 @@ import numpy as np from numpy.linalg import norm from amodem import dsp -from amodem import config from amodem import sampling +from amodem import config +config = config.fastest() import random import itertools diff --git a/tests/test_equalizer.py b/tests/test_equalizer.py index b7148a3..d62a22b 100644 --- a/tests/test_equalizer.py +++ b/tests/test_equalizer.py @@ -3,9 +3,9 @@ from numpy.random import RandomState import numpy as np from amodem import dsp -from amodem import config from amodem import equalizer - +from amodem import config +config = config.fastest() def assert_approx(x, y, e=1e-12): assert norm(x - y) < e * norm(x) diff --git a/tests/test_recv.py b/tests/test_recv.py index 08a9f11..4f66cb8 100644 --- a/tests/test_recv.py +++ b/tests/test_recv.py @@ -1,10 +1,11 @@ import numpy as np -from amodem import config from amodem import dsp from amodem import recv from amodem import train from amodem import sampling +from amodem import config +config = config.fastest() def test_detect(): diff --git a/tests/test_whole.py b/tests/test_whole.py index 02bc7aa..15eee9e 100644 --- a/tests/test_whole.py +++ b/tests/test_whole.py @@ -9,6 +9,7 @@ from amodem import common from amodem import dsp from amodem import sampling from amodem import config +config = config.fastest() import logging logging.basicConfig(level=logging.DEBUG,