チェビシェフフィルタの設計法を理解して実装する

通信受信機で隣のチャネルの強い妨害波を落としたいとき、あるいはセンサ信号から高周波ノイズだけを切り捨てたいとき、私たちは「ここまでの周波数は通し、その先は急に落とす」フィルタが欲しくなります。ところが現実のアナログ素子で「通過域は完全に平ら、遮断は崖のように垂直」という理想のフィルタは作れません。必ず、ある程度の次数(部品点数)で、ある程度の遷移幅をもったフィルタになります。

そこで生まれるのが「同じ次数なら、どこで妥協すれば遮断を最も急峻にできるか」という設計問題です。バタワースフィルタは「通過域をとにかく平らに」を選びました。一方、チェビシェフフィルタは「通過域にわざと小さな波打ち(リップル)を許す代わりに、遮断を急峻にする」という大胆な妥協をします。この一手で、同じ次数でもバタワースよりはるかに鋭い肩特性が得られるのです。

チェビシェフフィルタは、アナログ無線回路(IF段の帯域制限)、レーダーの受信フィルタ、オーディオのクロスオーバー、生体信号計測の前処理など、「部品を増やさず遮断を稼ぎたい」あらゆる場面で使われます。本記事では、その心臓部であるチェビシェフ多項式 $T_n(x)$ の性質から出発し、振幅特性の設計式、極が楕円上に並ぶことの導出まで数式を省略せずにたどり、最後に scipy.signal.cheby1 で振幅・群遅延・極零配置を求めてバタワースと比較します。

チェビシェフフィルタとバタワースフィルタのトレードオフ概念図: 通過域の平坦さと遮断急峻さの比較

左のバタワースは通過域が完全に平らですが、遮断はなだらかです。右のチェビシェフは通過域に均等な波打ち(等リップル)が現れる代わりに、カットオフ以降の落ち込みが急峻になっています。この「どちらに予算を使うか」の差が、二つのフィルタの本質的な違いです。チェビシェフを選ぶ動機は、部品点数を節約しながら鋭い遮断を実現したいときに凝縮されます。

本記事の内容

  • チェビシェフ多項式 $T_n(x)$ の漸化式と等リップル性の導出
  • 振幅特性 $|H(j\omega)|^2 = 1/(1 + \varepsilon^2 T_n^2(\omega/\omega_c))$ の意味
  • 通過域リップル $\varepsilon$ と次数 $n$ を所望仕様から決める設計式
  • 極が楕円上に並ぶことの導出
  • scipy.signal.cheby1 による振幅・群遅延・極零配置の可視化
  • 同次数バタワースとの遮断急峻性・リップルのトレードオフの読み取り

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

特に、伝達関数 $H(s)$ や $H(j\omega)$、極と零点、振幅応答 $|H(j\omega)|$ の意味は本記事の前提とします。これらに不安があれば、上のディジタルフィルタの基礎の記事で振幅応答と極・零点の関係を確認しておくとスムーズです。

チェビシェフフィルタとは

まず「なぜわざわざ通過域を波打たせるのか」という素朴な疑問から始めましょう。フィルタ設計には、いつでもついて回る根本的なトレードオフがあります。それは「与えられた次数(=部品点数や計算量)という限られた予算を、どの性能に振り分けるか」という問題です。フィルタの性能には主に三つの軸があります。通過域の平坦さ、遮断の急峻さ、そして阻止域の落ち込みです。次数が同じなら、これらをすべて同時に最高にすることはできません。どこかを良くすれば、どこかが悪くなります。

バタワースフィルタは「通過域を最大限平らにする(最大平坦特性)」を選んだフィルタです。その代償として、肩(カットオフ付近)がなだらかで、遮断はそれほど急ではありません。これに対しチェビシェフフィルタは発想を逆転させます。「通過域はどうせ完璧には平らにできない。それなら、いっそ通過域全体に均等な高さの小さな波(等リップル)を許してしまおう。そのぶん遮断を急峻にできる」と考えるのです。

ここで効いてくるのが「等リップル(equiripple)」という言葉です。リップルの山と谷の高さがすべて同じ、という性質が重要です。もし波打ちの一部だけが大きいと、その箇所だけ仕様を満たさず損になります。リップルを通過域全体に均等にばらまけば、許容できる最大のリップル高さをめいっぱい使い切れるので、無駄がありません。この「均等にばらまく」を数学的に実現する特別な関数こそが、これから見るチェビシェフ多項式 $T_n(x)$ です。

直感的なイメージとしては、こうです。バタワースは通過域でずっと「ほぼ1」のまま静かに過ごし、最後まで余力を温存します。チェビシェフは通過域で「1とちょっと小さい値の間」を $n$ 回きっちり往復し、許された波打ちの予算を使い切ってから、その勢いで一気に遮断域へ落ちていきます。予算を温存するバタワースより、予算を使い切るチェビシェフのほうが、出口(遮断)で鋭くなる——これがチェビシェフフィルタの本質です。

次の節では、この「均等にばらまく波」を作る数学的な部品、チェビシェフ多項式の性質を丁寧に見ていきます。これが分かれば、なぜ通過域でリップルが等しくなるのかが手に取るように理解できます。

チェビシェフフィルタの次数nとリップル本数・遮断特性の関係

左図を見ると、次数 $n$ が上がるにつれて振幅特性の遷移帯域が急峻になっていきます。右図(通過域の拡大)では、リップルの山と谷の数がちょうど $n$ 個に対応していることが確認できます。これはチェビシェフ多項式が $[-1,1]$ の中で $n$ 回往復するという性質の直接の反映です。

チェビシェフ多項式の定義と性質

三角関数からの定義

