今更FFTについてです。たくさんの人がやっているけど自分用メモ。
fft後のデータはdBに変換して各周波数での差が分かればいい場面が多いですが、実際の単位で振幅が知りたい時があります。
周波数成分だけでなく、縦軸の値が知りたいときにはデータ長の半分で割ってあげます。
scipy.fftpack.fftを使います。
1 2 3 4 |
def calc_fft(data, fs): # データと周波数を読み込み frq = np.linspace(0, fs, len(data)) # 周波数を計算 yf = fft(data)/(len(data)/2) # fftする return np.abs(yf), frq |
実際に波形を読み込んでFFTするプログラムは以下の通り。
読み込みにはlibrosaを使ってますがpysoundfileでも大丈夫です。
グラフの描画にはmatplotlibを使ってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from scipy.fftpack import fft import librosa import matplotlib.pyplot as plt import numpy as np def wav_read(path): # 音声ファイルを読み込む wave, fs = librosa.core.load(path, mono=True) return wave, fs def calc_fft(data, fs): # FFTする frq = np.linspace(0, fs, len(data)) yf = fft(data)/(len(data)/2) return np.abs(yf), frq if __name__ == "__main__": source = "path_to_audio_file" wave, fs = wav_read(source) yf, frq = calc_fft(wave, fs) plt.plot(frq, yf) plt.axis([0, fs/2, 0, max(yf)]) plt.xlabel("Frequency(Hz)") plt.ylabel("Amplitude") plt.show() plt.close() |
コメント