Частотная характеристика для фильтра, разработанного с использованием
функции масла, равна:
Но нет причин ограничивать фильтр постоянной монотонной конструкцией фильтра. Если вы хотите более высокое затухание в полосе останова и более крутой полосе перехода, существуют другие варианты. Для получения дополнительной информации об указании фильтра с использованием iirdesing см. Это . Как видно из графиков частотной характеристики для конструкции масла, частота отсечки (точка -3 дБ) далека от цели. Это может быть уменьшено путем понижающей дискретизации перед фильтрацией (функциям дизайна будет трудно с таким узким фильтром, 2% полосы пропускания). Давайте посмотрим на фильтрацию исходной частоты дискретизации с указанным отсечением.
import numpy as np
from scipy import signal
from matplotlib import pyplot as plt
from scipy.signal import fir_filter_design as ffd
from scipy.signal import filter_design as ifd
# setup some of the required parameters
Fs = 1e9 # sample-rate defined in the question, down-sampled
# remez (fir) design arguements
Fpass = 10e6 # passband edge
Fstop = 11.1e6 # stopband edge, transition band 100kHz
Wp = Fpass/(Fs) # pass normalized frequency
Ws = Fstop/(Fs) # stop normalized frequency
# iirdesign agruements
Wip = (Fpass)/(Fs/2)
Wis = (Fstop+1e6)/(Fs/2)
Rp = 1 # passband ripple
As = 42 # stopband attenuation
# Create a FIR filter, the remez function takes a list of
# "bands" and the amplitude for each band.
taps = 4096
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
# The iirdesign takes passband, stopband, passband ripple,
# and stop attenuation.
bc, ac = ifd.iirdesign(Wip, Wis, Rp, As, ftype='ellip')
bb, ab = ifd.iirdesign(Wip, Wis, Rp, As, ftype='cheby2')
Как уже упоминалось, поскольку мы пытаемся отфильтровать такой небольшой процент полосы пропускания, у фильтра не будет резкого обрезания. В этом случае, фильтр нижних частот, мы можем уменьшить пропускную способность, чтобы получить более привлекательный фильтр. Функция повторной выборки python / scipy.signal может использоваться для уменьшения пропускной способности.
Обратите внимание, что функция повторной выборки будет выполнять фильтрацию для предотвращения наложения имен. Предварительная фильтрация также может быть выполнена (чтобы уменьшить алиасинг), и в этом случае мы могли бы просто сделать повторную выборку на 100 и сделать это , но вопрос задавался о создании фильтров. Для этого примера мы снизим выборку на 25 и создадим новый фильтр
R = 25; # how much to down sample by
Fsr = Fs/25. # down-sampled sample rate
xs = signal.resample(x, len(x)/25.)
Если мы обновим параметры проекта для КИХ-фильтра, новый ответ будет.
# Down sampled version, create new filter and plot spectrum
R = 25. # how much to down sample by
Fsr = Fs/R # down-sampled sample rate
Fstop = 11.1e6 # modified stopband
Wp = Fpass/(Fsr) # pass normalized frequency
Ws = Fstop/(Fsr) # stop normalized frequency
taps = 256
br = ffd.remez(taps, [0, Wp, Ws, .5], [1,0], maxiter=10000)
Фильтр, работающий с данными пониженной дискретизации, имеет лучший отклик. Другое преимущество использования FIR-фильтра заключается в том, что у вас будет линейный фазовый отклик.