チェビシェフ多項式は、一見すると三角関数の変装です。$|x| \le 1$ の範囲で、$n$ 次のチェビシェフ多項式 $T_n(x)$ は次のように定義されます。

$$ T_n(x) = \cos\left(n \arccos x\right), \quad |x| \le 1 $$

この定義は奇妙に見えるかもしれません。$\arccos x$ で角度に変換し、それを $n$ 倍してから $\cos$ を取る、という三段構えです。なぜこれが「多項式」になるのか、まずは小さい $n$ で確かめてみましょう。$\theta = \arccos x$ とおくと $x = \cos\theta$ で、$T_n(x) = \cos(n\theta)$ です。

$n = 0$ のとき、$T_0(x) = \cos 0 = 1$ です。$n = 1$ のとき、$T_1(x) = \cos\theta = x$ です。たしかに多項式になっています。$n = 2$ のときは、倍角公式 $\cos 2\theta = 2\cos^2\theta – 1$ を使うと

$$ T_2(x) = \cos 2\theta = 2\cos^2\theta – 1 = 2x^2 – 1 $$

となり、これも $x$ の2次多項式です。$\cos(n\theta)$ は $\cos\theta$ の多項式で書ける、という事実(これ自体が三角関数の重要な性質です)のおかげで、$T_n(x)$ は必ず $n$ 次の多項式になります。

漸化式の導出

毎回倍角公式を使うのは大変なので、すべての $T_n$ を機械的に生む漸化式を導きましょう。出発点は三角関数の和積に関する恒等式です。任意の角度 $A, B$ について

$$ \cos(A+B) + \cos(A-B) = 2\cos A \cos B $$

が成り立ちます。ここで $A = n\theta$、$B = \theta$ と代入すると

$$ \cos((n+1)\theta) + \cos((n-1)\theta) = 2\cos(n\theta)\cos\theta $$

となります。ここで左辺と右辺をそれぞれチェビシェフ多項式の言葉に翻訳します。$\cos((n+1)\theta) = T_{n+1}(x)$、$\cos((n-1)\theta) = T_{n-1}(x)$、$\cos(n\theta) = T_n(x)$、そして $\cos\theta = x$ ですから、上式は

$$ T_{n+1}(x) + T_{n-1}(x) = 2x\, T_n(x) $$

と書き換えられます。$T_{n+1}$ について解けば、目的の漸化式が得られます。

$$ \boxed{\;T_{n+1}(x) = 2x\, T_n(x) – T_{n-1}(x)\;} $$

初期値 $T_0(x) = 1$、$T_1(x) = x$ と組み合わせれば、どんな次数の $T_n$ も足し算と掛け算だけで計算できます。実際にいくつか書き下すと

$$ \begin{aligned} T_2(x) &= 2x \cdot x – 1 = 2x^2 – 1 \\ T_3(x) &= 2x(2x^2 – 1) – x = 4x^3 – 3x \\ T_4(x) &= 2x(4x^3 – 3x) – (2x^2 – 1) = 8x^4 – 8x^2 + 1 \end{aligned} $$

となります。最高次の係数が $2^{n-1}$($n \ge 1$)になっていることにも注目してください。これは漸化式で毎回 $2x$ を掛けることから来ています。

区間 $|x| \le 1$ での等リップル性

ここがチェビシェフ多項式の核心です。定義 $T_n(x) = \cos(n\arccos x)$ を見れば、$|x| \le 1$ のとき $\arccos x$ は実数の角度なので、$\cos$ の値は必ず $-1$ から $1$ の間に収まります。つまり

$$ -1 \le T_n(x) \le 1, \quad |x| \le 1 $$

です。しかも単に「収まる」だけではありません。$\theta = \arccos x$ が $0$ から $\pi$ まで動くとき、$n\theta$ は $0$ から $n\pi$ まで動き、$\cos(n\theta)$ はその間に $+1$ と $-1$ の極値をちょうど合計 $n+1$ 回(端点を含む)取りながら何度も往復します。つまり $T_n(x)$ は区間 $[-1, 1]$ の中で、振幅 $1$ ぴったりの波打ちを $n$ 回繰り返すのです。山も谷もすべて高さが $\pm1$ で揃っている——これが「等リップル」の正体です。

一方、$|x| > 1$ の外側ではまったく様子が変わります。$|x| > 1$ では $\arccos x$ が実数ではなくなるので、定義を双曲線関数に切り替えます。$x = \cosh u$ とおくと

$$ T_n(x) = \cosh(n\, \mathrm{arccosh}\, x), \quad |x| > 1 $$

となります。$\cosh$ は引数が増えると指数関数的に大きくなるので、$|x| > 1$ では $T_n(x)$ は急激に増大します。具体的には $x$ が大きいところで $T_n(x) \approx 2^{n-1} x^n$ となり、次数 $n$ が高いほど急峻に伸びていきます。

この「内側では振幅1で等しく波打ち、外側では爆発的に立ち上がる」という二つの顔こそが、チェビシェフフィルタの設計にそのまま使われます。内側($|x|<1$)を通過域、外側($|x|>1$)を遮断域に対応させれば、通過域では均等なリップル、遮断域では急峻な減衰という、まさに欲しかった特性が手に入るのです。

次の節では、この $T_n(x)$ を振幅特性の式に組み込んで、実際のフィルタの形にしていきます。

チェビシェフ多項式T_n(x)の等リップル性: 区間|x|≦1で振幅1の往復と外側での急増

金色の帯で示した $|x| \le 1$ の通過域に対応する領域では、すべての次数の $T_n(x)$ が $\pm1$ の破線内に完全に収まり、山と谷の高さが揃った等リップルの波打ちを繰り返しています。$|x| > 1$ の外側では次数が高いほど急激に発散しており、この「内外の顔の違い」がそのままフィルタの通過域リップルと遮断急峻さに翻訳されます。

