Документация Engee

filtfilt

Страница в процессе разработки.

Нуль-фазовая цифровая фильтрация.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • y = filtfilt(b, a, x) — выполняет нуль-фазовую цифровую фильтрацию, обрабатывая входные данные x как в прямом, так и в обратном направлении. После фильтрации данных в прямом направлении функция подбирает начальные условия для минимизации начальных и конечных переходных процессов, реверсирует отфильтрованную последовательность и пропускает ее через фильтр в обратном направлении. Результат обладает следующими характеристиками:

    • Нулевые фазовые искажения;

    • Передаточная функция фильтра равна квадрату модуля исходной передаточной функции фильтра;

    • Порядок фильтра вдвое больше порядка фильтра, заданного коэффициентами b и a.

    Функция filtfilt реализует алгоритм, предложенный Густафссоном [1]. Не используйте filtfilt с дифференцирующими и КИХ-фильтрами Гильберта, поскольку работа этих фильтров сильно зависит от их фазовой характеристики.

  • y = filtfilt(sos, g, x)` — выполняет нуль-фазовую фильтрацию входных данных x с использованием фильтра второго порядка (биквадратного), представленного матрицей sos и масштабными значениями g.

  • y = filtfilt(B, A, x, "ctf") — выполняет нуль-фазовую фильтрацию входных данных x c использованием каскадных передаточных функций (Cascaded Transfer Functions, CTF), определяемых коэффициентами числителя и знаменателя B и A соответственно.

    Укажите опцию "ctf", чтобы устранить неоднозначность между матрицей B и матрицей sos, когда вы указываете A как скаляр или вектор.
  • y = filtfilt({B, A, g}, x) — выполняет нуль-фазовую фильтрацию входных данных x c использованием CTF и масштабных значений g.

Аргументы

Входные аргументы

# b — коэффициенты числителя передаточной функции
вектор

Details

Коэффициенты числителя передаточной функции в виде вектора. Если вы используете фильтр со всеми полюсами, то установите b равным 1. Если вы используете фильтр со всеми нулями (КИХ), то установите a равным 1.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Нет

# a — коэффициенты знаменателя передаточной функции
вектор

Details

Коэффициенты знаменателя передаточной функции в виде вектора. Если вы используете фильтр со всеми полюсами, то установите b равным 1. Если вы используете фильтр со всеми нулями (КИХ), то установите a равным 1.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Нет

# x — входной сигнал
вектор | матрица | N-мерный массив

Details

Входной сигнал, заданный как вектор, матрица или N-мерный массив с вещественными или комплексными значениями. Аргумент x должен иметь конечное значение. Длина x должна быть в три раза больше порядка фильтра, определяемого как max(length(B)-1, length(A)-1). Функция действует по первому измерению массива x, если только x не является вектором-строкой. Если x — вектор-строка, то функция действует по второму измерению.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Да

# sos — матрица секций второго порядка
матрица

Details

Коэффициенты секций второго порядка, заданные в виде матрицы. Аргумент sos — это матрица размером на 6, где количество секций должно быть больше или равно 2. Если количество секций меньше 2, то функция обрабатывает входные данные как вектор числителей. Каждая строка sos соответствует коэффициентам фильтра второго порядка (биквадратного), -я строка sos соответствует [bi(1) bi(2) bi(3) ai(1) ai(2) ai(3)].

Типы данных

Float64, Float32

Поддержка комплексных чисел

Нет

# g — масштабные значения
скаляр | вектор

Details

Масштабные значения, заданные как вещественный скаляр или вектор длины , где — количество секций CTF. Масштабные значения представляют собой распределение коэффициента усиления фильтра по секциям каскадного представления фильтра.

Функция filtfilt применяет коэффициент усиления к секциям фильтра с помощью функции scaleFilterSections в зависимости от указанного значения g:

  • скаляр — функция равномерно распределяет коэффициент усиления по всем секциям фильтра.

  • вектор — функция применяет первые значений коэффициента усиления к соответствующим секциям фильтра и равномерно распределяет последнее значение коэффициента усиления по всем секциям фильтра.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Нет

# B — коэффициенты числителя каскадной передаточной функции
скаляр | вектор | матрица

Details

Коэффициенты числителя каскадной передаточной функции (CTF) задаются в виде скаляра, вектора или матрицы.

Размерность B должна быть на , где — количество секций фильтра, — порядок числителей фильтра.

Дополнительную информацию о формате каскадной передаточной функции и матрицах коэффициентов см. в разделе Задание цифровых фильтров в формате CTF.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Да

# A — коэффициенты знаменателя каскадной передаточной функции
скаляр | вектор | матрица

Details

Коэффициенты знаменателя каскадной передаточной функции (CTF) задаются в виде скаляра, вектора или матрицы.

Размерность A должна быть на , где — количество секций фильтра, — порядок знаменателей фильтра.

Дополнительную информацию о формате каскадной передаточной функции и матрицах коэффициентов см. в разделе Задание цифровых фильтров в формате CTF.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Да

Выходные аргументы

# y — отфильтрованный сигнал
вектор | матрица | N-мерный массив

Details

Отфильтрованный сигнал, возвращаемый в виде вектора, матрицы или N-мерного массива.

Функция filtfilt возвращает y того же размера, что и x.

Если какой-либо входной аргумент указан как тип Float32, то filtfilt выполняет операцию фильтрации, используя арифметику с одинарной точностью, и возвращает y как тип Float32. В противном случае filtfilt возвращает y как тип Float64.

Типы данных

Float64, Float32

Поддержка комплексных чисел

Да

Дополнительно

Каскадные передаточные функции

Details

Разделение цифрового БИХ-фильтра на каскадные секции повышает его численную устойчивость и снижает восприимчивость к ошибкам квантования коэффициентов. Каскадная форма передаточной функции через передаточных функций имеет вид:

filtfilt ru

Задание цифровых фильтров в формате CTF

Details

Вы можете задать цифровые фильтры в формате CTF для анализа, визуализации и фильтрации сигналов. Фильтр определяется путем перечисления его коэффициентов B и A. Вы также можете включить коэффициент масштабирования фильтра по секциям, указав g в виде скаляра или вектора.

Коэффициенты фильтра

Когда вы указываете коэффициенты как матрицы с -строками:

, ,

предполагается, что вы указали фильтр как последовательность каскадных передаточных функций, так что полная передаточная функция фильтра равна:

где — порядок числителя фильтра, а — порядок знаменателя.

  • Если и заданы как векторы, то предполагается, что базовая система представляет собой односекционный БИХ-фильтр ( ), где представляет собой числитель передаточной функции, а — ее знаменатель.

  • Если — скаляр, то предполагается, что фильтр представляет собой каскад БИХ-фильтров с полным полюсом, при этом каждая секция имеет общий коэффициент усиления системы, равный .

  • Если — скаляр, то предполагается, что фильтр представляет собой каскад КИХ-фильтров, при этом каждая секция имеет общий коэффициент усиления системы, равный .

Коэффициенты и усиление

Если у вас есть общий коэффициент масштабирования или несколько коэффициентов масштабирования, вынесенных за пределы значений коэффициентов, то вы можете указать коэффициенты и усиление в виде массива ячеек вида {B,A,g}. Масштабирование секций фильтра особенно важно при работе с арифметикой с фиксированной точкой, чтобы гарантировать, что выход каждой секции фильтра будет иметь схожие уровни амплитуды, что помогает избежать неточностей в отклике фильтра из-за ограниченной числовой точности.

Коэффициент усиления может быть общим скалярным коэффициентом усиления или вектором коэффициентов усиления секций.

  • Если коэффициент усиления скалярный, то его значение равномерно применяется ко всем секциям каскадного фильтра.

  • Если коэффициент усиления — вектор, то он должен содержать на один элемент больше, чем количество секций каскадного фильтра. Каждое из первых масштабных значений применяется к соответствующей секции фильтра, а последнее значение применяется равномерно ко всем секциям каскадного фильтра.

Если указать матрицы коэффициентов и вектор усиления как:

, , ,

то предполагается, что передаточная функция системы фильтров равна:

Литература

  1. Gustafsson, F. “Determining the initial states in forward-backward filtering.” IEEE® Transactions on Signal Processing. Vol. 44, April 1996, pp. 988–992. https://doi.org/10.1109/78.492552.

  2. Lyons, Richard G. Understanding Digital Signal Processing. Upper Saddle River, NJ: Prentice Hall, 2004.

  3. Mitra, Sanjit K. Digital Signal Processing. 2nd Ed. New York: McGraw-Hill, 2001.

  4. Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. Discrete-Time Signal Processing. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.