Slide 6
Slide 6 text
© DeNA Co., Ltd. 6
5 GetRawF0Candidates - バンドパスフィルタ
cos 関数とナットール窓を掛け合わせて作られた線形位相バンドパスフィルタと、
その周波数応答 (ピークの周波数が 200Hz の場合)
sr = 24000
freq = 200 # バンドパスフィルタのピーク周波数
period = sr // freq # 周期
n_fft = 1 << 16
win = np.zeros(n_fft)
win[:4 * period] = scipy.signal.nuttall(4 * period)
win[:4 * period] *= np.cos(np.linspace(0.0, 8.0 * np.pi, 4 * period))
plt.figure(figsize=(10, 4))
plt.plot(win[:4 * period])
plt.grid(color="gray")
plt.show()
f = np.fft.rfft(win)
w = 20 * np.log10(np.abs(f))
w -= w.max()
plt.figure(figsize=(10, 4))
plt.plot(np.arange(n_fft // 2 + 1) / n_fft * sr, w)
plt.grid(color="gray")
plt.xlabel("frequency [Hz]")
plt.ylabel("[dB]")
plt.xlim(0, 1000)
plt.ylim(-120, 0)
plt.show()
左の図の描画コード
● 200Hz の cos 関数は周波数領域で 200 Hz にピークの立つデルタ関数になる
● 長さ 4/200 秒のナットール窓は周波数領域でメインローブの半径が 200Hz になる
● 時間領域の掛け算は周波数領域の畳み込みなので、上記の周波数応答が得られる