読者です 読者をやめる 読者になる 読者になる

Volo di notte

お勉強の成果メモや日常のこと

FFTと窓関数の効果

chachay.hatenablog.com

先日FFTのエネルギーについて記事を書いたところ、 その内容を山岡さんに取り上げていただき面白い検証につながり大変楽しく読ませていただいています。

tadaoyamaoka.hatenablog.com

この中で周波数とパワースペクトルと、そしてビンの関係を考察してしていらっしゃいます。

具体的には「ピークの周波数の周辺のパワースペクトルの和がエネルギー(全周波数のパワースペクトルの総和)に占める割合」を求めていますが、拝見したところスペクトル漏れが起きているように見受けられます。

山岡さんの検討にハミング窓を加えるとスペクトル漏れが低減できるというのを示します。

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
fs = 44100
size = 4096
t = np.arange(0., size) / fs
frq = np.fft.fftfreq(size, 1./fs)

fset = np.linspace(400, 500, 1001)
range = [1, 3, 5]

hammingWindow = np.hamming(size)
range = [1, 3, 5]
for r in range:
    peaks = []
    for f in fset:
        y = np.sin(2 * np.pi * f * t)*hammingWindow
        Y = np.fft.fft(y)
        P = abs(Y[0:size/2])**2
        P_around = np.convolve(P, np.ones(r), 'valid')
        peaks.append(max(P_around) / sum(P))
    plt.plot(fset, peaks)
plt.axis([400, 500, 0, 1.1])
plt.show()

Before 窓関数なし(オリジナルの結果)

f:id:Chachay:20160901233229p:plain

After ハミング窓あり

f:id:Chachay:20160901232502p:plain

青 ピーク値 緑 ピークとサイドビン2個の和 赤 ピークとサイドビン4個の和

ここで周辺和を取らない結果が悪くなるのは、もう離散化の具合の話でそこはスペクトルの裾の広さに現れてしまうのは、昨日のエントリーの通りです。

参考

窓関数の理屈については、こちらが参考になると思います。

また、離散信号の扱いはスター変換など色々あるんですが、 私の出自が制御屋周辺なので、乱暴にいうとこの辺あたりから、 放浪の旅が始められるんではないかと感じました。

差し出がましながら、ここまで。