From 68a1abd37e04f8fc262e659258999d4d437fbeb7 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 22 Jan 2021 18:47:34 +0100 Subject: [PATCH] keep intermediate sample rate down to a minimum --- csdr/csdr.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/csdr/csdr.py b/csdr/csdr.py index 8ee4fbd..7ea2690 100644 --- a/csdr/csdr.py +++ b/csdr/csdr.py @@ -527,25 +527,20 @@ class dsp(object): self.restart() def calculate_decimation(self): - (self.decimation, self.last_decimation, _) = self.get_decimation(self.samp_rate, self.get_audio_rate()) + (self.decimation, self.last_decimation) = self.get_decimation(self.samp_rate, self.get_audio_rate()) def get_decimation(self, input_rate, output_rate): decimation = 1 - correction = 1 + target_rate = output_rate # 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 6 is by experimentation only, with a minimum audio rate of 36kHz (enforced by the client) - # this allows us to cover at least +/- 108kHz 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 = 6 - while input_rate / (decimation + 1) >= output_rate * correction: + if self.get_demodulator() == "wfm" and output_rate < 200000: + target_rate = 200000 + while input_rate / (decimation + 1) >= target_rate: decimation += 1 fraction = float(input_rate / decimation) / output_rate - intermediate_rate = input_rate / decimation - return decimation, fraction, intermediate_rate + return decimation, fraction def if_samp_rate(self): return self.samp_rate / self.decimation