理想的な応答から実用的なフィルタへ
ハミングはフーリエ級数を使用したFIRフィルタの4段階設計法を提示しました。
ステップ1: 理想的な応答を指定する
H_ideal(f)を定義します: あなたが望む正確な周波数応答です。ローパスフィルタの場合: f < f_c でH = 1、f > f_c でH = 0。これは周波数領域のステップ関数です。
ステップ2: フーリエ係数を計算する
H_ideal(f)を周波数変数のフーリエ級数として展開します。係数 c_k はフィルタの理想的なインパルス応答値です:
c_k = ∫₀¹ H_ideal(f) · e^{i2πfk} df
カットオフ周波数 f_c を持つローパスフィルタの場合: c_k = sin(2πf_c·k) / (πk) (k ≠ 0), c_0 = 2f_c.
このインパルス応答は無限です — sinc関数は時間領域で永遠に拡張します。実用的なフィルタは限定された数の係数が必要です。
ステップ3: 2N+1項に切り詰める
|k| ≤ N の係数 c_k のみを保持します。この2N+1項の矩形ウィンドウが最も単純な切り詰めです。それはギブス現象を生成します: カットオフ付近で約9%のオーバーシュートです。
ステップ4: ウィンドウを適用する
切り詰められた係数にウィンドウ関数 w_k を乗算してギブスのオーバーシュートを減らします:
c̃_k = c_k · w_k
ウィンドウ加工された係数 c̃_k は実用的なフィルタを定義します。
フーリエ係数を計算する
ローパスフィルタのフーリエ係数公式 c_k = sin(2πf_c·k) / (πk) (カットオフ f_c) はインパルス応答を与えます。
下側カットオフ f_l と上側カットオフ f_u を持つバンドパスフィルタの場合、理想的な応答のフーリエ係数は: c_k = [sin(2πf_u·k) − sin(2πf_l·k)] / (πk).
ウィンドウがギブスのオーバーシュートを減らす方法
ウィンドウ関数 w_k は、切り詰められた係数列を中央の値から端でゼロに向かってテーパーします。テーパーは矩形の切り詰めによって導入された鋭い端を除去します。
テーパーが機能する理由
ギブスのオーバーシュートは、矩形ウィンドウのフーリエ変換 (sinc関数) が大きなサイドローブを持つという事実から生じます。これらのサイドローブは不連続付近に集まって約9%のオーバーシュートを生成します。
スムーズなウィンドウはより小さなサイドローブを持つフーリエ変換を持っています。係数をウィンドウで乗算すると、理想的な周波数応答とウィンドウのフーリエ変換を畳み込みます。より小さなサイドローブ → より少ないリップル。
一般的なウィンドウ
矩形 (ウィンドウなし): サイドローブ ≈ −13 dB、ギブス ≈ 9%。
ハン (フォンハン): w_k = 0.5 + 0.5·cos(πk/N)。サイドローブ ≈ −31 dB。
ハミング: w_k = 0.54 + 0.46·cos(πk/N)。サイドローブ ≈ −41 dB、最初のサイドローブ ≈ −43 dB。ギブス < 0.2%。
カイザー: w_k = I₀(α·√(1−(k/N)²)) / I₀(α)。調整可能: α はサイドローブレベルを制御し、設計がサイドローブの高さと遷移帯幅をトレードオフできます。
ウィンドウのトレードオフ
すべてのウィンドウはトレードオフを課します: サイドローブを抑制することは常にメインローブを広げます。
より広いメインローブは、より広い遷移帯を意味します — 通過帯域と阻止帯域の間の周波数の範囲。
ハミングはこれをカイザー設計パラメータの観点から形式化しました:
- δ: 許容波紋 (理想からの垂直許容値 — 応答が0または1からどの程度のずれを許可するか)
- ΔF: 遷移幅 (水平許容値 — 通過から阻止への遷移がどの程度狭いか)
カイザー法は δ と ΔF だけから N (係数の数) と α (ウィンドウの形状パラメータ) の両方を見つけます。ウィンドウタイプを推測する必要はありません。
仕様から係数へ
カイザー法は2つの仕様 — δ (波紋許容値) と ΔF (遷移幅) — を取り、試行錯誤なしに N とウィンドウ係数の両方を生成します。
設計シーケンス
1. A = −20·log₁₀(δ) を計算します (減衰 (単位: dB))
2. 形状パラメータ α を計算します:
- A > 50 の場合: α = 0.1102·(A − 8.7)
- 21 ≤ A ≤ 50 の場合: α = 0.5842·(A − 21)^{0.4} + 0.07886·(A − 21)
- A < 21 の場合: α = 0 (矩形ウィンドウ)
3. N = (A − 8) / (2.285 · 2πΔF) を計算します
4. カイザーウィンドウの重みを計算します: w_k = I₀(α·√(1−(k/N)²)) / I₀(α)
5. 理想的なフーリエ係数をウィンドウの重みで乗算します
6. 結果の伝達関数を評価し、波紋を δ に対して確認します。波紋が δ を超える場合 (端の干渉)、より小さい許容値で繰り返します。
ハミングは指摘しました: カイザーは指数 0.4 に0.5を試して (大きすぎて) 0.4 がよく合うことを見つけることで到達しました。コンピュータは理論的研究の実験ツールとして機能しました。
カイザー法を適用する
ベッセル関数 I₀(x) はカイザーのウィンドウ公式に現れます。これは急速に収束する級数として計算されます:
I₀(x) = Σ_{m=0}^∞ [(x/2)^m / m!]²
小さい x の場合、分母の m!² のため級数は数項で収束します。