Обработка сигналов с использованием fgoalattain

Рассмотрите разработку линейно-фазового фильтра с конечной импульсной характеристикой (КИХ). Задача состоит в том, чтобы спроектировать lowpass фильтр с величиной одним на всех частотах от 0 до 0,1 Гц и величине нули от 0,15 до 0,5 Гц.

H (f) частотной характеристики для такого фильтра задан как

H(f)=n=02Mh(n)ej2πfn=A(f)ej2πfM,A(f)=n=0M1a(n)cos(2πfn),(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)); 

определяет, что каждая цель должна быть как можно ближе к ее значению цели (ни больше, ни меньше).

Шаг 1: Запись файла filtmin.m

function y = filtmin(a,w)
n = length(a);
y = cos(w'*(0:n-1)*2*pi)*a ;

Шаг 2: Активируйте стандартную программу оптимизации

% 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™ для разработки этого фильтра.

Величина ответ с начальным и конечным коэффициентами Величины

См. также

Похожие темы