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

firpm

Проектирование оптимального КИХ-фильтра методом Паркса-Макклеллана.

Библиотека

EngeeDSP

Синтаксис

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

  • b, err, res = firpm(n, f, a) — возвращает вектор-строку b, содержащую n+1 коэффициентов КИХ-фильтра порядка n, максимальное отклонение амплитудной характеристики от желаемой err и частотную характеристику в виде структуры res. Частотные и амплитудные характеристики полученного фильтра соответствуют векторам f и a.

  • b, err, res = firpm(n, f, a, w) — использует весовые коэффициенты w для частотных интервалов.

  • b, err, res = firpm(n, f, a, lgrid) — использует целочисленное значение lgrid для управления плотностью частотной сетки.

  • b, err, res = firpm(n, f, fresp, w) — проектирует КИХ-фильтр, амплитудные характеристики которого соответствуют характеристике, заданной функцией fresp.

  • b, err, res = firpm(n, f, fresp, w, ftype) — проектирует антисимметричные (нечетные) фильтры, где ftype определяет тип фильтра. Если ftype не указан, то fresp использует свойства симметрии по умолчанию.

Аргументы

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

# n — порядок фильтра
положительное целое число

Details

Порядок фильтра, заданный как положительное целое число.

Типы данных

Int64

# f — нормированные значения частоты
вектор | матрица

Details

Нормированные значения частоты, заданные как вектор или матрица размерностью на 1. Значения должны находиться в диапазоне [0, 1], где 1 соответствует частоте Найквиста. Количество элементов вектора всегда кратно 2. Частоты должны быть расположены в порядке возрастания.

Типы данных

ComplexF64

# a — желаемая амплитудная характеристика
вектор | матрица

Details

Желаемая амплитуда в соответствующих точках f, заданная как вектор или матрица размерностью на 1. Размерности a и f должны совпадать. Размерность должна быть четным числом.

  • На отрезках с нечетным индексом интерполяция линейная.

  • На отрезках с четным индексом поведение не определено (переходные зоны).

Типы данных

ComplexF64

# w — весовые коэффициенты
вектор | матрица

Details

Весовые коэффициенты, используемые для настройки аппроксимации в каждой полосе частот, задаются как вектор или матрица размерностью на 1. Длина вектора w составляет половину длины f и a, поэтому на каждую полосу приходится ровно одно значение весового коэффициента.

Типы данных

ComplexF64

# ftype — тип фильтра
"hilbert" | "differentiator" | "multiband" | "lowpass" | "highpass" | "bandpass" | "bandstop" | "invsinc"

Details

Тип фильтра для расчета линейно-фазовых фильтров с нечетной симметрией (тип III или IV):

  • "hilbert" — фильтр Гильберта: ;

    Пример расчета приближенного КИХ трансформатора Гильберта длинной 31:

    h = firpm(30,[0.1; 0.9],[1; 1],"hilbert")
  • "differentiator" — производный фильтр с весами, обратно пропорциональными частоте;

  • "multiband" — многополосный фильтр;

  • "lowpass" — фильтр низких частот (ФНЧ);

  • "highpass" — фильтр высоких частот (ФВЧ);

  • "bandpass" — полосовой фильтр;

  • "bandstop" — режекторный (заграждающий) фильтр;

  • "invsinc" — инверсный sinc-фильтр.

Типы данных

String

# lgrid — плотность частотной сетки
16 (по умолчанию) | скаляр

Details

Плотность частотной сетки, которая содержит примерно (lgrid*n)/(2*bw) точек, где bw — это доля общего интервала частотного диапазона [0, 1], охватываемая f. Увеличение lgrid часто приводит к получению фильтров, которые точнее соответствуют фильтрам с характеристикой с равномерным уровнем пульсаций, но требуют больше времени для вычисления. Значение по умолчанию 16 — это минимальное значение, которое следует указывать для lgrid.

Типы данных

IntF64

# fresp — частотная характеристика
функция

Details

Используется, чтобы задать желаемую амплитуду как функцию, а не как набор значений.

Функция firpm вызывает fresp следующим образом:

dh, dw = fresp(n, f, gf, w)

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

  • n — порядок фильтра;

  • f — вектор границ полос, значения от 0 до 1 (где 1 — это частота Найквиста);

  • gf — сетка частот, на которой необходимо вычислить желаемую характеристику;

  • w — вектор весовых коэффициентов, по одному на каждую полосу (если не указан, то w = ones(…​)).

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

  • dh — желаемая частотная характеристика, рассчитанная на частотной сетке gf;

  • dw — вектор весовых коэффициентов, соответствующих gf, обычно повторяющий w на соответствующих участках.

Пример функции fresp:

function fresp(
    n::Int,
    f::AbstractArray{<:Real},
    gf::AbstractArray{<:Real},
    w::AbstractArray{<:Real}
)
    dh = Float64.((gf .>= f[1]) .& (gf .<= f[2]))	# The frequency response is equal to 1 in the band [f[1], f[2]]
    dw = ones(length(gf)) .* w[1] 					# The weight is the same across the band
    return dh, dw
