Обработка сигнала - Почему сигнал не полностью отфильтрован на моей частоте среза? - PullRequest
0 голосов
/ 25 января 2019

Мне нужно отфильтровать сигнал.Я хочу сохранить частоты от 0 до 51 Гц.Ниже приведен код, который я использую, часть которого взята из этих двух вопросов ( Python: Разработка фильтра временных рядов после анализа Фурье , Создание фильтра нижних частот в SciPy - методы понимания иединицы ):

def butter_lowpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    return b, a

def butter_lowpass_filter(data, cutoff, fs, order=5):
    b, a = butter_lowpass(cutoff, fs, order=order)
    y = lfilter(b, a, data)
    return y

    # y is the original signal
    # getting the unbiased signal
    y = list(np.array(y)-sts.mean(y))
    # saving the original signal
    y_before = y

    # x is the time vector

    # for the spectrum of the original signal
    yps_before = np.abs(np.fft.fft(y_before))**2
    yfreqs_before = np.fft.fftfreq(6000, d = 0.001)
    y_idx_before = np.argsort(yfreqs_before)

    #Filtering
    order = 8
    fs = 1000.0       
    cutoff = 50.0  
    y = butter_lowpass_filter(y, cutoff, fs, order)

    # for the spectrum of the filtered signal
    yps = np.abs(np.fft.fft(y))**2
    yfreqs = np.fft.fftfreq(6000, d = 0.001)
    y_idx = np.argsort(yfreqs)


    fig = plt.figure(figsize=(14,10))
    fig.suptitle(file_name, fontsize=20)
    plt.plot(yfreqs_before[y_idx_before], yps_before[y_idx_before], 'k-', label='original spectrum',linewidth=0.5)
    plt.plot(yfreqs[y_idx], yps[y_idx], 'r-', linewidth=2, label='filtered spectrum')
    plt.xlabel('Frequency [Hz]')
    plt.yscale('log')
    plt.grid()
    plt.legend()
    plt.show()

Результатом этого кода является фильтрованный сигнал, однако это сравнение спектра: enter image description here

Как выМожно видеть, что спектр выглядит хорошо после 100 Гц, однако, между 50 Гц и примерно 100 Гц все еще есть компонент.Таким образом, я попытался использовать фильтр более высокого порядка (20), но в качестве вывода я получил действительно странный спектр:

enter image description here

Итак, я знаючто фильтр не может и никогда не будет идеальным, но мне кажется, это слишком много.По моему опыту, я всегда мог получить довольно хороший фильтрованный сигнал на моей частоте среза.Любой совет?

1 Ответ

0 голосов
/ 25 января 2019

Частота среза обычно там, где падение передаточной функции составляет -6 дБ.

Увеличение порядка сделает фильтр круче, но также добавит артефакты в зависимости от типа фильтра. Обычно, у вас есть большие проблемы с фазой (числовые проблемы, изменение фазы прямо пропорционально порядку, рябь ...).

Здесь, я не знаю, кажется, что она достаточно хорошо повторяет исходную кривую до обрезания.

При этом фильтры 20-го порядка также очень крутые и будут возникать численные проблемы из-за небольших чисел в коэффициентах. Обычный трюк состоит в том, чтобы каскадировать фильтры 2-го порядка и заставить глобальный фильтр следовать той же кривой (вы можете взглянуть на фильтры Линквица-Райли). Имейте в виду, что эти фильтры являются LTI, поэтому вы не можете изменять параметры на лету (это не будет LTI).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...