В этом примере показано, как использовать некоторые из ключевых функций обобщенной функции проектирования FIR-фильтра Ремеза. Эта функция предоставляет все функциональные возможности, включенные в firpm плюс множество дополнительных функций, представленных здесь.
Ниже приведена иллюстрация взвешенно-чебышевской конструкции. В этом примере показана совместимость firgr с firpm.
N = 22; % Filter order F = [0 0.4 0.5 1]; % Frequency vector A = [1 1 0 0]; % Magnitude vector W = [1 5]; % Weight vector b = firgr(N,F,A,W); fvtool(b,'Color','White');

Ниже приведена взвешенная конструкция Чебышева, в которой явно указан фильтр типа 4 (нечетный, асимметричный).
N = 21; % Filter order F = [0 0.4 0.5 1]; % Frequency vector A = [0 0 1 1]; % Magnitude vector W = [2 1]; % Weight vector b = firgr(N,F,A,W,'4'); fvtool(b,'Color','White');

Ниже показана конструкция типа «наименьших квадратов». Пользовательская функция частотного отклика (taperedresp.m) используется для взвешивания ошибок.
N = 53; % Filter order F = [0 0.3 0.33 0.77 0.8 1]; % Frequency vector fresp = {@taperedresp, [0 0 1 1 0 0]}; % Frequency response function W = [2 2 1]; % Weight vector b = firgr(N,F,fresp,W); fvtool(b,'Color','White');

Это иллюстрация фильтра, разработанного для указанных одноточечных диапазонов. Точки частоты f = 0,25 и f = 0,55 являются однополосными точками. Эти очки имеют выигрыш, который приближается к нулю.
Другие кромки полосы нормальны.
N = 42; % Filter order F = [0 0.2 0.25 0.3 0.5 0.55 0.6 1]; % Frequency vector A = [1 1 0 1 1 0 1 1]; % Magnitude vector S = {'n' 'n' 's' 'n' 'n' 's' 'n' 'n'}; b = firgr(N,F,A,S); fvtool(b,'Color','White');

Вот иллюстрация фильтра, предназначенного для точно заданного внутриполосного значения. Значение должно быть точно указанным значением 0,0 при f = 0,06.
Это можно использовать для отбраковки 60 Гц (при Fs = 2 кГц). Край полосы 0,055 является неопределенным, поскольку он должен примыкать к следующей полосе.
N = 82; % Filter order F = [0 0.055 0.06 0.1 0.15 1]; % Frequency vector A = [0 0 0 0 1 1]; % Magnitude vector S = {'n' 'i' 'f' 'n' 'n' 'n'}; b = firgr(N,F,A,S); fvtool(b,'Color','White', 'MagnitudeDisplay', 'Zero-phase');

Ниже приведен пример создания фильтра с использованием нескольких независимых аппроксимационных ошибок. Этот метод используется для непосредственного проектирования фильтров с избыточной и максимальной пульсацией. Одним из интересных свойств этих фильтров является локальная минимальная ширина переходной области. Кроме того, эти конструкции в целом очень быстро сходятся.
N = 12; % Filter order F = [0 0.4 0.5 1]; % Frequency vector A = [1 1 0 0]; % Magnitude vector W = [1 1]; % Weight vector E = {'e1' 'e2'}; % Approximation errors b = firgr(N,F,A,W,E); fvtool(b,'Color','White');

Вот иллюстрация внеполосного полосового фильтра, имеющего две независимые ошибки аппроксимации: одна общая для двух полос пропускания, а другая для полосы останова (синего цвета). Для сравнения также нанесена стандартная взвешенно-чебышевская конструкция (зелёным цветом).
N = 28; % Filter order F = [0 0.4 0.5 0.7 0.8 1]; % Frequency vector A = [1 1 0 0 1 1]; % Magnitude vector W = [1 1 2]; % Weight vector E = {'e1','e2','e1'}; % Approximation errors b1 = firgr(N,F,A,W,E); b2 = firgr(N,F,A,W); fvtool(b1,1,b2,1,'Color','White');

Теперь мы повторим наш пример in-band-zero, используя три независимые ошибки.
Примечание.Иногда необходимо использовать независимые аппроксимационные ошибки, чтобы получить конструкции с принудительными внутриполосными значениями для схождения. Это потому, что аппроксимирующий многочлен в противном случае может быть очень недооценен. Прежний дизайн отображается зеленым цветом.
N = 82; % Filter order F = [0 0.055 0.06 0.1 0.15 1]; % Frequency vector A = [0 0 0 0 1 1]; % Magnitude vector S = {'n' 'i' 'f' 'n' 'n' 'n'}; W = [10 1 1]; % Weight vector E = {'e1' 'e2' 'e3'}; % Approximation errors b1 = firgr(N,F,A,S,W,E); b2 = firgr(N,F,A,S); fvtool(b1,1,b2,1,'Color','White');

С помощью 'check' один из вариантов позволяет узнать о возможных аномалиях переходной области в проектируемом фильтре. Вот пример фильтра с аномалией. 'check' опция предупреждает одну из этих аномалий: Также можно получить вектор результатов res.edgeCheck. Любые нулевые элементы в этом векторе указывают места вероятных аномалий. Записи «-1» предназначены для не проверенных ребер (не может быть аномалии при f = 0 или f = 1).
N = 44; % Filter order F = [0 0.3 0.4 0.6 0.8 1]; % Frequency vector A = [1 1 0 0 1 1]; % Magnitude vector b = firgr(N,F,A,'check');
Warning: Probable transition-region anomalies. Verify with freqz.
fvtool(b,'Color','White');

firpm алгоритм многократно проектирует фильтры до первой итерации, в которой выполняются спецификации. Спецификации удовлетворяются при выполнении всех требуемых ограничений. Путем указания 'minorder', firpmord используется для получения начальной оценки. Есть также 'mineven' и 'minodd' для получения конструкций фильтров с минимальным или нечетным порядком.
F = [0 0.4 0.5 1]; % Frequency vector A = [1 1 0 0]; % Magnitude vector R = [0.1 0.02]; % Deviation (ripple) vector b = firgr('minorder',F,A,R); fvtool(b,'Color','White', 'MagnitudeDisplay', 'Zero-phase');

При использовании функции минимального порядка можно выполнить начальную оценку порядка фильтрации. Если это так, то firpmord не будет использоваться. Это необходимо для фильтров, которые firpmord не поддерживает, например, дифференциаторы и трансформаторы Гильберта, а также пользовательские функции частотной характеристики.
N = {'mineven',18}; % Minimum even-order, start order estimate at 18
F = [0.1 0.9]; % Frequency vector
A = [1 1]; % Magnitude vector
R = 0.1; % Deviation (ripple)
b = firgr(N,F,A,R,'hilbert');
fvtool(b,'Color','White', 'FrequencyRange', '[0, 2pi)');
Этот раздел иллюстрирует использование интерполяционного фильтра для повышающей дискретизации сигналов с ограниченной полосой на целочисленный коэффициент. Обычно используется intfilt(r,l,alpha) из Toolbox™ обработки сигналов для этого. Однако intfilt не дает такой гибкости в дизайне, как firgr.
N = 30; % Filter order F = [0 0.1 0.4 0.6 0.9 1]; % Frequency vector A = [4 4 0 0 0 0]; % Magnitude vector W = [1 100 100]; % Weight vector b = firgr(N,F,A,W); fvtool(b,'Color','White');

firpm и intfiltНиже приведено сравнение между фильтром, разработанным с использованием firpm (синий) и фильтр 30-го порядка, разработанный с использованием intfilt (зеленый).
Обратите внимание, что с помощью функции взвешивания в firpm, можно улучшить минимальное затухание полосы останова почти на 20 дБ.
b2 = intfilt(4, 4, 0.4); fvtool(b,1,b2,1,'Color','White');

Обратите внимание, что равномерное затухание во второй полосе останова больше, чем минимальное затухание полосы останова фильтра, сконструированного с помощью intfilt примерно на 6 дБ. Обратите внимание также, что полоса пропускания пульсирует, хотя и больше, чем у фильтра, разработанного с помощью intfilt, все еще очень маленький.
Вот иллюстрация фильтра нижних частот минимальной фазы.
N = 42; % Filter order F = [0 0.4 0.5 1]; % Frequency vector A = [1 1 0 0]; % Magnitude vector W = [1 10]; % Weight-constraint vector b = firgr(N,F,A,W, {64},'minphase'); hfvt = fvtool(b,'Color','White');
График полюса/нуля показывает, что за пределами единичной окружности нет корней.
hfvt.Analysis = 'polezero';