チェビシェフフィルタの振幅特性

振幅二乗特性の定義

前節で見た $T_n(x)$ の二つの顔を、そのまま振幅特性に埋め込みます。低域通過チェビシェフフィルタ(I型)の振幅二乗特性は次式で定義されます。

$$ |H(j\omega)|^2 = \frac{1}{1 + \varepsilon^2\, T_n^2\!\left(\dfrac{\omega}{\omega_c}\right)} $$

ここで $\omega_c$ はカットオフ角周波数、$n$ はフィルタ次数、$\varepsilon$ はリップルの大きさを決める正のパラメータです。この式が何をしているのかを丁寧に読み解きましょう。

分母に注目します。$T_n$ の引数は $\omega/\omega_c$ という正規化周波数です。通過域、すなわち $\omega < \omega_c$ では $\omega/\omega_c < 1$ なので、前節で見たとおり $T_n^2(\omega/\omega_c)$ は $0$ から $1$ の間で振動します。したがって分母 $1 + \varepsilon^2 T_n^2$ は $1$ と $1 + \varepsilon^2$ の間で振動し、$|H|^2$ は $1$ と $1/(1+\varepsilon^2)$ の間で波打ちます。これが通過域リップルです。$T_n^2$ が $n$ 回振動するので、リップルの数もちょうど $n$ 個になります。

一方、遮断域 $\omega > \omega_c$ では $\omega/\omega_c > 1$ なので $T_n$ は急激に増大し、$T_n^2$ も爆発的に大きくなります。すると分母が巨大になり、$|H|^2$ は急速に $0$ へ落ちていきます。これが急峻な遮断です。$\omega = \omega_c$ ちょうどでは $T_n(1) = \cos(n\arccos 1) = \cos 0 = 1$ なので

$$ |H(j\omega_c)|^2 = \frac{1}{1 + \varepsilon^2} $$

となります。つまりカットオフ周波数では、利得がリップルの下端と同じ値になります。バタワースでは $\omega_c$ で必ず $-3\,\mathrm{dB}$ でしたが、チェビシェフではリップル量 $\varepsilon$ に応じてカットオフでの利得が変わる、という点が大きな違いです。

リップル係数 $\varepsilon$ と通過域リップル量の関係

設計仕様は通常「通過域のリップルを $R_p$ dB 以内に抑える」という形で与えられます。この $R_p$ から $\varepsilon$ を求めましょう。通過域での利得の最大値は $|H|^2 = 1$(つまり $0$ dB)、最小値は $|H|^2 = 1/(1+\varepsilon^2)$ です。リップル量はこの最大と最小の差で、デシベルで表すと

$$ R_p = 10 \log_{10}\!\left(\frac{|H|^2_{\max}}{|H|^2_{\min}}\right) = 10\log_{10}\!\left(\frac{1}{1/(1+\varepsilon^2)}\right) = 10\log_{10}\left(1 + \varepsilon^2\right) $$

となります。ここから $\varepsilon$ について解きます。両辺を $10$ で割って $10$ のべき乗に戻すと $1 + \varepsilon^2 = 10^{R_p/10}$ なので

$$ \boxed{\;\varepsilon = \sqrt{10^{R_p/10} – 1}\;} $$

が得られます。たとえば $R_p = 1\,\mathrm{dB}$ なら $\varepsilon = \sqrt{10^{0.1} – 1} \approx \sqrt{0.2589} \approx 0.5088$ です。リップルを小さく要求するほど $\varepsilon$ は小さくなり、$\varepsilon \to 0$ の極限では通過域が完全に平らになって、実はバタワースフィルタに近づいていきます。逆にリップルを大きく許すほど $\varepsilon$ は大きくなり、遮断はより急峻になります。リップルと急峻さがトレードオフになっていることが、この式から読み取れます。

チェビシェフI型の振幅特性: リップル量と遮断急峻さのトレードオフ(リニアとdB)

リップルを 0.5 dB から 3 dB へと増やすにつれて、遮断域での落ち込みが急峻になっていく様子が両スケールで確認できます。dBスケール(右図)ではカットオフ以降の傾きの違いが特に鮮明で、リップルを大きく許すほど「費やした予算のぶん遮断を稼げる」というトレードオフの本質が直感的に読み取れます。設計時には、用途が許すリップル上限を最大限に使うのが次数節約の鉄則です。

必要な次数 $n$ の決定

もう一つの設計仕様は「遮断域の周波数 $\omega_s$ で、減衰を $R_s$ dB 以上にする」という形です。ここから必要な次数 $n$ を求めましょう。遮断域 $\omega_s > \omega_c$ では $|x| = \omega_s/\omega_c > 1$ なので、$T_n$ には双曲線関数表現を使います。減衰量は

$$ R_s = 10\log_{10}\!\left(\frac{1}{|H(j\omega_s)|^2}\right) = 10\log_{10}\!\left(1 + \varepsilon^2 T_n^2(\omega_s/\omega_c)\right) $$

です。$\varepsilon^2 T_n^2 \gg 1$ となる阻止域では $1$ を無視できますが、ここでは厳密に進めます。$10^{R_s/10} = 1 + \varepsilon^2 T_n^2(\omega_s/\omega_c)$ から

$$ T_n\!\left(\frac{\omega_s}{\omega_c}\right) = \frac{\sqrt{10^{R_s/10} – 1}}{\varepsilon} $$

を得ます。ここで双曲線表現 $T_n(x) = \cosh(n\,\mathrm{arccosh}\,x)$ を代入すると

