どうもこんにちは、今回は音声信号処理の基礎「離散フーリエ変換」について紹介していこうと思います。
フーリエ変換
フーリエ変換を適用することで、音の周波数特性を調べることができ、基本音と倍音の配合比率を分析することが出来ます。
本来、フーリエ変換は−∞から+∞の時刻まで観測したアナログ信号の周波数特性を調べるための数学的手法として考案されたものです。
x(t)は時間tを変数とするアナログ信号、X(f)は周波数fを変数とするx(t)の周波数特性を表しています。
離散フーリエ変換
アナログ信号のフーリエ変換では、x(t)とX(f)のどちらも無限長の連続信号となりますが、コンピュータでは無限長の信号を扱うことが出来ません。そのため、コンピュータを使ってフーリエ変換を計算するには、tとfをそれぞれ0からN-1までの整数nとkに置き換えた「離散フーリエ変換(DFT)」を用います。
ここで、tsは標本化周期、fsaは標本化周波数とします。
DFT(離散フーリエ変換)とIDFT(逆離散フーリエ変換):
ここで、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
サイン波:

