デジタル信号処理6
note Item Type Metadata
note
フーリエ変換と離散フーリエ変換
1. 連続時間フーリエ変換
1.1 基本概念
連続時間信号(アナログ信号)において、フーリエ変換は「ある角周波数ごと」に、無限の時間範囲で関数を積分して、各周波数成分の大きさや位相を求める方法です。
フーリエ変換の定義:
$$X(\Omega) = \int_{-\infty}^{\infty} x(t) e^{-j\Omega t} dt$$
逆フーリエ変換:
$$x(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} X(\Omega) e^{j\Omega t} d\Omega$$
収束条件:
- 信号$x(t)$が絶対可積分である:$\int_{-\infty}^{\infty} |x(t)| dt < \infty$
- または、エネルギー有限:$\int_{-\infty}^{\infty} |x(t)|^2 dt < \infty$
手順:
- フーリエ変換を求める
- その値の絶対値を求める(振幅スペクトル)
- 位相情報も含めて周波数成分を解析する
1.2 例:250Hzの正弦波
250Hzの正弦波を持つ信号x(t)の周波数振幅スペクトルについて:
- 時間波形: 1周期は$4\times 10^{-3}$秒(1/250 = 0.004秒)
- 振幅スペクトル: 250Hzの点のみにスペクトルが現れる
図1: 250Hz正弦波の周波数スペクトル
振幅
|
| δ(Ω-2π×250) δ(Ω+2π×250)
| | |
|-----+--------------+----- 周波数
-250Hz 250Hz
- 連続時間フーリエ変換では、$\pm 250$Hzの位置にディラックのデルタ関数が現れる
- 正の周波数成分と負の周波数成分が対称に存在
1.3 三角関数のフーリエ変換
余弦関数のフーリエ変換
x(t) = A cos(at) (Aとaはそれぞれ任意の実数)のフーリエ変換$X(\Omega)$は:
$$X(\Omega) = A\pi\{ \delta(\Omega - a) + \delta(\Omega + a) \}$$
任意の振幅でマイナスとプラスの領域でΩとの差に対してディラックのデルタ関数で表される。
正弦関数のフーリエ変換
x(t) = A sin(at) (Aとaはそれぞれ任意の実数)のフーリエ変換$X(\Omega)$は:
$$X(\Omega) = jA\pi\{ -\delta(\Omega - a) + \delta(\Omega + a) \}$$
ディラックのデルタ関数
$\delta(\Omega)$はディラックのデルタ関数と呼ばれる超関数(distribution)で、次の性質を満たします:
定義:
$$\int_{-\infty}^{\infty} \delta(x)\,dx = 1$$
重要な性質:
- 任意の連続関数$f(x)$に対して:$\int_{-\infty}^{\infty} \delta(x-a)f(x)\,dx = f(a)$
- フーリエ変換:$\mathcal{F}\{\delta(x)\} = 1$(定数関数)
- 逆フーリエ変換:$\mathcal{F}^{-1}\{1\} = \delta(x)$
注意: $\delta(x)$は通常の関数ではなく、超関数として定義されます。直感的には「x=0で無限大、それ以外で0」と考えることができますが、数学的には積分による作用で定義されます。
性質:
- sin、cosの周波数振幅スペクトルは$-a$と$a$のところでディラックのデルタ関数が現れる
- 絶対値を取るのでどちらも同じ結果になる
2. 離散時間フーリエ変換
2.1 基本概念
離散時間フーリエ変換は、離散信号を周波数領域に変換する方法です。
離散時間フーリエ変換の定義:
$$X(e^{j\omega}) = \sum_{n=-\infty}^{\infty} x(n) e^{-j\omega n}$$
変数の定義:
- $\Omega$:連続時間の角周波数[rad/sec] - 1秒に進む角度
- $\omega$:離散時間の正規化角周波数[rad] - 1サンプルあたりに進む値
- 関係式:$\omega = \Omega T$(Tはサンプリング周期)
- $x(n)$:離散時間信号(nは整数)
手順:
- 離散時間フーリエ変換を実行する
- 絶対値を取って振幅スペクトルを求める
- 正規化角周波数$\omega$を物理周波数に変換する($\omega = \Omega T$)
2.2 例:250Hz信号のサンプリング
250Hzを標本化周波数2000Hzでサンプリングした場合:
- 離散時間フーリエ変換して絶対値を取る
- 周波数振幅スペクトルは250Hzと1750Hzでスペクトルが現れる
離散時間フーリエ変換の性質:
離散時間フーリエ変換は周期的な性質を持ちます。250Hz信号を2000Hzでサンプリングした場合:
- 元の250Hz成分はそのまま現れる
- 離散化により、周波数軸上で2000Hz間隔で繰り返される
- 実際にはエイリアシングは発生しない(250Hz < 1000Hz)
サンプリング定理とエイリアシング
サンプリング定理(ナイキスト・シャノンの定理):
- 連続信号を正確に復元するには、サンプリング周波数$f_s$が信号の最高周波数$f_{max}$の2倍以上である必要がある
- 条件:$f_s \geq 2f_{max}$
エイリアシング現象:
- サンプリング周波数の半分(ナイキスト周波数$f_N = f_s/2$)を超える周波数成分は、低い周波数に折り返される
- 250Hz信号を2000Hzでサンプリングした場合:
- ナイキスト周波数:1000Hz
- 250Hz < 1000Hzなので、エイリアシングは発生しない
- しかし、離散化により1750Hz(2000-250)の成分も現れる
エイリアシングの例:
- 1750Hzの信号を2000Hzでサンプリングすると、250Hzの信号として観測される
- これが「エイリアス(偽の周波数)」と呼ばれる理由
図2: エイリアシング現象の図解
連続信号のスペクトル
振幅
|
| | | |
|-----+--------------+--------------+----- 周波数
-1750Hz 250Hz 1750Hz
サンプリング後の離散信号スペクトル
振幅
|
| | | |
|-----+--------------+--------------+----- 周波数
-250Hz 250Hz 1750Hz
| ↑ ↑ ↑
| エイリアス 元の信号 エイリアス
- 1750Hzの信号が250Hz(2000-1750)に折り返される
- ナイキスト周波数(1000Hz)を超える周波数成分が低周波に現れる
3. 離散フーリエ変換(DFT)
3.1 基本概念
離散フーリエ変換は、スペクトルを周波数に対して離散的にしたフーリエ変換です。
特徴:
- 各サンプルのデータが何ヘルツ間隔になっているかでサンプルの間隔が変化する
- サンプル間隔 = サンプリング周波数 ÷ サンプル数
注意点:
- 多くの教科書では周波数でなく、サンプル数で記述されていることが多い
- 終点はサンプリング周波数の手前のサンプルになる
3.2 具体例
サンプリング周波数2000Hzの場合:
- 8点離散フーリエ変換: 周波数分解能は250Hz(2000/8)、最大周波数は1000Hz(ナイキスト周波数)
- 16点離散フーリエ変換: 周波数分解能は125Hz(2000/16)、最大周波数は1000Hz(ナイキスト周波数)
図3: DFTの周波数分解能
8点DFTの場合(ナイキスト周波数まで)
周波数軸: 0Hz, 250Hz, 500Hz, 750Hz, 1000Hz
| | | | |
|-----|-----|-----|------|
0 250 500 750 1000
↑ ↑ ↑ ↑ ↑
DC 250Hz 500Hz 750Hz 1000Hz
16点DFTの場合(ナイキスト周波数まで)
周波数軸: 0Hz, 125Hz, 250Hz, ..., 1000Hz
| | | |
|-----|------|--------------|
0 125 250 1000
- DFTの点数が多いほど、周波数分解能が向上する
- 周波数間隔 = サンプリング周波数 / DFT点数
- 最大解析周波数は常にナイキスト周波数($f_s/2$)まで
3.3 離散フーリエ変換(DFT)の定義
定義と式
N点離散フーリエ変換(DFT)は、次の式で定義されます:
$$X(k) = \sum_{n=0}^{N-1} x(n) W_N^{kn}$$
変数の説明:
- $X(k)$: 周波数スペクトル($k=0,1,\ldots,N-1$)
- $x(n)$: 時間領域の離散信号
- $W_N$: 回転因子
- $N$: DFTの点数
回転因子(複素指数関数)
$$W_N = e^{-j \frac{2\pi}{N}}$$
$W_N$の具体展開(オイラーの公式の利用):
$$W_N = e^{-j\frac{2\pi}{N}} = \cos\left(\frac{2\pi}{N}\right) - j \sin\left(\frac{2\pi}{N}\right)$$
したがって:
$$W_N^{kn} = \cos\left(\frac{2\pi kn}{N}\right) - j \sin\left(\frac{2\pi kn}{N}\right)$$
3.4 高速フーリエ変換(FFT)
FFTの基本概念
FFT(Fast Fourier Transform)は、DFTを効率的に計算するアルゴリズムです。
計算量の比較:
- DFTの直接計算: $O(N^2)$の計算量
- FFT: $O(N \log N)$の計算量
FFTの利点:
- 計算時間の大幅な短縮
- メモリ使用量の削減
- 実用的な信号処理が可能
FFTの種類
代表的なFFTアルゴリズム:
- Cooley-Tukey FFT: 最も一般的なFFTアルゴリズム
- Radix-2 FFT: データ点数が2のべき乗の場合に最適
- Radix-4 FFT: データ点数が4のべき乗の場合に効率的
制約:
- 多くのFFTアルゴリズムは、データ点数が2のべき乗(2, 4, 8, 16, 32, ...)であることを要求
- 任意の点数に対応するFFTアルゴリズムも存在(例:Bluestein FFT)
3.5 ポイントまとめ
- 離散フーリエ変換は、時間領域信号$x(n)$を周波数成分$X(k)$に変換し、信号にどんな周波数が含まれるか解析できる
- 回転因子$W_N$は、複素指数関数で表され、オイラーの公式により三角関数の形でも展開できる
- $k$の値ごとに$X(k)$が求まる。$k=0,1,\ldots,N-1$で$N$個のスペクトルが得られる
- FFTにより、DFTの計算を$O(N^2)$から$O(N \log N)$に高速化できる
4. 実用的なプログラミング例
4.1 PythonでのFFT実装例
NumPyを使用した基本的なFFT
import numpy as np
import matplotlib.pyplot as plt
# パラメータ設定
fs = 2000 # サンプリング周波数 [Hz]
T = 1.0 # 信号の長さ [秒]
N = int(fs * T) # サンプル数
t = np.linspace(0, T, N, endpoint=False) # 時間軸
# 250Hzの正弦波を生成
f0 = 250 # 信号周波数 [Hz]
x = np.sin(2 * np.pi * f0 * t)
# FFTを実行
X = np.fft.fft(x)
freqs = np.fft.fftfreq(N, 1/fs)
# 振幅スペクトルを計算
amplitude_spectrum = np.abs(X)
# 結果の表示
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(t, x)
plt.title('時間波形 (250Hz正弦波)')
plt.xlabel('時間 [秒]')
plt.ylabel('振幅')
plt.subplot(1, 2, 2)
plt.plot(freqs[:N//2], amplitude_spectrum[:N//2])
plt.title('周波数スペクトル')
plt.xlabel('周波数 [Hz]')
plt.ylabel('振幅')
plt.grid(True)
plt.show()
エイリアシング現象の確認
# 1750Hzの信号を2000Hzでサンプリング
f_alias = 1750 # エイリアス周波数 [Hz]
x_alias = np.sin(2 * np.pi * f_alias * t)
# FFTを実行
X_alias = np.fft.fft(x_alias)
amplitude_spectrum_alias = np.abs(X_alias)
# 結果の表示
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(t, x_alias)
plt.title('時間波形 (1750Hz正弦波)')
plt.xlabel('時間 [秒]')
plt.ylabel('振幅')
plt.subplot(1, 2, 2)
plt.plot(freqs[:N//2], amplitude_spectrum_alias[:N//2])
plt.title('周波数スペクトル (エイリアシング確認)')
plt.xlabel('周波数 [Hz]')
plt.ylabel('振幅')
plt.grid(True)
plt.show()
4.2 MATLABでの実装例
% パラメータ設定
fs = 2000; % サンプリング周波数 [Hz]
T = 1.0; % 信号の長さ [秒]
N = fs * T; % サンプル数
t = 0:1/fs:T-1/fs; % 時間軸
% 250Hzの正弦波を生成
f0 = 250; % 信号周波数 [Hz]
x = sin(2 * pi * f0 * t);
% FFTを実行
X = fft(x);
freqs = (0:N-1) * fs / N;
% 振幅スペクトルを計算
amplitude_spectrum = abs(X);
% 結果の表示
figure;
subplot(1, 2, 1);
plot(t, x);
title('時間波形 (250Hz正弦波)');
xlabel('時間 [秒]');
ylabel('振幅');
subplot(1, 2, 2);
plot(freqs(1:N/2), amplitude_spectrum(1:N/2));
title('周波数スペクトル');
xlabel('周波数 [Hz]');
ylabel('振幅');
grid on;
4.3 実装時の注意点
重要なポイント:
- サンプリング定理の確認: 信号の最高周波数がナイキスト周波数($f_s/2$)以下であることを確認
- 窓関数の使用: スペクトル漏れを防ぐため、必要に応じて窓関数を適用
- ゼロパディング: 周波数分解能を向上させるため、データの末尾にゼロを追加
- 正規化: FFTの結果を適切に正規化して物理的な意味を持つようにする
まとめ
フーリエ変換は連続信号から離散信号へ、そして離散フーリエ変換へと発展し、デジタル信号処理の基礎となっています。各段階でサンプリング定理やエイリアシングなどの重要な概念が関わってきます。
本資料で学んだ重要なポイント:
- 連続時間フーリエ変換: アナログ信号の周波数解析の基礎
- 離散時間フーリエ変換: サンプリングによる離散化の影響
- 離散フーリエ変換(DFT): 有限長信号の周波数解析
- 高速フーリエ変換(FFT): 実用的な高速計算アルゴリズム
- サンプリング定理: エイリアシングを防ぐための重要な制約
- 実装例: PythonとMATLABでの具体的なプログラミング例
これらの知識は、音声処理、画像処理、通信システムなど、様々なデジタル信号処理の分野で活用されます。
コメント