move fft calculations to dsp class

This commit is contained in:
Jakob Ketterl
2020-12-19 16:41:48 +01:00
parent efe80a75f5
commit 40c07ebb57
3 changed files with 35 additions and 19 deletions

View File

@ -4,11 +4,16 @@ from pycsdr import Fft, LogAveragePower, FftExchangeSides, CompressFftAdpcm
class FftChain(Chain):
def __init__(self, fft_size, fft_block_size, fft_averages, fft_compression):
self.fft = Fft(size=fft_size, every_n_samples=int(fft_block_size))
self.logAveragePower = LogAveragePower(add_db=-70, fft_size=fft_size, avg_number=fft_averages)
self.fftExchangeSides = FftExchangeSides(fft_size=fft_size)
workers = [
Fft(size=fft_size, every_n_samples=int(fft_block_size)),
LogAveragePower(add_db=-70, fft_size=fft_size, avg_number=fft_averages),
FftExchangeSides(fft_size=fft_size),
self.fft,
self.logAveragePower,
self.fftExchangeSides,
]
self.compressFftAdpcm = None
if fft_compression == "adpcm":
workers += [CompressFftAdpcm(fft_size=fft_size)]
self.compressFftAdpcm = CompressFftAdpcm(fft_size=fft_size)
workers += [self.compressFftAdpcm]
super().__init__(*workers)

View File

@ -112,6 +112,7 @@ class dsp(object):
self.secondary_fft_size = 1024
self.secondary_process_fft = None
self.secondary_process_demod = None
self.fft_voverlap_factor = 0
self.pipe_names = {
"bpf_pipe": Pipe.WRITE,
"shift_pipe": Pipe.WRITE,
@ -523,8 +524,11 @@ class dsp(object):
return (self.secondary_fft_size / 2) + (10 / 2)
def set_samp_rate(self, samp_rate):
if self.samp_rate == samp_rate:
return
self.samp_rate = samp_rate
self.calculate_decimation()
self.update_fft_averages()
if self.running:
self.restart()
@ -639,14 +643,35 @@ class dsp(object):
return self.demodulator
def set_fft_size(self, fft_size):
if self.fft_size == fft_size:
return
self.fft_size = fft_size
self.update_fft_averages()
self.restart()
def set_fft_fps(self, fft_fps):
if self.fft_fps == fft_fps:
return
self.fft_fps = fft_fps
self.update_fft_averages()
self.restart()
def set_fft_voverlap_factor(self, fft_voverlap_factor):
if self.fft_voverlap_factor == fft_voverlap_factor:
return
self.fft_voverlap_factor = fft_voverlap_factor
self.update_fft_averages()
def update_fft_averages(self):
self.set_fft_averages(
int(round(1.0 * self.samp_rate / self.fft_size / self.fft_fps / (1.0 - self.fft_voverlap_factor)))
if self.fft_voverlap_factor > 0
else 0
)
def set_fft_averages(self, fft_averages):
if self.fft_averages == fft_averages:
return
self.fft_averages = fft_averages
self.restart()