フーリエ変換とフィルタ設計 SciPy
SciPyを使った例をいくつか紹介します。
信号処理の中でも、時間領域と周波数領域の変換や、高度なフィルタ設計を行います。
高度なフーリエ変換
1 | import numpy as np |
[実行結果]
ソースコード解説
このソースコードは、信号のフーリエ変換を行い、その結果を時間領域と周波数領域でプロットするものです。
以下に、コードを詳しく説明します。
1. ライブラリのインポート
1 | import numpy as np |
numpy(np): 数値計算ライブラリ。配列の操作や数学的な関数を提供します。scipy.fftpack: フーリエ変換関連の関数を提供するライブラリ。ここでは高速フーリエ変換 (FFT) に使用します。fft: フーリエ変換を実行する関数。ifft: 逆フーリエ変換を実行する関数。fftshift: フーリエ変換結果をシフトする関数。
matplotlib.pyplot(plt): プロットライブラリ。グラフを描画するために使用します。
2. サンプルデータの生成
1 | fs = 500 # サンプリング周波数 |
fs = 500: サンプリング周波数を$500Hz$に設定します。これは、$1$秒間に$500$回サンプリングすることを意味します。t = np.linspace(0, 1, fs, endpoint=False): $0$から$1$秒までを等間隔に分割した時刻配列を生成します。fsの値に基づいて$500$個の点が生成されます。x = ...: $3$つの異なる周波数成分を持つ信号を生成します。np.sin(1.2 * 2 * np.pi * t): $1.2Hz$の正弦波。1.5 * np.cos(9 * 2 * np.pi * t): $9Hz$の余弦波。振幅は$1.5$。0.5 * np.sin(12.0 * 2 * np.pi * t): $12Hz$の正弦波。振幅は$0.5$。
3. フーリエ変換
1 | X = fft(x) |
X = fft(x): 信号xに対してフーリエ変換を行い、周波数領域の表現Xを得ます。
4. 周波数軸の生成
1 | freqs = np.fft.fftfreq(len(X)) * fs |
freqs = np.fft.fftfreq(len(X)) * fs: フーリエ変換結果Xの長さに基づいて周波数軸を生成します。np.fft.fftfreqは、サンプル数に対する周波数ビンを返します。
これをサンプリング周波数fsでスケーリングして実際の周波数を得ます。
5. フーリエ変換結果のシフト
1 | X_shifted = fftshift(X) |
X_shifted = fftshift(X): フーリエ変換結果Xをシフトして、ゼロ周波数成分が中央に来るようにします。freqs_shifted = fftshift(freqs): 同様に、周波数軸freqsもシフトします。
6. 結果のプロット
1 | plt.figure(figsize=(12, 6)) |
plt.figure(figsize=(12, 6)): グラフのサイズを設定します。plt.subplot(2, 1, 1): $2行1列$のプロットの$1$番目の位置にプロットを作成します。plt.plot(t, x): 時間領域の信号xをプロットします。plt.title("Time Domain Signal"): プロットにタイトルを追加します。
plt.subplot(2, 1, 2): $2行1列$のプロットの$2$番目の位置にプロットを作成します。plt.plot(freqs_shifted, np.abs(X_shifted)): 周波数領域の信号X_shiftedの振幅スペクトルをプロットします。plt.title("Frequency Domain Signal"): プロットにタイトルを追加します。plt.xlim(-50, 50): 周波数軸の範囲を$-50Hz$から$50Hz$に設定します。
plt.tight_layout(): レイアウトを調整してプロット間の重なりを防ぎます。plt.show(): プロットを表示します。
このコードは、時間領域の複雑な信号をフーリエ変換してその周波数成分を可視化する過程を示しています。
これにより、信号に含まれる主要な周波数成分を簡単に特定できます。
結果解説
[実行結果]
このグラフは、信号の時間領域と周波数領域のプロットを示しています。
以下に詳細な解説を行います。
上のプロット: 時間領域の信号 (Time Domain Signal)
- 横軸 (x軸):
時間 (秒) を表します。
$0$から$1$までの範囲で、信号が$1$秒間続いていることを示しています。 - 縦軸 (y軸):
振幅を表します。
信号の強さや大きさを示します。 - 波形:
時間に対して変動する信号の振幅がプロットされています。
この信号は複数の正弦波の組み合わせで構成されていることが見て取れます。
下のプロット: 周波数領域の信号 (Frequency Domain Signal)
- 横軸 (x軸):
周波数 ($Hz$) を表します。$-50$から$50Hz$の範囲でプロットされています。
これは、フーリエ変換によって得られた信号の周波数成分を示しています。 - 縦軸 (y軸):
フーリエ変換の結果として得られた振幅スペクトルの強度を表します。
信号の各周波数成分の強さを示しています。 - ピーク:
このプロットにはいくつかの明確なピークが見られます。
これらのピークは、信号に含まれる特定の周波数成分を示しています。
解説
- 上のプロットの波形からは、信号が複数の周波数成分を含む複雑なものだと分かります。
これは、正弦波が重なり合っている結果です。 - 下のプロットで見られるピークは、信号の主要な周波数成分を示しています。
具体的には、周波数軸上のピークの位置から、信号が特定の周波数で強い成分を持っていることが分かります。- 例えば、$0Hz$付近に大きなピークがあることは、信号に直流成分が含まれていることを示しています。
- 他のピークは、信号に含まれる異なる正弦波成分の周波数を示しています。
このグラフは、信号の時間領域と周波数領域の特性を理解するのに役立ちます。
時間領域の信号がどのように変動するかを視覚化し、周波数領域でその成分を分析することで、信号の特性をより深く理解することができます。


















