信号処理でよく出てくる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