デジタル信号処理11

Dublin Core

Creator

Date Created

Rights

CC BY-NC 4.0 - 非営利目的のみ許可

note Item Type Metadata

note

# 平均値フィルタの限界とFIRフィルタ設計

## 平均値フィルタの限界

### なぜ平均値フィルタでは不十分なのか?

平均値フィルタは低域通過フィルタとして機能しますが、その振幅スペクトルの形は「理想的な低域通過フィルタ」とは大きく異なります。

**具体例**:
- M=3の平均値フィルタ:理想特性から大きく外れている
- M=7の平均値フィルタ:改善するが、まだ理想的ではない

→ 係数がすべて $1/M$ に固定されているため、実現できる特性が限定される

### 理想的な低域通過フィルタとは?

理想的な低域通過フィルタは、特定の周波数以下は完全に通過させ、それ以上は完全に除去します。

理想的な低域通過フィルタの振幅スペクトル $H(f)$ は以下のように定義されます:

$$
H(f) = 1 \quad (0 \leq f \leq f_c) \quad \text{【通過域】}
$$

$$
H(f) = 0 \quad (f > f_c) \quad \text{【阻止域】}
$$

**用語の説明**:

- **遮断周波数 $f_c$**: 通過域と阻止域の境界となる周波数
  - 例:$f_c = 1000$ Hz の場合、1000 Hz以下の信号は通過、それ以上は除去
 
- **通過域** ($0 \leq f \leq f_c$): 信号をそのまま通過させる領域
  - 振幅スペクトルが1 → 信号が減衰しない
 
- **阻止域** ($f > f_c$): 信号を完全に除去する領域
  - 振幅スペクトルが0 → 信号が完全に除去される

**周波数特性のイメージ**:

```mermaid
graph LR
    A["通過域<br/>0 ≤ f ≤ fc<br/>振幅: 1<br/>信号を通過"] -->|遮断周波数 fc| B["阻止域<br/>f > fc<br/>振幅: 0<br/>信号を除去"]
```

### 現実のフィルタの問題点

理想的なフィルタは数学的には定義できますが、コンピュータで実現することは**不可能**です。

**現実のフィルタで発生する問題**:

1. **リプル(波打ち)**

   リプルとは、フィルタの振幅スペクトルが理想値(通過域で1、阻止域で0)からずれて波打つ現象です。

   **通過域リプル**:
   - 通過域で振幅が1からずれて波打つ
   - 例:0.95~1.05の間で振動
   - **問題点**:信号の振幅が不均一になり、周波数によって減衰量が異なる

   **阻止域リプル**:
   - 阻止域で振幅が0からずれて波打つ
   - 例:0.01~0.05の間で振動
   - **問題点**:本来除去すべき信号が完全に除去されず、ノイズが残る

   **リプルの視覚的なイメージ**:

   ```mermaid
   graph LR
       A["理想的なフィルタ<br/>通過域: 振幅=1<br/>阻止域: 振幅=0"] -->|現実のフィルタ| B["通過域リプル<br/>振幅: 0.95~1.05<br/>阻止域リプル<br/>振幅: 0.01~0.05"]
   ```

   **なぜリプルが発生するのか?**

   無限長の理想的なインパルス応答を有限長に打ち切ると、時間領域での不連続が周波数領域でのリプルとして現れます。これは、フーリエ変換の性質により、時間領域での急激な変化が周波数領域での広がり(リプル)を引き起こすためです。

2. **遷移域**

   通過域と阻止域の間に、なだらかに変化する中間領域が生じます。

   - **理想**:遮断周波数で不連続に変化(遷移域の幅 = 0)
   - **現実**:有限の幅を持つ遷移域が生じる
   - **問題点**:遮断周波数付近の信号が完全に通過も除去もされない曖昧な状態になる

**理想に近づけるには**:
- リプルをできるだけ小さくする
- 遷移域をできるだけ狭くする

---

## FIRディジタルフィルタ

### 平均値フィルタからFIRフィルタへ

**平均値フィルタの問題点**:

$$
y(n) = \frac{1}{M}\sum_{k=0}^{M-1} x(n-k) = \frac{1}{M}x(n) + \frac{1}{M}x(n-1) + \cdots + \frac{1}{M}x(n-(M-1))
$$

すべての係数が $1/M$ に固定されている → 実現できる特性が限定される

**解決策:係数を自由に設定できるフィルタ**

$$
y(n) = h_0 x(n) + h_1 x(n-1) + h_2 x(n-2) + \cdots + h_N x(n-N) = \sum_{k=0}^{N} h_k x(n-k)
$$