$$ \cosh\!\left(n\,\mathrm{arccosh}\,\frac{\omega_s}{\omega_c}\right) = \frac{\sqrt{10^{R_s/10} – 1}}{\varepsilon} $$

となります。両辺に $\mathrm{arccosh}$ を施して $n$ について解くと、必要な次数の式が得られます。

$$ \boxed{\;n \ge \frac{\mathrm{arccosh}\!\left(\dfrac{\sqrt{10^{R_s/10} – 1}}{\varepsilon}\right)}{\mathrm{arccosh}\!\left(\dfrac{\omega_s}{\omega_c}\right)}\;} $$

実際には、この右辺を計算して切り上げた整数を次数とします。分子は要求する減衰の厳しさ、分母は遷移帯域の狭さ($\omega_s$ が $\omega_c$ に近いほど $\mathrm{arccosh}$ が小さくなる)を表しています。遷移帯域を狭く要求するほど分母が小さくなり、必要次数が跳ね上がる、という直感とも一致します。

ここまでで、リップル仕様から $\varepsilon$ を、減衰仕様から $n$ を決める手順が揃いました。次の節では、これらのパラメータが伝達関数の「極」をどこに配置するのかを導きます。バタワースの極が円上に並ぶのに対し、チェビシェフの極が楕円上に並ぶという美しい事実を見ていきましょう。

チェビシェフフィルタの必要次数比較: バタワースよりも少ない次数で同仕様を達成

左図は遷移帯域比 $\omega_s/\omega_c$ を変えながら必要次数を比べたものです。チェビシェフ(赤)は常にバタワース(黒)より低次数で仕様を満たしており、緑の帯が「節約できる次数」を示しています。右図は遷移帯域比を固定して許容リップルを変えた場合で、リップルを多く許すほど節約幅が大きくなることが分かります。具体例の節で計算した「5次 vs 8次」という差は、この図の $\omega_s/\omega_c = 2$ の列を読んだものです。

極が楕円上に並ぶことの導出

極を求める方程式

フィルタの安定性と特性は極の位置で決まります。チェビシェフフィルタの極を求めるため、振幅二乗特性を複素変数 $s = j\omega$ の世界に拡張します。$|H(j\omega)|^2 = H(s)H(-s)|_{s=j\omega}$ という関係を使うと、$\omega = s/j$ より $\omega/\omega_c = s/(j\omega_c)$ なので

$$ H(s)H(-s) = \frac{1}{1 + \varepsilon^2\, T_n^2\!\left(\dfrac{s}{j\omega_c}\right)} $$

となります。極は分母がゼロになる点、すなわち

$$ 1 + \varepsilon^2\, T_n^2\!\left(\frac{s}{j\omega_c}\right) = 0 \quad\Longleftrightarrow\quad T_n\!\left(\frac{s}{j\omega_c}\right) = \pm\frac{j}{\varepsilon} $$

を満たす $s$ です。$\omega_c = 1$ と正規化して話を進めましょう(最後に $\omega_c$ 倍すれば一般の場合に戻せます)。変数を $w = s/j = -js$ とおくと、解くべき方程式は $T_n(w) = \pm j/\varepsilon$ となります。

複素角への変換

$T_n(w) = \cos(n\,\mathrm{arccos}\,w)$ なので、複素数の角度 $\phi = \mathrm{arccos}\,w$ を導入し、$\phi = a + jb$($a, b$ は実数)とおきます。すると方程式は

$$ \cos(n\phi) = \cos(n(a + jb)) = \pm\frac{j}{\varepsilon} $$

になります。複素数の余弦を加法定理で展開すると

$$ \cos(na + jnb) = \cos(na)\cos(jnb) – \sin(na)\sin(jnb) = \cos(na)\cosh(nb) – j\sin(na)\sinh(nb) $$

です($\cos(jx) = \cosh x$、$\sin(jx) = j\sinh x$ を使いました)。これが純虚数 $\pm j/\varepsilon$ に等しいので、実部と虚部をそれぞれ比較します。実部の比較から

$$ \cos(na)\cosh(nb) = 0 $$

ですが、$\cosh(nb) \ge 1 > 0$ なので $\cos(na) = 0$ でなければなりません。これより

$$ na = \frac{\pi}{2}(2k+1), \quad k = 0, 1, 2, \dots $$

すなわち $a = \dfrac{(2k+1)\pi}{2n}$ が定まります。次に虚部の比較を行います。$\cos(na) = 0$ のとき $\sin(na) = \pm 1$ なので

$$ -\sin(na)\sinh(nb) = \pm\frac{1}{\varepsilon} \quad\Longrightarrow\quad \sinh(nb) = \frac{1}{\varepsilon} $$

(符号は適切に選びます)。これより $b = \dfrac{1}{n}\mathrm{arcsinh}\dfrac{1}{\varepsilon}$ という、$k$ によらない一定値が定まります。

極座標から楕円へ

極 $s_k$ を求めます。$w = \cos\phi$ で $\phi = a + jb$ だったので、$s = jw = j\cos(a+jb)$ です。$\cos(a+jb) = \cos a \cosh b – j\sin a \sinh b$ を代入すると

$$ s_k = j\left(\cos a_k \cosh b – j \sin a_k \sinh b\right) = \sin a_k \sinh b + j\cos a_k \cosh b $$

となります。ここで実部と虚部を取り出すと

$$ \sigma_k = \mathrm{Re}(s_k) = \sin a_k \, \sinh b, \qquad \Omega_k = \mathrm{Im}(s_k) = \cos a_k \, \cosh b $$

です($a_k = (2k+1)\pi/(2n)$、$b = \frac{1}{n}\mathrm{arcsinh}\frac{1}{\varepsilon}$)。さて、ここからが美しいところです。これら二式を $\sinh b$ と $\cosh b$ で割って二乗し、足し合わせると