end

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

# b — коэффициенты фильтра
вектор | матрица

Details

Коэффициенты фильтра, возвращаемые как вектор или матрица размерностью n+1 на 1.

Типы данных

ComplexF64

# err — максимальное отклонение амплитудной характеристики от желаемой
вещественный скаляр

Details

Максимальное отклонение амплитудной характеристики от желаемой, возвращаемое в виде скаляра.

# res — частотная характеристика
структура

Details

Частотная характеристика, возвращаемая в виде структуры. Структура res имеет следующие поля:

  • res.fgrid — вектор частотной сетки, используемый для оптимизации конструкции фильтра;

  • res.des — желаемая частотная характеристика для каждой точки res.fgrid;

  • res.wt — весовые коэффициенты в каждой точке res.fgrid;

  • res.H — полученная частотная характеристика для каждой точки res.fgrid;

  • res.error — ошибка для каждой точки res.fgrid (res.des-res.H);

  • res.iextr — вектор индексов экстремальных частот в res.fgrid;

  • res.fextr — вектор экстремальных частот.

Советы

Если фильтр не сходится, возможно, он спроектирован неправильно. Верифицируйте правильность расчета, проверив частотную характеристику.

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

  • Увеличьте порядок фильтра.

  • Смягчите расчет фильтра, уменьшив затухание в полосах задерживания и/или расширив переходные области.

Алгоритмы

Функция firpm проектирует КИХ-фильтр с линейной фазовой характеристикой, используя алгоритм Паркса-Макклеллана [2]. Алгоритм Паркса-Макклеллана использует алгоритм замены Ремеза и теорию приближений Чебышева для проектирования фильтров с оптимальным соответствием между желаемой и фактической частотными характеристиками. Фильтры оптимальны в том смысле, что максимальная ошибка между желаемой и фактической частотными характеристиками минимизирована. Фильтры, разработанные таким образом, демонстрируют частотную характеристику с равномерным уровнем пульсаций. Функция firpm демонстрирует разрывы в начале и конце своей импульсной характеристики из-за одного уровня пульсации.

Это фильтры с линейной фазовой характеристикой типа I (n нечетное) и типа II (n четное). Векторы f и a задают частотно-амплитудные характеристики фильтра:

  • f — вектор пар частотных точек, заданных в диапазоне от 0 до 1, где 1 соответствует частоте Найквиста. Частоты должны быть расположены в порядке возрастания.

  • a — вектор, содержащий искомую амплитуду в точках, указанных в f.

    Искомая функция амплитуды на частотах между парами точек при нечетном — это отрезок прямой, соединяющий точки и .

    Искомая функция амплитуды на частотах между парами точек при четном не определена. Это переходные или не имеющие значения области.

  • f и a имеют одинаковую длину. Эта длина должна быть четным числом.

Функция firpm всегда использует четный порядок фильтра для конфигураций с четной симметрией и ненулевой полосой пропускания на частоте Найквиста. Причина четного порядка фильтра заключается в том, что для импульсных характеристик с четной симметрией и нечетными порядками частотная характеристика на частоте Найквиста обязательно равна 0. Если указано нечетное значение n, то firpm увеличивает его на 1.

Функция firpm проектирует фильтры с линейной фазовой характеристикой типов I, II, III и IV. Типы I и II используются по умолчанию для четного и нечетного n соответственно, в то время как типы III (n четное) и IV (n нечетное) задаются с помощью аргумента ftype с использованием "hilbert" или "differentiator" соответственно. Различные типы фильтров имеют различную симметрию и определенные ограничения на свои частотные характеристики. (Подробнее см. [3]).

Тип фильтра с линейной фазовой характеристикой Порядок фильтра Симметрия коэффициентов (Найквист)

Тип I

Четный

Четные:

Нет ограничений

Нет ограничений

Тип II

Нечетный

Четные:

Нет ограничений

Функция firpm увеличивает порядок фильтра на 1, если вы пытаетесь построить фильтр типа II с ненулевой полосой пропускания на частоте Найквиста.

Тип III

Четный

Нечетные:

Тип IV

Нечетный

Нечетные:

Нет ограничений

Литература

  1. Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Selected Papers in Digital Signal Processing. Vol. II. New York: IEEE Press, 1976.

  2. Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979, algorithm 5.1.

  3. Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Discrete-Time Signal Processing. Upper Saddle River, NJ: Prentice Hall, 1999, p. 486.

  4. Parks, Thomas W., and C. Sidney Burrus. Digital Filter Design. New York: John Wiley & Sons, 1987, p. 83.

  5. Rabiner, Lawrence R., James H. McClellan, and Thomas W. Parks. «FIR Digital Filter Design Techniques Using Weighted Chebyshev Approximation.» Proceedings of the IEEE®. Vol. 63, Number 4, 1975, pp. 595–610.