compensate WFM frequency deviation, at least preliminary
This commit is contained in:
parent
5a938b8c0b
commit
8c5a7a087f
13
csdr/csdr.py
13
csdr/csdr.py
@ -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):
|
||||||
|
@ -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)),
|
||||||
|
Loading…
Reference in New Issue
Block a user