В этом примере показано, как использовать некоторые ключевые возможности обобщенной функции 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');
Вот рисунок фильтра, рассчитанного на точно заданное значение в полосе. Значение вынуждено быть точно заданным значением 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');
Теперь мы сделаем новый пример полосы нулем, используя три независимые ошибки.
Примечание: Иногда необходимо использовать независимые ошибки приближения, чтобы получить проекты с принудительными внутриполосными значениями для сходимости. Это потому, что аппроксимация полинома в противном случае может оказаться очень недоопределенной. Прежний проект отображается зеленым цветом.
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'
опция, обеспечивается осведомленностью о возможных аномалиях переходных областей в проектируемом фильтре. Вот пример фильтра с аномалией. The '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');
The 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
и intfilt
Вот сравнение, проведенное между фильтром, разработанным с использованием firpm
(синий) и фильтр 30-го порядка, разработанный с использованием intfilt
(зеленый).
Заметьте, что при помощи функции взвешивания в firpm
можно улучшить минимальное затухание в полосе задерживания почти на 20 дБ.
b2 = intfilt(4, 4, 0.4); fvtool(b,1,b2,1,'Color','White');
Заметьте, что затухание равновесия на протяжении второй полосы упора больше, чем минимальное затухание в полосе задерживания фильтра, спроектированного с 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';