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™ для разработки этого фильтра.
Величина ответ с начальным и конечным коэффициентами Величины
