configuration should be specified explicitly

This commit is contained in:
Roman Zeyde
2014-12-02 22:18:24 +02:00
parent 6bf0d4eeda
commit ca14f0862b
8 changed files with 62 additions and 53 deletions

View File

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

View File

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

View File

@@ -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",

View File

@@ -1,5 +1,6 @@
from amodem import calib
from amodem import config
config = config.fastest()
from io import BytesIO

View File

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

View File

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

View File

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

View File

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