Hann窓の実装

信号処理でよく出てくるHann窓(別名raised cosine)をCommon Lispで実装しました。例えば64点の窓が欲しいときにはx = [0...63]/63とやってあげて、w(x) = 0.5 - 0.5 cos(2πx)に突っ込んであげればOKです。簡単ですね。

(defun hann (n)
  "Hann window of length n."
  (assert (> n 0))
  (let ((nn (1- n)))
    (if (= n 1)
        1
        (mapcar #'(lambda (x)
                    (- 0.5 (* 0.5 (cos (/ (* 2 pi x) nn)))))
                (linspace 0 (1- n) n)))))

Octaveのhanning実装を参考にしたので当たり前ですが、計算結果はOctaveの結果と一致してます。

CL-USER> (hann 10)
(0.0d0 0.116977778440511d0 0.4131759111665348d0 0.7499999999999999d0
 0.9698463103929542d0 0.9698463103929542d0 0.7500000000000002d0
 0.413175911166535d0 0.1169777784405111d0 0.0d0)
>> hanning(10)
ans =
        0
   0.1170
   0.4132
   0.7500
   0.9698
   0.9698
   0.7500
   0.4132
   0.1170
        0