Частотная характеристика для фильтра, разработанного с использованием
функции масла, равна:
Но нет причин ограничивать фильтр постоянной монотонной конструкцией фильтра. Если вы хотите более высокое затухание в полосе останова и более крутой полосе перехода, существуют другие варианты. Для получения дополнительной информации об указании фильтра с использованием 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-фильтра заключается в том, что у вас будет линейный фазовый отклик.
filtfilt
хочет дляa
параметра.Это работает?
Вы правы, хотя, документация не очень полная. Похоже,
butter
это обертка дляiirfilter
, которая лучше задокументирована :Большая часть этого материала клонирована из Matlab, так что вы также можете посмотреть их документацию :
Обновить:
Я добавил документацию для этих функций. :) Github делает это легко.
источник
Не уверен, что ваше заявление, но вы можете проверить Gnuradio: http://gnuradio.org/doc/doxygen/classgr__firdes.html
Блоки обработки сигналов написаны на C ++ (хотя потоковые графы Gnuradio на Python), но вы сказали, что важна высокая производительность.
источник
У меня хорошие результаты с этим фильтром FIR. Заметил, что он применяет фильтр дважды, двигаясь вперед и назад, чтобы компенсировать смещение сигнала (
filtfilt
функция не работает, не знаю почему):ЭТО - отличный ресурс для разработки и использования фильтров, откуда я взял этот код и откуда можно взять примеры полосовых и высокочастотных фильтров .
источник
У меня нет прав на комментарии ...
@endolith: Я использую то же самое, что и вы, за исключением использования scipy.signal.filtfilt (B, A, x), где x - это входной вектор, который необходимо отфильтровать - например, numpy.random.normal (size = (N)) . FilterFilt делает прямой и обратный проход сигнала. Для полноты картины (большинство из них совпадают с @endolith):
Для фильтра, как и в @heltonbiker, требуются массивы коэффициентов, как мне кажется. В случае, если вам необходимо выполнить полосовую фильтрацию в сложной основной полосе частот, необходима более сложная конфигурация, но здесь это не является проблемой.
источник