fgoalattain
Рассмотрите разработку линейно-фазового фильтра с конечной импульсной характеристикой (КИХ). Задача состоит в том, чтобы спроектировать lowpass фильтр с величиной одним на всех частотах от 0 до 0,1 Гц и величине нули от 0,15 до 0,5 Гц.
H (f) частотной характеристики для такого фильтра задан как
(1) |
где A (f) - величина частотной характеристики. Одним из решений является применение метода достижения цели к величине частотной характеристики. Учитывая функцию, которая вычисляет величину ,fgoalattain
попытается изменить коэффициенты величины a (n), пока величина ответ не совпадет с желаемым ответом в пределах некоторого допуска. Функция, которая вычисляет величину ответ, приведена в filtmin.m
. Эта функция использует a
, коэффициенты функции величины и w
дискретизация частотного диапазона интересов.
Чтобы настроить задачу достижения цели, необходимо задать goal
и weights
для задачи. Для частот от 0 до 0,1 цель одна. Для частот от 0,15 до 0,5 цель равна нулю. Частоты от 0,1 до 0,15 не заданы, поэтому в этой области значений не нужны цели или веса.
Эта информация хранится в переменной goal
передано в fgoalattain
. Длина goal
совпадает с длиной, возвращаемой функцией filtmin
. Чтобы цели были одинаково удовлетворены, обычно weight
будет установлено значение abs(goal)
. Однако, поскольку некоторые цели равны нулю, эффект от использования weight=abs(goal)
форсирует цели с помощью weight
0, чтобы быть удовлетворенным как жесткие ограничения, и цели с weight
1, возможно, будет недостаточно достигнуто (см. «Метод достижения цели»). Потому что все цели близки по величине, с помощью weight
единство всех целей обеспечит им равный приоритет. (Использование abs(goal)
ибо веса важнее, когда величина goal
отличается более существенно.) Кроме того, установка
options = optimoptions('fgoalattain','EqualityGoalCount',length(goal));
определяет, что каждая цель должна быть как можно ближе к ее значению цели (ни больше, ни меньше).
function y = filtmin(a,w) n = length(a); y = cos(w'*(0:n-1)*2*pi)*a ;
% Plot with initial coefficients a0 = ones(15,1); incr = 50; w = linspace(0,0.5,incr); y0 = filtmin(a0,w); clf, plot(w,y0,'-.b'); drawnow; % Set up the goal attainment problem w1 = linspace(0,0.1,incr) ; w2 = linspace(0.15,0.5,incr); w0 = [w1 w2]; goal = [1.0*ones(1,length(w1)) zeros(1,length(w2))]; weight = ones(size(goal)); % Call fgoalattain options = optimoptions('fgoalattain','EqualityGoalCount',length(goal)); [a,fval,attainfactor,exitflag]=fgoalattain(@(x)filtmin(x,w0),... a0,goal,weight,[],[],[],[],[],[],[],options); % Plot with the optimized (final) coefficients y = filtmin(a,w); hold on, plot(w,y,'r') axis([0 0.5 -3 3]) xlabel('Frequency (Hz)') ylabel('Magnitude Response (dB)') legend('initial', 'final') grid on
Сравните ответ величины, вычисленный с начальными коэффициентами и конечными коэффициентами (Величина ответ с начальным и конечным коэффициентами Величины). Обратите внимание, что вы могли бы использовать firpm
(Signal Processing Toolbox) в программном обеспечении Signal Processing Toolbox™ для разработки этого фильтра.
Величина ответ с начальным и конечным коэффициентами Величины