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