- $h_0, h_1, \cdots, h_N$: **フィルタ係数**($N+1$個、自由に設定可能)
- $N$: **フィルタの次数**

→ 係数を適切に設定すれば、理想的な特性に近づけられる!

### FIRフィルタとは?

**FIR**: Finite Impulse Response(有限のインパルス応答)

#### インパルス応答とは?

**単位インパルス** $\delta(n)$ を入力したときの出力を**インパルス応答**といいます。

単位インパルス $\delta(n)$ の定義:

- $n = 0$ のとき:$\delta(0) = 1$
- $n \neq 0$ のとき:$\delta(n) = 0$

つまり、時刻 $n = 0$ でのみ値が1で、それ以外の時刻では0となる信号です。

**例**:単位インパルスを入力すると、出力は $h_0, h_1, \cdots, h_N$ の値になります。

```mermaid
flowchart LR
    A["入力: δ(n)<br/>[1, 0, 0, 0, ...]"] -->|FIRフィルタ| B["出力: [h₀, h₁, h₂, ..., hₙ, 0, 0, ...]"]
```

#### 「有限」の意味

- **有限**: インパルス応答が有限長($n = 0, 1, \cdots, N$ の範囲のみで値を持つ)
- **無限**: 他のフィルタ(IIR)では無限長になることもある

#### 重要な性質

**FIRフィルタでは、インパルス応答の値 = フィルタ係数の値**

つまり、インパルス応答を計算すれば、それがそのままフィルタ係数になります。

---

## 窓関数法によるFIRフィルタ設計

### 設計の目的

FIRフィルタの係数 $h_0, h_1, \cdots, h_N$ を、理想的な低域通過フィルタに近づけるように決定する方法が**窓関数法**です。

### 設計手順(4ステップ)

#### 手順1: 理想的な低域通過フィルタを定義する

正規化角周波数 $\omega$ [rad/sample] を用いて定義します。

理想的な低域通過フィルタの周波数特性 $H_d(e^{j\omega})$ は以下のように定義されます:

$$
H_d(e^{j\omega}) = 1 \quad (|\omega| \leq \omega_c)
$$

$$
H_d(e^{j\omega}) = 0 \quad (\omega_c < |\omega| \leq \pi)
$$

**なぜ正規化角周波数を使うのか?**

標本化周波数に依存しない形で設計したいためです。

**物理周波数 [Hz] との変換**:

$$
\omega_c = \frac{2\pi f_c}{F_s}
$$

- $f_c$: 遮断周波数 [Hz]
- $F_s$: 標本化周波数 [Hz]

**例**:$f_c = 1000$ Hz、$F_s = 8000$ Hz の場合
$$
\omega_c = \frac{2\pi \times 1000}{8000} = \frac{\pi}{4} \text{ [rad/sample]}
$$

#### 手順2: インパルス応答を計算する

理想的なフィルタのインパルス応答を、離散時間フーリエ逆変換で求めます。

$$
h_d(n) = \frac{1}{2\pi} \int_{-\pi}^{\pi} H_d(e^{j\omega}) e^{j\omega n} d\omega = \frac{\sin(\omega_c n)}{\pi n}
$$

**sinc関数で表すと**:

$$
h_d(n) = \frac{\omega_c}{\pi} \text{sinc}(\omega_c n), \quad \text{where } \text{sinc}(x) = \frac{\sin(x)}{x}
$$

**sinc関数の性質**:
- $\text{sinc}(0) = 1$($x \to 0$ の極限)
- $x = 0$ 以外では $\sin(x)/x$ の形

**問題点**:

1. **無限長**: $h_d(n)$ は $-\infty \leq n \leq \infty$ の範囲で値を持つ
   - コンピュータでは無限個の係数を保存できない

2. **非因果**: $n < 0$ でも値を持つ
   - 未来の入力信号が必要になる → リアルタイム処理が不可能

#### 手順3: 有限長に打ち切り、因果化する

**打ち切り**:無限長の $h_d(n)$ を有限長 $L$ で打ち切る

**因果化**:右シフトして、$n < 0$ で $h(n) = 0$ にする

**例**:$L = 11$(11サンプル)の場合
- $n = -5, -4, \cdots, 0, \cdots, 5$ の範囲で打ち切り
- 5サンプル右シフト → $n = 0, 1, \cdots, 10$ の範囲に

**結果**:リプルが発生し、理想特性から離れる

**なぜリプルが発生するのか?**

