move fft calculations into fft chain
This commit is contained in:
@ -7,11 +7,18 @@ logger.setLevel(logging.INFO)
|
||||
|
||||
|
||||
class FftChain(Chain):
|
||||
def __init__(self, fft_size, fft_block_size, fft_averages, fft_compression):
|
||||
logger.debug("new fft: fft_size={0}, fft_block_size={1}, fft_averages={2}, fft_compression={3}".format(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)
|
||||
def __init__(self, samp_rate, fft_size, fft_v_overlap_factor, fft_fps, fft_compression):
|
||||
self.sampleRate = samp_rate
|
||||
self.vOverlapFactor = fft_v_overlap_factor
|
||||
self.fps = fft_fps
|
||||
self.size = fft_size
|
||||
|
||||
self.blockSize = 0
|
||||
self.fftAverages = 0
|
||||
|
||||
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.fftExchangeSides = FftExchangeSides(fft_size=self.size)
|
||||
workers = [
|
||||
self.fft,
|
||||
self.logAveragePower,
|
||||
@ -19,14 +26,52 @@ class FftChain(Chain):
|
||||
]
|
||||
self.compressFftAdpcm = None
|
||||
if fft_compression == "adpcm":
|
||||
self.compressFftAdpcm = CompressFftAdpcm(fft_size=fft_size)
|
||||
self.compressFftAdpcm = CompressFftAdpcm(fft_size=self.size)
|
||||
workers += [self.compressFftAdpcm]
|
||||
|
||||
self._updateParameters()
|
||||
|
||||
super().__init__(*workers)
|
||||
|
||||
def setFftAverages(self, fft_averages):
|
||||
logger.debug("setting fft_averages={0}".format(fft_averages))
|
||||
self.logAveragePower.setFftAverages(avg_number=fft_averages)
|
||||
def _setFftAverages(self, fft_averages):
|
||||
if self.fftAverages == fft_averages:
|
||||
return
|
||||
self.fftAverages = fft_averages
|
||||
self.logAveragePower.setFftAverages(avg_number=self.fftAverages)
|
||||
|
||||
def setFftBlockSize(self, fft_block_size):
|
||||
logger.debug("setting fft_block_size={0}".format(fft_block_size))
|
||||
self.fft.setEveryNSamples(int(fft_block_size))
|
||||
def _setBlockSize(self, fft_block_size):
|
||||
if self.blockSize == int(fft_block_size):
|
||||
return
|
||||
self.blockSize = int(fft_block_size)
|
||||
self.fft.setEveryNSamples(self.blockSize)
|
||||
|
||||
def setVOverlapFactor(self, fft_v_overlap_factor):
|
||||
if self.vOverlapFactor == fft_v_overlap_factor:
|
||||
return
|
||||
self.vOverlapFactor = fft_v_overlap_factor
|
||||
self._updateParameters()
|
||||
|
||||
def setFps(self, fft_fps):
|
||||
if self.fps == fft_fps:
|
||||
return
|
||||
self.fps = fft_fps
|
||||
self._updateParameters()
|
||||
|
||||
def setSampleRate(self, samp_rate):
|
||||
if self.sampleRate == samp_rate:
|
||||
return
|
||||
self.sampleRate = samp_rate
|
||||
self._updateParameters()
|
||||
|
||||
def _updateParameters(self):
|
||||
if self.vOverlapFactor > 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:
|
||||
self._setBlockSize(self.sampleRate / self.fps)
|
||||
else:
|
||||
self._setBlockSize(self.sampleRate / self.fps / self.fftAverages)
|
||||
|
Reference in New Issue
Block a user