4b6f9a807b
Fixed a bug where certain config.FPS values would result in arrays with mismatched dimensions. The mismatched dimensions occurred because an integer was rounded instead of truncated. This is now fixed and exceptions should no longer be raised when certain FPS values are used.
59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
from __future__ import print_function
|
|
import numpy as np
|
|
import config
|
|
import melbank
|
|
|
|
|
|
class ExpFilter:
|
|
"""Simple exponential smoothing filter"""
|
|
def __init__(self, val=0.0, alpha_decay=0.5, alpha_rise=0.5):
|
|
"""Small rise / decay factors = more smoothing"""
|
|
assert 0.0 < alpha_decay < 1.0, 'Invalid decay smoothing factor'
|
|
assert 0.0 < alpha_rise < 1.0, 'Invalid rise smoothing factor'
|
|
self.alpha_decay = alpha_decay
|
|
self.alpha_rise = alpha_rise
|
|
self.value = val
|
|
|
|
def update(self, value):
|
|
if isinstance(self.value, (list, np.ndarray, tuple)):
|
|
alpha = value - self.value
|
|
alpha[alpha > 0.0] = self.alpha_rise
|
|
alpha[alpha <= 0.0] = self.alpha_decay
|
|
else:
|
|
alpha = self.alpha_rise if value > self.value else self.alpha_decay
|
|
self.value = alpha * value + (1.0 - alpha) * self.value
|
|
return self.value
|
|
|
|
|
|
def rfft(data, window=None):
|
|
window = 1.0 if window is None else window(len(data))
|
|
ys = np.abs(np.fft.rfft(data * window))
|
|
xs = np.fft.rfftfreq(len(data), 1.0 / config.MIC_RATE)
|
|
return xs, ys
|
|
|
|
|
|
def fft(data, window=None):
|
|
window = 1.0 if window is None else window(len(data))
|
|
ys = np.fft.fft(data * window)
|
|
xs = np.fft.fftfreq(len(data), 1.0 / config.MIC_RATE)
|
|
return xs, ys
|
|
|
|
|
|
samples = int(config.MIC_RATE * config.N_ROLLING_HISTORY / (2.0 * config.FPS))
|
|
mel_y, (_, mel_x) = melbank.compute_melmat(num_mel_bands=config.N_FFT_BINS,
|
|
freq_min=config.MIN_FREQUENCY,
|
|
freq_max=config.MAX_FREQUENCY,
|
|
num_fft_bands=samples,
|
|
sample_rate=config.MIC_RATE)
|
|
|
|
|
|
def create_mel_bank(n_history):
|
|
global samples, mel_y, mel_x
|
|
config.N_ROLLING_HISTORY = n_history
|
|
samples = int(config.MIC_RATE * config.N_ROLLING_HISTORY / (2.0 * config.FPS))
|
|
mel_y, (_, mel_x) = melbank.compute_melmat(num_mel_bands=config.N_FFT_BINS,
|
|
freq_min=config.MIN_FREQUENCY,
|
|
freq_max=config.MAX_FREQUENCY,
|
|
num_fft_bands=samples,
|
|
sample_rate=config.MIC_RATE)
|