Adding CW decoder.

This commit is contained in:
Marat Fayzullin 2023-01-07 18:58:15 -05:00 committed by Marat Fayzullin
parent c5fc6db19e
commit ec2819b886
3 changed files with 28 additions and 1 deletions

View File

@ -2,7 +2,7 @@ from csdr.chain.demodulator import ServiceDemodulator, SecondaryDemodulator, Dia
from owrx.audio.chopper import AudioChopper, AudioChopperParser from owrx.audio.chopper import AudioChopper, AudioChopperParser
from owrx.aprs.kiss import KissDeframer from owrx.aprs.kiss import KissDeframer
from owrx.aprs import Ax25Parser, AprsParser from owrx.aprs import Ax25Parser, AprsParser
from pycsdr.modules import Convert, FmDemod, Agc, TimingRecovery, DBPskDecoder, VaricodeDecoder from pycsdr.modules import Convert, FmDemod, Agc, TimingRecovery, DBPskDecoder, VaricodeDecoder, CwDecoder, RealPart
from pycsdr.types import Format from pycsdr.types import Format
from owrx.aprs.module import DirewolfModule from owrx.aprs.module import DirewolfModule
from digiham.modules import FskDemodulator, PocsagDecoder from digiham.modules import FskDemodulator, PocsagDecoder
@ -89,3 +89,26 @@ class PskDemodulator(SecondaryDemodulator, SecondarySelectorChain):
self.sampleRate = sampleRate self.sampleRate = sampleRate
secondary_samples_per_bits = int(round(self.sampleRate / self.baudRate)) & ~3 secondary_samples_per_bits = int(round(self.sampleRate / self.baudRate)) & ~3
self.replace(1, TimingRecovery(secondary_samples_per_bits, 0.5, 2, useQ=True)) self.replace(1, TimingRecovery(secondary_samples_per_bits, 0.5, 2, useQ=True))
class CwDemodulator(SecondaryDemodulator, SecondarySelectorChain):
def __init__(self, baudRate: float):
self.baudRate = baudRate
# this is an assumption, we will adjust in setSampleRate
self.sampleRate = 12000
workers = [
RealPart(),
Agc(Format.FLOAT),
CwDecoder(self.sampleRate),
]
super().__init__(workers)
def getBandwidth(self):
return self.baudRate
def setSampleRate(self, sampleRate: int) -> None:
if sampleRate == self.sampleRate:
return
self.sampleRate = sampleRate
self.replace(1, CwDecoder(sampleRate))

View File

@ -613,6 +613,9 @@ class DspManager(SdrSourceEventClient, ClientDemodulatorSecondaryDspEventClient)
elif mod == "bpsk63": elif mod == "bpsk63":
from csdr.chain.digimodes import PskDemodulator from csdr.chain.digimodes import PskDemodulator
return PskDemodulator(62.5) return PskDemodulator(62.5)
elif mod == "cwdecoder":
from csdr.chain.digimodes import CwDemodulator
return CwDemodulator(10.0)
def setSecondaryDemodulator(self, mod): def setSecondaryDemodulator(self, mod):
demodulator = self._getSecondaryDemodulator(mod) demodulator = self._getSecondaryDemodulator(mod)

View File

@ -138,6 +138,7 @@ class Modes(object):
requirements=["pocsag"], requirements=["pocsag"],
squelch=False, squelch=False,
), ),
DigitalMode("cwdecoder", "CWDecoder", underlying=["cw"]),
] ]
@staticmethod @staticmethod