From 1e8527da6801e05c205e956ce43165e458a94780 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 10 Aug 2021 14:03:49 +0200 Subject: [PATCH] add YSF chain; re-introduce RRC filters --- csdr/__init__.py | 5 +++- csdr/chain/digiham.py | 65 ++++++++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/csdr/__init__.py b/csdr/__init__.py index 856cea21..44cec43e 100644 --- a/csdr/__init__.py +++ b/csdr/__init__.py @@ -41,7 +41,7 @@ from csdr.chain.demodulator import DemodulatorChain from csdr.chain.fm import NFm, WFm from csdr.chain.am import Am from csdr.chain.ssb import Ssb -from csdr.chain.digiham import Dstar, Nxdn, Dmr +from csdr.chain.digiham import Dstar, Nxdn, Dmr, Ysf from csdr.chain.clientaudio import ClientAudioChain import logging @@ -149,6 +149,9 @@ class Dsp(DirewolfConfigSubscriber): elif which == "dmr": self.pycsdr_chain = DemodulatorChain(self.samp_rate, 48000, 0.0, Dmr(self.codecserver)) return self.pycsdr_chain + elif which == "ysf": + self.pycsdr_chain = DemodulatorChain(self.samp_rate, 48000, 0.0, Ysf(self.codecserver)) + return self.pycsdr_chain chain = ["nc -v 127.0.0.1 {nc_port}"] chain += ["csdr shift_addfast_cc --fifo {shift_pipe}"] diff --git a/csdr/chain/digiham.py b/csdr/chain/digiham.py index c31fc596..3c14272b 100644 --- a/csdr/chain/digiham.py +++ b/csdr/chain/digiham.py @@ -1,23 +1,25 @@ from csdr.chain import Chain from pycsdr.modules import FmDemod, Agc, Writer from pycsdr.types import Format -from digiham.modules import DstarDecoder, DcBlock, FskDemodulator, GfskDemodulator, DigitalVoiceFilter, MbeSynthesizer, NarrowRrcFilter, NxdnDecoder, DmrDecoder +from digiham.modules import DstarDecoder, DcBlock, FskDemodulator, GfskDemodulator, DigitalVoiceFilter, MbeSynthesizer, NarrowRrcFilter, NxdnDecoder, DmrDecoder, WideRrcFilter, YsfDecoder from digiham.ambe import Modes class DigihamChain(Chain): - def __init__(self, codecserver: str = ""): + def __init__(self, fskDemodulator, decoder, mbeMode, filter=None, codecserver: str = ""): + self.decoder = decoder if codecserver is None: codecserver = "" agc = Agc(Format.SHORT) agc.setMaxGain(30) agc.setInitialGain(3) - workers = [ - FmDemod(), - DcBlock(), - self.fskDemodulator, - self.decoder, - MbeSynthesizer(self.mbeMode, codecserver), + workers = [FmDemod(), DcBlock()] + if filter is not None: + workers += [filter] + workers += [ + fskDemodulator, + decoder, + MbeSynthesizer(mbeMode, codecserver), DigitalVoiceFilter(), agc ] @@ -29,26 +31,45 @@ class DigihamChain(Chain): class Dstar(DigihamChain): def __init__(self, codecserver: str = ""): - self.fskDemodulator = FskDemodulator(samplesPerSymbol=10) - self.decoder = DstarDecoder() - self.mbeMode = Modes.DStarMode - super().__init__(codecserver) + super().__init__( + fskDemodulator=FskDemodulator(samplesPerSymbol=10), + decoder=DstarDecoder(), + mbeMode=Modes.DStarMode, + codecserver=codecserver + ) class Nxdn(DigihamChain): def __init__(self, codecserver: str = ""): - self.fskDemodulator = GfskDemodulator(samplesPerSymbol=20) - self.decoder = NxdnDecoder() - self.mbeMode = Modes.NxdnMode - super().__init__(codecserver) + super().__init__( + fskDemodulator=GfskDemodulator(samplesPerSymbol=20), + decoder=NxdnDecoder(), + mbeMode=Modes.NxdnMode, + filter=NarrowRrcFilter(), + codecserver=codecserver + ) class Dmr(DigihamChain): def __init__(self, codecserver: str = ""): - self.fskDemodulator = GfskDemodulator(samplesPerSymbol=10) - self.decoder = DmrDecoder() - self.mbeMode = Modes.DmrMode - super().__init__(codecserver) + super().__init__( + fskDemodulator=GfskDemodulator(samplesPerSymbol=10), + decoder=DmrDecoder(), + mbeMode=Modes.DmrMode, + filter=WideRrcFilter(), + codecserver=codecserver, + ) - def setSlotFilter(self, filter: int) -> None: - self.decoder.setSlotFilter(filter) + def setSlotFilter(self, slotFilter: int) -> None: + self.decoder.setSlotFilter(slotFilter) + + +class Ysf(DigihamChain): + def __init__(self, codecserver: str = ""): + super().__init__( + fskDemodulator=GfskDemodulator(samplesPerSymbol=10), + decoder=YsfDecoder(), + mbeMode=Modes.YsfMode, + filter=WideRrcFilter(), + codecserver=codecserver + )