無限長の信号を突然打ち切ると、時間領域での不連続が周波数領域でのリプルとして現れます。

**詳細な説明**:

1. **時間領域での不連続**
   - 無限長の $h_d(n)$ を有限長で打ち切ると、信号が突然0になる
   - この急激な変化が不連続点を生む

2. **周波数領域への影響**
   - フーリエ変換の性質により、時間領域での急激な変化は周波数領域での広がりを引き起こす
   - これが通過域・阻止域でのリプルとして現れる

3. **リプルの特徴**
   - 打ち切り長が短いほど、リプルは大きくなる
   - 打ち切りを「急激に」行うほど、リプルは大きくなる
   - 窓関数を使うことで、打ち切りを「なだらかに」し、リプルを小さくできる

#### 手順4: 窓関数でリプルを低減する

打ち切りによるリプルを小さくするため、**窓関数** $w(n)$ をかけます。

$$
h'(n) = h_d(n) w(n) \quad \left(n \leq \frac{L-1}{2}\right)
$$

その後、右シフトして因果化します。

**窓関数の役割**:

打ち切りを「急激に」ではなく「なだらかに」することで、リプルを小さくします。

**窓関数の効果**:

```mermaid
flowchart TD
    A["打ち切り前<br/>[..., h(-2), h(-1), h(0), h(1), h(2), ...]"] -->|窓関数をかける<br/>端をなだらかに減衰| B["打ち切り後<br/>[0, 0, ..., w(-2)h(-2), w(-1)h(-1),<br/>w(0)h(0), w(1)h(1), w(2)h(2), ..., 0, 0]"]
```

### 代表的な窓関数

#### 1. 方形窓(矩形窓)

$$
w(n) = 1
$$

- **特徴**: 単純打ち切りと等価
- **メリット**: 遷移域が狭い
- **デメリット**: リプルが大きい

#### 2. ハニング窓(フォン・ハン窓)

$$
w(n) = 0.5 + 0.5 \cos\left(\frac{2\pi n}{L-1}\right)
$$

- **特徴**: 端がなだらかに減衰
- **メリット**: リプルが小さい
- **デメリット**: 遷移域が広い

#### 3. ハミング窓

$$
w(n) = 0.54 + 0.46 \cos\left(\frac{2\pi n}{L-1}\right)
$$

- **特徴**: ハニング窓より端の減衰が小さい
- **メリット**: リプルがより小さい
- **デメリット**: 遷移域がより広い

### 窓関数の効果(20次フィルタの場合)

**阻止域減衰量**(阻止域での減衰の大きさの最悪値):

- **方形窓**:
    - 阻止域減衰量:21 dB
    - 評価:あまり良くない

- **ハニング窓**:
    - 阻止域減衰量:44 dB
    - 評価:良好

- **ハミング窓**:
    - 阻止域減衰量:53 dB
    - 評価:より良好

**dB(デシベル)とは?**

減衰量を表す単位。$A$ を振幅とすると:
$$
\text{dB} = 20 \log_{10} A
$$

- 20 dB = 振幅が1/10
- 40 dB = 振幅が1/100
- 60 dB = 振幅が1/1000

### フィルタ特性と次数の関係

**次数 $N$ を大きくすると**:

- 遷移域が狭くなる(理想特性に近づく)
- リプルが細かくなる
- リプルの大きさは下げられない(窓関数を使わない場合)

**窓関数を使うと**:

- リプルが小さくなる
- 遷移域が広くなる(トレードオフ)

**設計のポイント**:

目的に応じて、次数と窓関数の種類を選択する必要があります。

### 設計法のまとめ

**窓関数法によるFIRフィルタ設計の3ステップ**:

1. **理想的なローパスフィルタのインパルス応答を計算**
   $$
   h_d(n) = \frac{\omega_c}{\pi} \text{sinc}(\omega_c n) \quad (-\infty \leq n \leq \infty)
   $$

2. **窓関数をかけて有限長化**
   $$
   h'(n) = h_d(n) w(n) \quad \left(n \leq \frac{L-1}{2}\right)
   $$

3. **右シフトして因果化**
   - $n < 0$ で $h(n) = 0$ を満たすようにする

**フィルタの次数**: $N = L-1$

**完成したフィルタ係数**: $h_0, h_1, \cdots, h_N = h'(0), h'(1), \cdots, h'(N)$

Collection

Citation

unjuno, “デジタル信号処理11,” unjuno'sResearchLibrary, accessed October 6, 2026, https://archive.unjuno.org/items/show/151.

コメント