wrap averager (prepare to make it switchable)

This commit is contained in:
Jakob Ketterl 2020-12-21 00:33:48 +01:00
parent 2c7c41cded
commit 2df527ed20

View File

@ -6,6 +6,22 @@ logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
class FftAverager(Chain):
def __init__(self, fft_size, fft_averages):
self.fftSize = fft_size
self.fftAverages = fft_averages
self.worker = LogAveragePower(add_db=-70, fft_size=self.fftSize, avg_number=self.fftAverages)
workers = [self.worker]
super().__init__(*workers)
def setFftAverages(self, fft_averages):
if self.fftAverages == fft_averages:
return
self.fftAverages = fft_averages
# TODO replace worker with LogPower if fft_averages == 0
self.worker.setFftAverages(avg_number=self.fftAverages)
class FftChain(Chain): class FftChain(Chain):
def __init__(self, samp_rate, fft_size, fft_v_overlap_factor, fft_fps, fft_compression): def __init__(self, samp_rate, fft_size, fft_v_overlap_factor, fft_fps, fft_compression):
self.sampleRate = samp_rate self.sampleRate = samp_rate
@ -14,14 +30,13 @@ class FftChain(Chain):
self.size = fft_size self.size = fft_size
self.blockSize = 0 self.blockSize = 0
self.fftAverages = 0
self.fft = Fft(size=self.size, every_n_samples=self.blockSize) self.fft = Fft(size=self.size, every_n_samples=self.blockSize)
self.logAveragePower = LogAveragePower(add_db=-70, fft_size=self.size, avg_number=self.fftAverages) self.averager = FftAverager(fft_size=self.size, fft_averages=0)
self.fftExchangeSides = FftExchangeSides(fft_size=self.size) self.fftExchangeSides = FftExchangeSides(fft_size=self.size)
workers = [ workers = [
self.fft, self.fft,
self.logAveragePower, self.averager,
self.fftExchangeSides, self.fftExchangeSides,
] ]
self.compressFftAdpcm = None self.compressFftAdpcm = None
@ -33,12 +48,6 @@ class FftChain(Chain):
super().__init__(*workers) super().__init__(*workers)
def _setFftAverages(self, fft_averages):
if self.fftAverages == fft_averages:
return
self.fftAverages = fft_averages
self.logAveragePower.setFftAverages(avg_number=self.fftAverages)
def _setBlockSize(self, fft_block_size): def _setBlockSize(self, fft_block_size):
if self.blockSize == int(fft_block_size): if self.blockSize == int(fft_block_size):
return return
@ -64,14 +73,13 @@ class FftChain(Chain):
self._updateParameters() self._updateParameters()
def _updateParameters(self): def _updateParameters(self):
if self.vOverlapFactor > 0: fftAverages = 0
self._setFftAverages(
int(round(1.0 * self.sampleRate / self.size / self.fps / (1.0 - self.vOverlapFactor)))
)
else:
self._setFftAverages(0)
if self.fftAverages == 0: if self.vOverlapFactor > 0:
fftAverages = int(round(1.0 * self.sampleRate / self.size / self.fps / (1.0 - self.vOverlapFactor)))
self.averager.setFftAverages(fftAverages)
if fftAverages == 0:
self._setBlockSize(self.sampleRate / self.fps) self._setBlockSize(self.sampleRate / self.fps)
else: else:
self._setBlockSize(self.sampleRate / self.fps / self.fftAverages) self._setBlockSize(self.sampleRate / self.fps / fftAverages)