$$ \frac{\sigma_k^2}{\sinh^2 b} + \frac{\Omega_k^2}{\cosh^2 b} = \sin^2 a_k + \cos^2 a_k = 1 $$

が得られます。これはまさに楕円の方程式です。

$$ \boxed{\;\frac{\sigma_k^2}{(\sinh b)^2} + \frac{\Omega_k^2}{(\cosh b)^2} = 1\;} $$

つまり、チェビシェフフィルタの極はすべて、実軸方向の半径が $\sinh b$、虚軸方向の半径が $\cosh b$ の楕円上に並ぶのです。$\cosh b > \sinh b$ なので、虚軸方向に長い縦長の楕円になります。各極の角度位置 $a_k$ はバタワースの極(円上に等角度で並ぶ)と同じ規則で決まり、その円を縦に引き伸ばして楕円にしたものが、ちょうどチェビシェフの極配置になっている、と理解できます。

ここで $\varepsilon \to 0$(リップルゼロ)の極限を考えると、$\mathrm{arcsinh}(1/\varepsilon) \to \infty$ なので $b \to \infty$ となり、$\sinh b \approx \cosh b$ となって楕円が円に近づきます。これはチェビシェフがバタワースに連続的に移行することを意味し、二つのフィルタが地続きであることが確認できます。逆にリップルを大きくすると楕円は実軸方向に潰れ、極は虚軸($j\omega$ 軸)に近づきます。極が虚軸に近いほど、その周波数で利得のピーク(リップルの山)が立つので、これが通過域リップルを生む幾何学的な理由になっています。

安定なフィルタにするには、$H(s)$ には左半平面($\sigma_k < 0$)の極だけを割り当てます。楕円上の極のうち左半分を選べば、安定で因果的なチェビシェフフィルタの伝達関数が完成します。

チェビシェフフィルタの極配置: 極が楕円上に並ぶことの可視化

左図($n=3$)と右図($n=5$)で、scipy が返した極(赤の×印)が理論楕円の上に正確に乗っていることが確認できます。グレーの点は右半平面の鏡像極で、これを除いた左半平面の極だけを $H(s)$ に採用することで安定フィルタが作られます。楕円は虚軸方向に長い縦長で、極が虚軸に近い位置に集まっているため、通過域でリップルの山が立つ幾何学的な理由がこの配置から直接読み取れます。

ここまでで設計理論は完結しました。次の節では具体的な数値で設計式を確かめ、その後 Python で実際にフィルタを作って可視化します。

具体例

実際に数値を入れて設計の流れを確かめましょう。仕様を「通過域リップル $R_p = 1\,\mathrm{dB}$、カットオフ $f_c = 100\,\mathrm{Hz}$、遮断域 $f_s = 200\,\mathrm{Hz}$ で減衰 $R_s = 40\,\mathrm{dB}$ 以上」とします。

まずリップル係数 $\varepsilon$ を求めます。設計式に $R_p = 1$ を代入すると

$$ \varepsilon = \sqrt{10^{1/10} – 1} = \sqrt{1.2589 – 1} = \sqrt{0.2589} \approx 0.5088 $$

です。次に必要次数 $n$ を求めます。遷移帯域比は $\omega_s/\omega_c = 200/100 = 2$ です。分子の中身を計算すると $\sqrt{10^{40/10} – 1} = \sqrt{10000 – 1} \approx 99.995$ なので、$99.995/\varepsilon \approx 99.995/0.5088 \approx 196.5$ です。次数の式に代入すると

$$ n \ge \frac{\mathrm{arccosh}(196.5)}{\mathrm{arccosh}(2)} = \frac{\ln(196.5 + \sqrt{196.5^2 – 1})}{\ln(2 + \sqrt{3})} \approx \frac{\ln(392.9)}{\ln(3.732)} \approx \frac{5.974}{1.317} \approx 4.54 $$

となります($\mathrm{arccosh}\,x = \ln(x + \sqrt{x^2-1})$ を使いました)。切り上げて $n = 5$ が必要次数です。

比較のために、同じ仕様をバタワースで満たすのに必要な次数も見積もっておきます。バタワースの次数式は $n \ge \dfrac{\log_{10}(10^{R_s/10}-1)/(10^{R_p/10}-1)}{2\log_{10}(\omega_s/\omega_c)}$ で、これに数値を入れると分子は $\log_{10}(9999/0.2589) \approx \log_{10}(38622) \approx 4.587$、分母は $2\log_{10} 2 \approx 0.602$ なので $n \ge 7.6$、つまり $n = 8$ が必要です。チェビシェフなら $5$ 次で済むところを、バタワースは $8$ 次必要になる——同じ仕様を満たすのにチェビシェフのほうが3次も少なくて済むわけです。これがチェビシェフを使う一番の動機です。

この「次数を節約できる」という結果が本当か、Python で振幅特性を描いて確認しましょう。

Pythonでの実装

チェビシェフ多項式と等リップル性の可視化

まずは理論の出発点だったチェビシェフ多項式 $T_n(x)$ そのものを描き、区間 $[-1,1]$ での等リップル性を目で確かめます。

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import chebyshev as C

# 区間 [-1.4, 1.4] でチェビシェフ多項式 T_n(x) を描く
x = np.linspace(-1.4, 1.4, 800)

plt.figure(figsize=(9, 6))
for n in [2, 3, 4, 5]:
    # 漸化式に基づく numpy のチェビシェフ基底(係数 [0,...,0,1] が T_n)
    coeffs = [0] * n + [1]
    Tn = C.chebval(x, coeffs)
    plt.plot(x, Tn, linewidth=2, label=f'$T_{{{n}}}(x)$')

