主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

fgoalattainを使用した信号処理

線形位相有限脉冲响应(杉木)フィルターの設計について考えてみます。問題とするのは0と0.1赫兹間の周波数帯域で振幅1,0.15と0.5 Hz間で振幅0となるローパスフィルターの設計です。

このようなフィルターの周波数応答H (f)は次のように定義されます。

H f ) n 0 2 h n ) e j 2 π f n 一个 f ) e j 2 π f 一个 f ) n 0 1 一个 n ) 因为 2 π f n ) (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’,长度(目标);

各目的が可能な限りゴール値に近づく(超えることも小さくなることもない)ようになります。

手順1:ファイルfiltmin。mを記述する

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

手順2:最適化ルーチンを呼び出す

%作图,初始系数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(信号处理工具箱)を使用して,このフィルターを設計できることに注意してください。

初期および最終の振幅係数をもつ振幅応答

参考

関連するトピック