人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

離散フーリエ変換(DFT)とは?PythonでDFTやってみた!

どうもこんにちは、今回は音声信号処理の基礎「離散フーリエ変換」について紹介していこうと思います。

 

フーリエ変換

フーリエ変換を適用することで、音の周波数特性を調べることができ、基本音と倍音の配合比率を分析することが出来ます。

本来、フーリエ変換は−∞から+∞の時刻まで観測したアナログ信号の周波数特性を調べるための数学的手法として考案されたものです。

フーリエ変換と逆フーリエ変換

{ \displaystyle X(f) = \int_{-\infty}^{\infty} x(t)exp(-j2πft) dt } \tag{1}

{ \displaystyle x(t) = \int_{-\infty}^{\infty} X(f)exp(j2πft) df } \tag{2} 

x(t)は時間tを変数とするアナログ信号、X(f)は周波数fを変数とするx(t)の周波数特性を表しています。

 

離散フーリエ変換

アナログ信号のフーリエ変換では、x(t)とX(f)のどちらも無限長の連続信号となりますが、コンピュータでは無限長の信号を扱うことが出来ません。そのため、コンピュータを使ってフーリエ変換を計算するには、tとfをそれぞれ0からN-1までの整数nとkに置き換えた「離散フーリエ変換(DFT)」を用います。

ここで、tsは標本化周期、fsaは標本化周波数とします。

{ \displaystyle t = nt_s \ (0 \le n \le N-1)} \tag{3} 

{ \displaystyle f = \frac{kf_s}{N} \ (0 \le k \le N-1)} \tag{4}

 

DFT(離散フーリエ変換)とIDFT(逆離散フーリエ変換): 

{ \displaystyle X(k) = \sum_{n=0}^{N-1} x(n)exp(\frac{-j2πkn}{N} ) \ (0 \le k \le N-1)} \tag{5} 

{ \displaystyle x(n) = \sum_{n=0}^{N-1} X(k)exp(\frac{j2πkn}{N} ) \ (0 \le n \le N-1)} \tag{5} 

ここで、x(n)は時間nを変数とするディジタル信号、X(k) は周波数kを変数とするx(n)の周波数特性を表します。

音声データの場合、x(n)は実数となり、X(k)は一般的に複素数となります。

 

 

コード: 


def dft(sig):
    X = []
    N = len(sig)
    for k in range(N):
        w = np.exp(-1j * 2 * np.pi * k / N)
        X_k = 0
        for n in range(N):
            X_k += sig[n] * (w**n)
        X.append(abs(X_k))
    return X

 

変数:

 X: dftの結果を格納する

 N: 入力データの長さ

 

for文(dft処理部):

1つ目のforで各周波数の計算を行っていく。

そして2つ目のforで、ある周波数kにおけるdftを音データ全てにかける。

 

 

実行結果 

以下のサイン波をDFTしてみました。

振幅:1

サンプリング周波数:8000

周波数:300

 

サイン波:

f:id:hiro-htm877:20181019164356p:plain
 
DFT後の振幅スペクトル:
f:id:hiro-htm877:20181019164534p:plain
 
300Hz付近に振幅スペクトルが出ています。
上手くDFTが出来ました。
 
8000Hz付近にもスペクトルが出ている理由ですが、
DFTによって求めた周波数特性は、k=N/2を中心として、振幅スペクトルは線対称、移送スペクトルは点対称になるという性質があります。
こうした周波数特性の対象構造はDFTの性質からもたらされる特徴となっています。標本化周波数の1/2よりも大きい周波数成分は標本化周波数の1/2以下のコピーに過ぎないそうです。
 
また、ディジタル信号は標本化周波数の1/2以下の周波数成分に限り、本来のアナログ信号と数学的に等しくなることが保証されるという特徴があります。ですので、DFTによって求めた周波数特性の1/2以下の成分だけが意味を持つことになります。
 
 
実行をしていく中で、DFTをした後の実部と虚部をプロットしてみるとすごく面白い結果が得られたので次の記事で紹介したいと思います。
ぜひみて欲しいです。私はすごく感動しました。
 
こちらから↓