Scipy-fftpack

提供:Dev Guides
移動先:案内検索

SciPy-FFTpack

  • フーリエ変換*は、周波数領域での動作を確認するために、時間領域信号で計算されます。 フーリエ変換は、信号およびノイズ処理、画像処理、音声信号処理などの分野での用途があります。 SciPyは、ユーザーが高速フーリエ変換を計算できるようにするfftpackモジュールを提供します。

以下は、fftpackモジュールを使用してフーリエ変換を計算するために使用されるサイン関数の例です。

高速フーリエ変換

高速フーリエ変換の詳細を理解しましょう。

1次元離散フーリエ変換

長さNシーケンスx [n]の長さNのFFT y [k]はfft()によって計算され、逆変換はifft()を使用して計算されます。 次の例を考えてみましょう

#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft

#create an array with random n numbers
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])

#Applying the fft function
y = fft(x)
print y

上記のプログラムは、次の出力を生成します。

[ 4.50000000+0.j           2.08155948-1.65109876j   -1.83155948+1.60822041j
 -1.83155948-1.60822041j   2.08155948+1.65109876j ]

別の例を見てみましょう

#FFT is already in the workspace, using the same workspace to for inverse transform

yinv = ifft(y)

print yinv

上記のプログラムは、次の出力を生成します。

[ 1.0+0.j   2.0+0.j   1.0+0.j   -1.0+0.j   1.5+0.j ]
*scipy.fftpack* モジュールを使用すると、高速フーリエ変換を計算できます。 例として、(ノイズの多い)入力信号は次のように見えることがあります-
import numpy as np
time_step = 0.02
period = 5.
time_vec = np.arange(0, 20, time_step)
sig = np.sin(2 *np.pi/period* time_vec) + 0.5 *np.random.randn(time_vec.size)
print sig.size

0.02秒のタイムステップで信号を作成しています。 最後のステートメントは、シグナルsigのサイズを出力します。 出力は次のようになります-

1000

信号周波数はわかりません。信号sigのサンプリング時間ステップのみがわかっています。 信号は実関数から送られることになっているため、フーリエ変換は対称になります。 * scipy.fftpack.fftfreq()関数はサンプリング周波数を生成し、 scipy.fftpack.fft()*は高速フーリエ変換を計算します。

例の助けを借りてこれを理解しましょう。

from scipy import fftpack
sample_freq = fftpack.fftfreq(sig.size, d = time_step)
sig_fft = fftpack.fft(sig)
print sig_fft

上記のプログラムは、次の出力を生成します。

array([
   25.45122234 +0.00000000e+00j,   6.29800973 +2.20269471e+00j,
   11.52137858 -2.00515732e+01j,   1.08111300 +1.35488579e+01j,
   …….])

離散コサイン変換

離散コサイン変換(DCT)*は、異なる周波数で振動するコサイン関数の合計に関して、データポイントの有限シーケンスを表します。 SciPyは、関数 *dct を持つDCTと、関数 idct を持つ対応するIDCTを提供します。 次の例を考えてみましょう。

from scipy.fftpack import dct
print dct(np.array([4., 3., 5., 10., 5., 3.]))

上記のプログラムは、次の出力を生成します。

array([ 60.,  -3.48476592,  -13.85640646,  11.3137085,  6.,  -6.31319305])

逆離散コサイン変換は、離散コサイン変換(DCT)係数からシーケンスを再構築します。 idct関数は、dct関数の逆です。 次の例でこれを理解しましょう。

from scipy.fftpack import dct
print idct(np.array([4., 3., 5., 10., 5., 3.]))

上記のプログラムは、次の出力を生成します。

array([ 39.15085889, -20.14213562, -6.45392043, 7.13341236,
8.14213562, -3.83035081])