add some first structure for DAB decoding
This commit is contained in:
parent
625afcfbbb
commit
5ddd719364
|
|
@ -0,0 +1,21 @@
|
||||||
|
from csdr.chain.demodulator import BaseDemodulatorChain, FixedIfSampleRateChain, FixedAudioRateChain, HdAudio
|
||||||
|
from csdreti.modules import EtiDecoder
|
||||||
|
from owrx.dab.dablin import DablinModule
|
||||||
|
from pycsdr.modules import Downmix
|
||||||
|
from pycsdr.types import Format
|
||||||
|
|
||||||
|
|
||||||
|
class Dablin(BaseDemodulatorChain, FixedIfSampleRateChain, FixedAudioRateChain, HdAudio):
|
||||||
|
def __init__(self):
|
||||||
|
workers = [
|
||||||
|
EtiDecoder(),
|
||||||
|
DablinModule(),
|
||||||
|
Downmix(Format.FLOAT),
|
||||||
|
]
|
||||||
|
super().__init__(workers)
|
||||||
|
|
||||||
|
def getFixedIfSampleRate(self) -> int:
|
||||||
|
return 2048000
|
||||||
|
|
||||||
|
def getFixedAudioRate(self) -> int:
|
||||||
|
return 48000
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
from pycsdr.modules import ExecModule
|
||||||
|
from pycsdr.types import Format
|
||||||
|
|
||||||
|
|
||||||
|
class DablinModule(ExecModule):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(
|
||||||
|
Format.CHAR,
|
||||||
|
Format.FLOAT,
|
||||||
|
["dablin", "-s", "0x15DC", "-p"]
|
||||||
|
)
|
||||||
|
|
@ -40,7 +40,7 @@ class ClientDemodulatorChain(Chain):
|
||||||
self.hdOutputRate = hdOutputRate
|
self.hdOutputRate = hdOutputRate
|
||||||
self.secondaryDspEventReceiver = secondaryDspEventReceiver
|
self.secondaryDspEventReceiver = secondaryDspEventReceiver
|
||||||
self.selector = Selector(sampleRate, outputRate)
|
self.selector = Selector(sampleRate, outputRate)
|
||||||
self.selectorBuffer = Buffer(Format.COMPLEX_FLOAT)
|
self.selectorBuffer = Buffer(Format.COMPLEX_FLOAT, size=524288)
|
||||||
self.audioBuffer = None
|
self.audioBuffer = None
|
||||||
self.demodulator = demod
|
self.demodulator = demod
|
||||||
self.secondaryDemodulator = None
|
self.secondaryDemodulator = None
|
||||||
|
|
@ -573,6 +573,9 @@ class DspManager(SdrSourceEventClient, ClientDemodulatorSecondaryDspEventClient)
|
||||||
elif demod == "freedv":
|
elif demod == "freedv":
|
||||||
from csdr.chain.freedv import FreeDV
|
from csdr.chain.freedv import FreeDV
|
||||||
return FreeDV()
|
return FreeDV()
|
||||||
|
elif demod == "dab":
|
||||||
|
from csdr.chain.dablin import Dablin
|
||||||
|
return Dablin()
|
||||||
elif demod == "empty":
|
elif demod == "empty":
|
||||||
from csdr.chain.analog import Empty
|
from csdr.chain.analog import Empty
|
||||||
return Empty()
|
return Empty()
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ class FeatureDetector(object):
|
||||||
"dumphfdl": ["dumphfdl"],
|
"dumphfdl": ["dumphfdl"],
|
||||||
"dumpvdl2": ["dumpvdl2"],
|
"dumpvdl2": ["dumpvdl2"],
|
||||||
"redsea": ["redsea"],
|
"redsea": ["redsea"],
|
||||||
|
"dab": ["csdreti", "dablin"]
|
||||||
}
|
}
|
||||||
|
|
||||||
def feature_availability(self):
|
def feature_availability(self):
|
||||||
|
|
@ -648,3 +649,26 @@ class FeatureDetector(object):
|
||||||
`redsea`.
|
`redsea`.
|
||||||
"""
|
"""
|
||||||
return self.command_is_runnable("redsea --version")
|
return self.command_is_runnable("redsea --version")
|
||||||
|
|
||||||
|
def has_csdreti(self):
|
||||||
|
"""
|
||||||
|
TODO: feature description
|
||||||
|
"""
|
||||||
|
required_version = LooseVersion("0.1")
|
||||||
|
|
||||||
|
try:
|
||||||
|
from csdreti.modules import csdreti_version
|
||||||
|
from csdreti.modules import version as pycsdreti_version
|
||||||
|
|
||||||
|
return (
|
||||||
|
LooseVersion(csdreti_version) >= required_version
|
||||||
|
and LooseVersion(pycsdreti_version) >= required_version
|
||||||
|
)
|
||||||
|
except ImportError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def has_dablin(self):
|
||||||
|
"""
|
||||||
|
TODO: feature description
|
||||||
|
"""
|
||||||
|
return self.command_is_runnable("dablin -h")
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,7 @@ class Modes(object):
|
||||||
"freedv", "FreeDV", bandpass=Bandpass(300, 3000), requirements=["digital_voice_freedv"], squelch=False
|
"freedv", "FreeDV", bandpass=Bandpass(300, 3000), requirements=["digital_voice_freedv"], squelch=False
|
||||||
),
|
),
|
||||||
AnalogMode("drm", "DRM", bandpass=Bandpass(-5000, 5000), requirements=["drm"], squelch=False),
|
AnalogMode("drm", "DRM", bandpass=Bandpass(-5000, 5000), requirements=["drm"], squelch=False),
|
||||||
|
AnalogMode("dab", "DAB", bandpass=Bandpass(-1e6, 1e6), requirements=["dab"], squelch=False),
|
||||||
DigitalMode("bpsk31", "BPSK31", underlying=["usb"]),
|
DigitalMode("bpsk31", "BPSK31", underlying=["usb"]),
|
||||||
DigitalMode("bpsk63", "BPSK63", underlying=["usb"]),
|
DigitalMode("bpsk63", "BPSK63", underlying=["usb"]),
|
||||||
DigitalMode("rtty170", "RTTY 45/170", underlying=["usb", "lsb"]),
|
DigitalMode("rtty170", "RTTY 45/170", underlying=["usb", "lsb"]),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue