Этот пример показывает, как использовать некоторые ключевые возможности обобщенной КИХ-функции проекта фильтра Remez. Эта функция обеспечивает всю функциональность, включенную в 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');
Вот рисунок фильтра, разработанного для точно заданного внутриполосного значения. Значение обеспечено, чтобы быть EXACTLY заданное значение 0,0 в f=0.06.
Это могло использоваться для отклонения на 60 Гц (с Фс = 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');
Вот пример разработки фильтра с помощью нескольких независимых ошибок приближения. Этот метод используется, чтобы непосредственно разработать дополнительную пульсацию и максимальные фильтры пульсации.
Одно из интересных свойств, которые имеют эти фильтры, является шириной области перехода, которая локально минимальна. Далее, эти проекты сходятся VERY быстро в целом.
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');
Мы теперь восстановим наше использование в качестве примера "в нуле полосы" три независимых ошибки.
Примечание: иногда необходимо использовать независимые ошибки приближения заставить проекты с принудительными внутриполосными значениями сходиться. Это вызвано тем, что полином приближения мог в противном случае прибыться очень недоопределенный. Бывший проект отображен в зеленом.
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');
С опцией 'проверки' каждый сделан знающий о возможных аномалиях области перехода в фильтре, который разрабатывается. Вот пример фильтра с аномалией. Опция 'проверки' предупреждает одну из этой аномалии: Каждый также получает вектор результатов 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'); fvtool(b,'Color','White');
Warning: Probable transition-region anomalies. Verify with freqz.
Алгоритм 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) от Signal Processing 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, и 30-й фильтр порядка разработал использование (зеленый) INTFILT.
Заметьте, что при помощи функции взвешивания в FIRPM, можно улучшить минимальное затухание полосы задерживания почти на 20 дБ.
b2 = intfilt(4, 4, 0.4); fvtool(b,1,b2,1,'Color','White');
Заметьте в этом, затухание equi-пульсации во второй полосе задерживания больше, чем минимальное затухание полосы задерживания фильтра, разработанного с INTFILT приблизительно на 6 дБ.
Заметьте также, что пульсация полосы пропускания, несмотря на то, что больше, чем тот из фильтра, разработанного с INTFILT, является все еще очень маленькой.
Вот является рисунок минимальной фазы lowpass фильтром
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';