mirror of
https://github.com/romanz/amodem.git
synced 2026-03-18 07:36:02 +08:00
configuration should be specified explicitly
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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)]
|
||||
|
||||
14
setup.py
14
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",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from amodem import calib
|
||||
from amodem import config
|
||||
config = config.fastest()
|
||||
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user