В этом примере показано, как использовать некоторые ключевые возможности обобщенной КИХ-функции создания фильтра 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';