はじめに
信号処理で広く使われる窓関数の、python
による生成方法は複数ある。
その生成方法によって微妙に振る舞いが異なったので備忘録として記録しておく。
(ここではハミング窓に限定。たぶんどの窓でも似たことが生じる)
比較対象
比べる候補は以下の3種類。窓幅は $N$ とする。
numpy.hamming(N)
scipy.signal.hamming(N)
scipy.signal.get_window('hamming', N)
比較結果
$N$ が奇数のときは全て同じ。
>>> import scipy.signal, numpy
>>> N = 5
>>> numpy.hamming(N)
array([ 0.08, 0.54, 1. , 0.54, 0.08])
>>> scipy.signal.hamming(N)
array([ 0.08, 0.54, 1. , 0.54, 0.08])
>>> scipy.signal.get_window('hamming', N)
array([ 0.08, 0.54, 1. , 0.54, 0.08])
しかし、$N$ が偶数になると様子が変わる。 (get_window
)
>>> import numpy, scipy.signal
>>> N = 4
>>> numpy.hamming(N)
array([ 0.08, 0.77, 0.77, 0.08])
>>> scipy.signal.hamming(N)
array([ 0.08, 0.77, 0.77, 0.08])
>>> scipy.signal.get_window('hamming', N)
array([ 0.08, 0.54, 1. , 0.54])
ところが、get_window
の 3 つ目の引数に False
をいれると結果が揃う。
>>> scipy.signal.get_window('hamming', N, False)
array([ 0.08, 0.77, 0.77, 0.08])
なぜか
scipy.signal.hamming
と numpy.hamming
は、デフォルトでは
左右対称になるように窓関数の値を生成する。
一方、get_window
では、FFT で使いやすいように"periodic"(?) な値が生成されて、
3つ目の引数を False
にすると、フィルタで使いやすい対称的な値が生成される。
そのため、デフォルトの振る舞いが関数によって異なっている。
参考文献
http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.hamming.html
http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.get_window.html