MATLABでParks-McCllelanアルゴリズムを用いたFIRフィルタの設計

MATLABのfirpm()関数を使う。
コツはなるべく少ない点数でリファレンスとなる理想フィルタの挙動を指定すること。この例では4点を用いている。試しに30点でやるとリプルが非常に大きくなる。
追記:分割数が問題というより、刻みを大きくすると転移域の傾斜が大きくなりすぎるということか。転移域の点を内挿して計算してやればリプルの発散を避けられると思われる。

clear; close all;

%Parks-McCllelan方による低域FIRフィルタの設計
wc = pi/2;
wd = pi/2+pi/10;
omega = [0 wc wd pi];
Href = [1 1 0 0];
N = 40;
plot(omega, Href,'o-');
hk = firpm(N, omega/max(omega), Href);
[h, w] = freqz(hk,1,512);
hold on;
plot(w,abs(h))
title('理想フィルタを4点で表現');
big;

%30点で実験
wc = pi/2;
wd = pi/2+pi/10;
div = 30;
omega = linspace(0,pi,div);
Href = zeros(size(omega));
Href(find(omega<wc)) = 1;
N = 40;
figure();
plot(omega, Href,'o-');
hk = firpm(N, omega/max(omega), Href);
[h, w] = freqz(hk,1,512);
hold on;
plot(w,abs(h))
title(sprintf('理想フィルタを%d点で表現',div));
big;