このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
fgoalattain
を使用した信号処理線形位相有限脉冲响应(杉木)フィルターの設計について考えてみます。問題とするのは0と0.1赫兹間の周波数帯域で振幅1,0.15と0.5 Hz間で振幅0となるローパスフィルターの設計です。
このようなフィルターの周波数応答H (f)は次のように定義されます。
(1) |
ここで(f)は周波数応答の大きさです。1つの解法は、ゴール到達法を周波数応答の大きさに適用するものです。大きさを計算する関数が与えられると、fgoalattain
は大きさの応答がある許容誤差内で希望する応答と一致するまで大きさの係数一个(n)を変化させます。大きさの応答を計算する関数はfiltmin.m
で用意されています。この関数は,一个
(大きさの関数係数)とw
(興味のある周波数領域の離散値)を使用します。
ゴール到達問題を設定するには,問題の目标
と权重
を指定しなければなりません。0および 0.1 間の周波数に対して、ゴールは 1 です。0.15 および 0.5 間の周波数に対して、ゴールは 0 です。0.1 および 0.15 間の周波数に対しては、この範囲でゴールまたは重みを必要としないので指定しません。
この情報は変数目标
に保存され,fgoalattain
に渡されます。目标
の長さは関数filtmin
により戻される長さと同じです。複数のゴールが等価に満足されるためには,通常は重量
をabs(目标)
に設定します。しかし,ゴールのいくつかはゼロなので,重量= abs(目标)
を使用することによって,重量
0をもつ目的関数に厳しい制約を課すものになり,そして重量
1をもつ目的関数がゴール値に到達しない可能性があります(ゴール到達法を参照)。すべてのゴールは同じくらいの大きさであるので、すべてのゴールに重量
を使用すると,ゴールに等しい優先順位を与えます。(重みにabs(目标)
を使用すると,目标
の大きさがより有意に異なるとき的重要性を増します)。また,以下のように設定すると
选择= optimoptions(‘fgoalattain’,‘EqualityGoalCount’,长度(目标);
各目的が可能な限りゴール値に近づく(超えることも小さくなることもない)ようになります。
函数y = filtmin(a,w) n = length(a);Y = cos(w'*(0:n-1)*2*pi)*a;
%作图,初始系数a0 = 1 (15,1);增加= 50;w = linspace(0、0.5、增加);y0 = filtmin (a0, w);clf、情节(w y0。b);drawnow;%设置目标实现问题w1 = linspace(0,0.1,incr);w2 = linspace(0.15, 0.5,增加);W0 = [w1 w2];目标=[1.0 * 1(1,长度(w1)) 0(1,长度(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
(信号处理工具箱)を使用して,このフィルターを設計できることに注意してください。
初期および最終の振幅係数をもつ振幅応答