shingoushori's dialy

音信号処理を専ら研究していた元博士後期課程の学生によるメモ

MATLAB / Octaveで,IIRフィルタの極・零点の位置を算出 -> z平面上にプロット

z平面上にプロットするのであれば, zplane関数で簡単にできてしまいます.
零点-極プロット - MATLAB zplane - MathWorks 日本
zplane関数から,極・零点の位置を抜き出す方法がわからなかった.
そこで,算出しプロットしようと思い立った次第です.

今回は,residue関数のお世話になりました.
部分分数展開と多項式係数間の変換 - MATLAB residue
<追記 20130823> root関数でも位置を求められそうです.
MATLAB 音声信号処理 極・零点配置

<ソースコード>

 
%% set filter coefficient
b=[1.0 0.0 0.0 -0.5];
a=[1.0 0.0 1.0];

%% calculate zero-pole position
[r_b, p_b, k_b]=residue(1,b);
[r_a, p_a, k_a]=residue(1,a);
origin_flag=0;
origin_num=0;
if(length(p_a) > length(p_b))
    origin_flag=-1;
    origin_num=length(p_a)-length(p_b);
    p_b=[p_b', zeros(origin_num,1)']';
elseif(length(p_a) < length(p_b))
    origin_flag=1;
    origin_num=length(p_b)-length(p_a);
    p_a=[p_a', zeros(origin_num,1)']';
end

%% plot
figure;plot( real(p_b), imag(p_b), 'o');
axis([-1.2 1.2 -1.2 1.2]);
axis equal
grid on
hold on
plot( real(p_a), imag(p_a), 'x' );
plot(cos(0:pi/30:2*pi), sin(0:pi/30:2*pi), 'Color', 'black');
legend('zero','pole');
legend('boxon');
xlabel('Real part');
ylabel('Imaginary part');
if(origin_flag ~= 0)
    text(0.05, 0.05, {origin_num});
end
hold off