Как создать правильный розовый шум и фильтрацию с помощью специального пикового фильтра в Python

Я занимаюсь проблемой фильтрации розового шума с помощью пикового фильтра (конечная цель - выровнять входной сигнал). Я сам разрабатывал пиковый фильтр, чтобы лучше познакомиться с фильтрацией одномерных сигналов. Что касается розового шума, я использую розовый шум, созданный в результате работы, уже проделанной в 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()

Ответ фильтра имеет ожидаемую форму:

https://imgur.com/bImjymX

Однако, когда я фильтрую шум этим фильтром с помощью этого кода:

out = signal.filtfilt(b, a, noise)
plt.plot(out, color='red')

Я получаю следующий результат:

https://imgur.com/k7a4DoR

Вот тут мне трудно судить, правильно ли это. Во-первых, я не знаю, почему отфильтрованный шум приобретает такую ​​форму и такие значения (в том числе и отрицательные). Кроме того, я ожидал бы, что отфильтрованный сигнал будет различаться по форме или интенсивности с Gdb и Q на заданной центральной частоте, но это не так. Около этой частоты должно быть затухание или усиление (если я правильно понял).


person Post. T.    schedule 17.07.2019    source источник


Ответы (1)


Я читаю здесь между строк, но кажется, что вы пытаетесь проверить, что фильтр имеет желаемую частотную характеристику, пропуская через него всплеск розового шума и глядя на БПФ выходного сигнала фильтра, чтобы увидеть, что он принял на желаемую форму.

Во-первых, шум может быть подходящим для определения частотной характеристики, но я думаю, что белый шум был бы лучше, так как он не имеет спада, который вам нужно визуально компенсировать.

Во-вторых, если вы закачаете шум в свой фильтр, у вас возникнут две проблемы.

1) фильтр имеет некоторую переходную характеристику, которая вас, вероятно, не волнует.

2) Шум случайный. Если он имеет форму белого или розового цвета или чего-то еще, это становится очевидным только со временем. Попробуйте пропустить фильтр. Вы обнаружите, что он подпрыгивает повсюду от прогона к прогону. Если вы действительно хотите увидеть спектр шумового сигнала, вам необходимо выполнить усреднение. Возьмите один генератор шума, который может генерировать 10*N выборок. Сгенерируйте N выборок, возьмите величину БПФ и суммируйте ее. Сделайте это N раз и постройте график результата. По мере увеличения N будет проявляться форма шума. Теперь, если вы сделаете то же самое, но пропустите шум через свой фильтр, вы начнете видеть форму фильтра. Возможно, вы захотите отбросить первые несколько результатов БПФ из среднего значения, чтобы не исказить его откликом фильтра во временной области.

3) Альтернативный подход состоит в том, чтобы генерировать синусоидальные волны с различными частотами, пропускать их через фильтр и вычислять выходные амплитуды. Например, для 100 частот от 900 до 1100 Гц сгенерируйте синусоиду из 100 циклов на этой частоте, пропустите ее через фильтр и постройте среднеквадратичную амплитуду отфильтрованного выходного сигнала в зависимости от частоты синуса.

person jaket    schedule 18.07.2019
comment
Привет, спасибо за ваш ответ. Извините, если моя проблема была неясна: идея состоит в том, чтобы подойти к цепочке обработки выравнивания, которая направлена ​​​​на настройку выходного сигнала громкоговорителя с помощью пиковых фильтров, вырезая или усиливая частоты, которые приносят неприятные тона для уха. Системы эквалайзера используют более одного пикового фильтра, но, будучи новичком в этой области обработки сигналов, я начинаю с легкого. Так что я смотрю не на отклик фильтра, а на результат фильтрации розового шума этим фильтром. И я бы ожидал повышения или понижения на заданных частотах, чего я не делаю при построении выходного сигнала. Надеюсь, стало понятнее. - person Post. T.; 19.07.2019