Я занимаюсь проблемой фильтрации розового шума с помощью пикового фильтра (конечная цель - выровнять входной сигнал). Я сам разрабатывал пиковый фильтр, чтобы лучше познакомиться с фильтрацией одномерных сигналов. Что касается розового шума, я использую розовый шум, созданный в результате работы, уже проделанной в https://github.com/felixpatzelt/colorednoise/blob/master/colorednoise.py .
1/Мне интересно, почему интенсивность спектрограммы мощности является случайной, когда я несколько раз запускаю одну и ту же функцию с одними и теми же параметрами, это связано с вызовом numpy.random.normal
? Как кто-то будет генерировать шум в указанном диапазоне значений? На двух следующих рисунках показано, что диапазон мощности непостоянен при разных прогонах (невозможно публиковать изображения напрямую, извините за ссылки imgur):
2/ Ниже приводится определение пикового фильтра, который я использую дальше:
class PeakFilter():
def __init__(self, center_freq, sample_rate, Q, gainDB):
self.center_freq = center_freq
self.sample_rate = sample_rate
self.gainDB = gainDB
self.Q = Q
# derived quantities
self.A = 10**(self.gainDB/40)
self.center_freq = 2*np.pi * self.center_freq / self.sample_rate
def peak_transfer(self):
b = np.array([ 1, self.A/self.Q, 1 ])
a = np.array([ 1, 1/(self.A*self.Q), 1])
# shift to center frequency
b, a = signal.lp2lp(b, a, wo=self.center_freq)
return b, a
sample_rate = 44100
fc = 1000
Q = 1.7
Gdb = 5
peak_filt = PeakFilter(fc, sample_rate, Q, Gdb)
b, a = peak_filt.peak_transfer()
w, h = signal.freqs(b, a, 10000)
freq = w*sample_rate/2/np.pi
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(freq, 20*np.log10(abs(h)), color='blue')
ax.set_xscale('log')
plt.grid('true')
plt.plot()
Ответ фильтра имеет ожидаемую форму:
Однако, когда я фильтрую шум этим фильтром с помощью этого кода:
out = signal.filtfilt(b, a, noise)
plt.plot(out, color='red')
Я получаю следующий результат:
Вот тут мне трудно судить, правильно ли это. Во-первых, я не знаю, почему отфильтрованный шум приобретает такую форму и такие значения (в том числе и отрицательные). Кроме того, я ожидал бы, что отфильтрованный сигнал будет различаться по форме или интенсивности с Gdb
и Q
на заданной центральной частоте, но это не так. Около этой частоты должно быть затухание или усиление (если я правильно понял).