compensate WFM frequency deviation, at least preliminary

This commit is contained in:
Jakob Ketterl 2020-08-08 21:56:35 +02:00
parent 5a938b8c0b
commit 8c5a7a087f
2 changed files with 13 additions and 2 deletions

View File

@ -578,7 +578,17 @@ class dsp(object):
def get_decimation(self, input_rate, output_rate): def get_decimation(self, input_rate, output_rate):
decimation = 1 decimation = 1
while input_rate / (decimation + 1) >= output_rate: correction = 1
# wideband fm has a much higher frequency deviation (75kHz).
# we cannot cover this if we immediately decimate to the sample rate the audio will have later on, so we need
# to compensate here.
# the factor of 5 is by experimentation only, with a minimum audio rate of 36kHz (enforced by the client)
# this allows us to cover at least +/- 80kHz of frequency spectrum (may be higher, but that's the worst case).
# the correction factor is automatically compensated for by the secondary decimation stage, which comes
# after the demodulator.
if self.get_demodulator() == "wfm":
correction = 5
while input_rate / (decimation + 1) >= output_rate * correction:
decimation += 1 decimation += 1
fraction = float(input_rate / decimation) / output_rate fraction = float(input_rate / decimation) / output_rate
intermediate_rate = input_rate / decimation intermediate_rate = input_rate / decimation
@ -653,6 +663,7 @@ class dsp(object):
if self.hd_output_rate == hd_output_rate: if self.hd_output_rate == hd_output_rate:
return return
self.hd_output_rate = hd_output_rate self.hd_output_rate = hd_output_rate
self.calculate_decimation()
self.restart() self.restart()
def set_demodulator(self, demodulator): def set_demodulator(self, demodulator):

View File

@ -40,7 +40,7 @@ class DigitalMode(Mode):
class Modes(object): class Modes(object):
mappings = [ mappings = [
AnalogMode("nfm", "FM", bandpass=Bandpass(-4000, 4000)), AnalogMode("nfm", "FM", bandpass=Bandpass(-4000, 4000)),
AnalogMode("wfm", "WFM", bandpass=Bandpass(-16000, 16000)), AnalogMode("wfm", "WFM", bandpass=Bandpass(-80000, 80000)),
AnalogMode("am", "AM", bandpass=Bandpass(-4000, 4000)), AnalogMode("am", "AM", bandpass=Bandpass(-4000, 4000)),
AnalogMode("lsb", "LSB", bandpass=Bandpass(-3000, -300)), AnalogMode("lsb", "LSB", bandpass=Bandpass(-3000, -300)),
AnalogMode("usb", "USB", bandpass=Bandpass(300, 3000)), AnalogMode("usb", "USB", bandpass=Bandpass(300, 3000)),