# 通過域に対応する帯 [-1, 1] と振幅 ±1 の枠を描く
plt.axhspan(-1, 1, xmin=(1-(-1.4))/(1.4-(-1.4)), xmax=(1-(-1.4))/(1.4-(-1.4)),
            color='none')
plt.axvspan(-1, 1, color='orange', alpha=0.12, label='passband $|x|\\leq 1$')
plt.axhline(1, color='gray', linestyle='--', linewidth=0.8)
plt.axhline(-1, color='gray', linestyle='--', linewidth=0.8)
plt.ylim(-2.5, 2.5)
plt.xlabel('x')
plt.ylabel('$T_n(x)$')
plt.title('Chebyshev polynomials: equiripple in [-1,1], explode outside')
plt.legend(loc='upper center', ncol=4, fontsize=9)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('chebyshev_polynomials.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフから、チェビシェフ多項式の二つの顔がはっきり読み取れます。オレンジの帯で示した通過域 $|x| \le 1$ の中では、どの次数の $T_n$ も上下の破線($\pm1$)の間にぴったり収まり、$+1$ と $-1$ の間を $n$ 回往復しています。山も谷も高さがすべて同じ、これが等リップル性です。一方、$|x| > 1$ の外側に出た瞬間、$T_n$ は急激に大きくなり、次数が高いほど立ち上がりが急です。この「内側で揃って波打ち、外側で急峻に伸びる」性質が、そのまま通過域リップルと急峻な遮断に翻訳されるわけです。

振幅特性の構成とカットオフでの利得

次に、$T_n$ を振幅二乗特性の式に入れて、チェビシェフフィルタの利得そのものを描きます。設計式どおりにリップルとカットオフが現れるかを確認します。

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import chebyshev as C

Rp = 1.0  # 通過域リップル [dB]
n = 5     # 次数
eps = np.sqrt(10**(Rp/10) - 1)  # リップル係数 ε

w = np.linspace(0, 3, 1000)  # 正規化周波数 ω/ωc
Tn = C.chebval(w, [0]*n + [1])
H2 = 1.0 / (1.0 + eps**2 * Tn**2)      # |H(jω)|^2
H_dB = 10 * np.log10(H2)                # dB 表記

plt.figure(figsize=(9, 6))
plt.plot(w, H_dB, 'b-', linewidth=2, label=f'Chebyshev I (n={n}, Rp={Rp}dB)')
plt.axvline(1.0, color='red', linestyle='--', alpha=0.6, label='$\\omega/\\omega_c=1$')
plt.axhline(-Rp, color='green', linestyle=':', alpha=0.7,
            label=f'ripple floor $-{Rp}$ dB')
plt.axhline(0, color='gray', linestyle='-', linewidth=0.5)
plt.ylim(-60, 5)
plt.xlabel('Normalized frequency $\\omega/\\omega_c$')
plt.ylabel('Magnitude [dB]')
plt.title('Chebyshev I magnitude from $1/(1+\\varepsilon^2 T_n^2)$')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('chebyshev_magnitude.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"ε = {eps:.4f}")
print(f"カットオフ ω/ωc=1 での利得 = {10*np.log10(1/(1+eps**2)):.4f} dB")

このグラフは設計理論の答え合わせになっています。通過域($\omega/\omega_c < 1$)では、利得が $0\,\mathrm{dB}$ と $-1\,\mathrm{dB}$(緑の点線)の間をきっちり波打っており、波の数は次数 $n=5$ に対応しています。リップルの谷の底はちょうど $-1\,\mathrm{dB}$ で止まっていて、設計したリップル量と一致します。カットオフ $\omega/\omega_c = 1$(赤の破線)での利得は出力にあるとおり $-1\,\mathrm{dB}$、すなわちリップルの下端と同じ値です。バタワースなら必ず $-3\,\mathrm{dB}$ になる点が、チェビシェフではリップル量で決まるという理論どおりの振る舞いです。カットオフを越えると利得は一気に落ち込み、急峻な遮断が確認できます。

scipy.signal.cheby1 による設計と極零配置

ここからは実用的な scipy.signal.cheby1 を使います。前節の具体例の仕様($n=5$、$R_p=1\,\mathrm{dB}$、$f_c=100\,\mathrm{Hz}$)でアナログ・チェビシェフフィルタを設計し、極が楕円上に並ぶことを確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

n = 5         # 次数
Rp = 1.0      # 通過域リップル [dB]
wc = 2*np.pi*100.0   # カットオフ角周波数 [rad/s](アナログ)
eps = np.sqrt(10**(Rp/10) - 1)

# アナログ・チェビシェフ I 型フィルタ(analog=True で s 領域の極零を得る)
z, p, k = signal.cheby1(n, Rp, wc, analog=True, output='zpk')

# 楕円の半径(理論値): ωc * sinh(b), ωc * cosh(b)
b = np.arcsinh(1.0/eps) / n
a_radius = wc * np.sinh(b)   # 実軸方向
b_radius = wc * np.cosh(b)   # 虚軸方向

plt.figure(figsize=(7, 7))
# 理論楕円
th = np.linspace(0, 2*np.pi, 400)
plt.plot(a_radius*np.cos(th), b_radius*np.sin(th), 'g--',
         linewidth=1.2, label='theoretical ellipse')
# scipy の極
plt.scatter(np.real(p), np.imag(p), marker='x', s=90, color='red',
            linewidths=2, label='poles (scipy)')
plt.axvline(0, color='gray', linewidth=0.5)
plt.axhline(0, color='gray', linewidth=0.5)
plt.xlabel('Re(s) [rad/s]')
plt.ylabel('Im(s) [rad/s]')
plt.title('Chebyshev I poles lie on an ellipse (analog, n=5)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.gca().set_aspect('equal')
plt.tight_layout()
plt.savefig('chebyshev_poles_ellipse.png', dpi=150, bbox_inches='tight')
plt.show()

print("極の実部(すべて負=安定):", np.round(np.real(p), 2))
print(f"楕円半径: 実軸 {a_radius:.1f}, 虚軸 {b_radius:.1f} [rad/s]")

このグラフが、理論で導いた「極は楕円上に並ぶ」を視覚的に裏づけます。赤い×印で示した scipy.signal.cheby1 が返した極が、緑の破線で描いた理論楕円(半径 $\omega_c\sinh b$ と $\omega_c\cosh b$)の上にぴたりと乗っています。極はすべて左半平面(実部が負、出力で確認できます)にあり、フィルタが安定であることも分かります。楕円は虚軸方向に長い縦長で、これは $\cosh b > \sinh b$ という不等式の帰結です。極が虚軸に近づくほどその周波数で利得のピーク(リップルの山)が立つ、という幾何学的描像も、極が虚軸寄りに分布していることから納得できます。

パラメータbが決める楕円の形状: リップル量による楕円の変化と極の移動

左図では、リップル量($R_p$)が増えるにつれて楕円が実軸方向に潰れ、円に近い形から平たい楕円へと変化していきます。右図はリップルを増やすと実軸方向の半径 $\sinh b$(実線)が急減する一方、虚軸方向の半径 $\cosh b$(破線)は相対的に維持されることを示しています。次数 $n$ が大きいほどパラメータ $b = \frac{1}{n}\mathrm{arcsinh}\frac{1}{\varepsilon}$ が小さくなり、楕円の変形量が大きくなる点も読み取れます。

同次数バタワースとの遮断急峻性の比較

チェビシェフの真価は「同じ次数でバタワースより急峻」という点にあります。同次数($n=5$)のバタワースと並べて振幅特性を比較します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

fs = 1000.0   # サンプリング周波数 [Hz]
fc = 100.0    # カットオフ [Hz]
n = 5         # 次数
Rp = 1.0      # チェビシェフのリップル [dB]

# ディジタル IIR フィルタとして設計(双一次変換は scipy が内部処理)
b_bw, a_bw = signal.butter(n, fc, fs=fs)
b_c1, a_c1 = signal.cheby1(n, Rp, fc, fs=fs)

w_bw, H_bw = signal.freqz(b_bw, a_bw, worN=4096, fs=fs)
w_c1, H_c1 = signal.freqz(b_c1, a_c1, worN=4096, fs=fs)

plt.figure(figsize=(10, 6))
plt.plot(w_bw, 20*np.log10(np.abs(H_bw)+1e-12), 'k-', linewidth=2,
         label=f'Butterworth (n={n})')
plt.plot(w_c1, 20*np.log10(np.abs(H_c1)+1e-12), 'b-', linewidth=2,
         label=f'Chebyshev I (n={n}, Rp={Rp}dB)')
plt.axvline(fc, color='red', linestyle='--', alpha=0.6, label='$f_c$=100 Hz')
plt.axhline(-Rp, color='green', linestyle=':', alpha=0.6, label=f'-{Rp} dB')
plt.xlim(0, fs/2)
plt.ylim(-100, 5)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Magnitude [dB]')
plt.title('Same order (n=5): Chebyshev is steeper, Butterworth is flat')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('cheby_vs_butter_mag.png', dpi=150, bbox_inches='tight')
plt.show()

この比較グラフが本記事の核心を端的に示しています。黒線のバタワースは通過域が完全に平らで波打ちが一切ありませんが、カットオフ付近の肩がなだらかで、遮断の傾きが緩やかです。一方、青線のチェビシェフは通過域で $-1\,\mathrm{dB}$ までの等リップルを見せている代わりに、カットオフを越えてからの落ち込みが明らかに急峻です。同じ周波数(たとえば $150\,\mathrm{Hz}$ 付近)で比べると、チェビシェフのほうが圧倒的に深く減衰しています。「通過域の平坦さを犠牲にして遮断の急峻さを買う」というトレードオフが、二本の曲線の対比としてはっきり読み取れます。

バタワースとチェビシェフの振幅特性・群遅延の比較: 同次数n=5での違い

上段の振幅特性では、チェビシェフ(赤)がカットオフ以降に急峻に落ちている一方、バタワース(黒)は緩やかに減衰している様子が明確に見えます。下段の群遅延では、チェビシェフがカットオフ付近で鋭いピークを持ち、バタワースより大きく変動しています。これは「急峻な遮断と引き換えに、位相の歪みが増える」という第二のトレードオフを示しており、波形の忠実さが重要な用途では要注意です。

群遅延の比較とトレードオフの全体像

急峻さの代償はリップルだけではありません。位相特性、特に群遅延にも現れます。最後に群遅延を比較して、チェビシェフのもう一つの弱点を確認します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

fs = 1000.0
fc = 100.0
n = 5
Rp = 1.0

b_bw, a_bw = signal.butter(n, fc, fs=fs)
b_c1, a_c1 = signal.cheby1(n, Rp, fc, fs=fs)

w_bw, gd_bw = signal.group_delay((b_bw, a_bw), w=4096, fs=fs)
w_c1, gd_c1 = signal.group_delay((b_c1, a_c1), w=4096, fs=fs)

plt.figure(figsize=(10, 6))
plt.plot(w_bw, gd_bw, 'k-', linewidth=2, label=f'Butterworth (n={n})')
plt.plot(w_c1, gd_c1, 'b-', linewidth=2, label=f'Chebyshev I (n={n}, Rp={Rp}dB)')
plt.axvline(fc, color='red', linestyle='--', alpha=0.6, label='$f_c$=100 Hz')
plt.xlim(0, fs/2)
plt.xlabel('Frequency [Hz]')
plt.ylabel('Group delay [samples]')
plt.title('Group delay: Chebyshev peaks higher near cutoff (more distortion)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('cheby_vs_butter_gd.png', dpi=150, bbox_inches='tight')
plt.show()

# 通過域内での群遅延の最大変動量を比較
mask = w_bw <= fc
print(f"通過域内 群遅延変動 Butterworth: {gd_bw[mask].max()-gd_bw[mask].min():.2f} samples")
print(f"通過域内 群遅延変動 Chebyshev : {gd_c1[w_c1<=fc].max()-gd_c1[w_c1<=fc].min():.2f} samples")

このグラフから、急峻さの隠れたコストが見えてきます。両フィルタとも群遅延はカットオフ付近でピークを持ちますが、チェビシェフ(青)のピークはバタワース(黒)よりも明らかに高く鋭くなっています。出力に表示される通過域内の群遅延変動量も、チェビシェフのほうが大きい値になります。群遅延が周波数によって大きく変わるということは、各周波数成分がフィルタを通る時間がバラバラになるということで、波形が歪みやすいことを意味します。つまりチェビシェフは「急峻な遮断と引き換えに、通過域のリップルだけでなく位相の歪み(群遅延の暴れ)も増える」のです。波形の忠実度が重要なオーディオや過渡信号の処理ではこの点が問題になり、平坦な群遅延が欲しい場合はベッセルフィルタなど別の選択肢が検討されます。設計とは結局、これらのトレードオフの中から目的に合う妥協点を選ぶ作業なのだ、ということがこの一連のグラフから実感できるはずです。

ステップ応答とインパルス応答の比較: チェビシェフI型は振動とオーバーシュートが大きい

ステップ応答(左)では、チェビシェフ I 型(赤)がバタワース(黒)よりも大きなオーバーシュートと長い振動を示しています。インパルス応答(右)でも同様の傾向で、チェビシェフ II 型(青)はその中間的な挙動を示します。これは「遮断が急峻 = 極が虚軸に近い = フィルタが共振しやすい」という直感と一致しており、過渡応答のオーバーシュートを抑えたい用途ではチェビシェフ I 型は不向きです。

チェビシェフ I 型と II 型の使い分け

チェビシェフ多項式を使ったフィルタには、これまで扱ってきた I 型のほかに II 型 があります。両者の違いは「等リップルをどちらの帯域に置くか」という一点です。I 型は通過域に等リップルを持ち、阻止域では単調に減衰します。II 型はその逆で、通過域は単調(最大平坦に近い)で、阻止域に等リップルを持ちます。

チェビシェフI型とII型の振幅特性比較: リップルの位置が通過域と阻止域で逆

上のグラフで I 型(青)は通過域でリップルが見え、II 型(赤)は通過域が平らで阻止域に波打ちが現れています。dBスケール(右)ではその違いがより鮮明で、II 型の阻止域は設計した $-40\,\mathrm{dB}$(赤の点線)の位置で等リップルを繰り返しています。通過域を平らに保ちたいが遮断域のリップルは許容できる、というケースでは II 型が適しています。逆に、通過域でのリップルが多少あっても最大限急峻な遮断が欲しいなら I 型を選びます。

まとめ

本記事では、チェビシェフフィルタの設計法を、その数学的基盤から実装・比較まで一気通貫で解説しました。

  • チェビシェフ多項式 $T_n(x)$: 漸化式 $T_{n+1} = 2x T_n – T_{n-1}$ で生成され、$|x|\le1$ では振幅1の等リップル、$|x|>1$ では急峻に増大する二つの顔をもつ
  • 振幅特性: $|H(j\omega)|^2 = 1/(1 + \varepsilon^2 T_n^2(\omega/\omega_c))$ により、通過域で $n$ 個の等リップル、遮断域で急峻な減衰を実現する
  • 設計式: 通過域リップル $R_p$ から $\varepsilon = \sqrt{10^{R_p/10}-1}$、減衰仕様 $R_s$ と遷移帯域から必要次数 $n$ が $\mathrm{arccosh}$ を使って求まる
  • 極配置: 極は実軸半径 $\sinh b$、虚軸半径 $\cosh b$ の楕円上に並び、$\varepsilon\to0$ でバタワースの円に連続的に移行する
  • トレードオフ: 同次数のバタワースより遮断は急峻だが、その代償として通過域リップルと群遅延の暴れ(位相歪み)が増える

チェビシェフフィルタを理解すると、フィルタ設計が「理想に近づける作業」ではなく「限られた次数という予算を、平坦さ・急峻さ・位相直線性のどこに配分するか」という最適配分の問題だと見えてきます。通過域も阻止域も両方リップルを許してさらに急峻にした楕円フィルタ、逆に群遅延の平坦さを最優先したベッセルフィルタへと、この視点はそのままつながっていきます。

次のステップとして、以下の記事も参考にしてください。

画像なし
バターワースフィルタ完全ガイド — 最大平坦特性の設計式とPython実装
チェビシェフと対をなすバタワースフィルタの理論と実装。最大平坦特性の導出、極が単位円上に並ぶことの幾何学、Pythonでの設計と振幅・群遅延の可視化を解説します。
画像なし
双一次変換(バイリニア変換)— アナログフィルタをデジタル化する設計法
チェビシェフなどのアナログ原型フィルタをデジタルIIRフィルタに変換する双一次変換の理論と実装。周波数プリウォーピング、安定性の保存、Pythonでの実装例を解説します。