2012年8月28日火曜日

技術的な記事がすくないな。

日記だから。
どうでもいい事なのだが、改めて見ると技術的な記事が少ないと感じた。

現在進行中のオウチで開発しているネタはいくつかある。
記事にしてもいいんだけど、いざ書くとなるとプロとして間違えてはいけないような気がして面倒になる。
あまりまとめずにちょっとだけ書いておこうか。

Lanczos filterと言うものがあることを数ヶ月前に人から聞いた。
時間が出来たら、調べてみようと思ってほったらかしにしていた。
職業柄、信号の立ち上がりタイミングが重要だったりする。それでいて、ナイキストギリギリで切ったデータなので、立ち上がりタイミングが解りにくい。
タイミング評価のために、数年前に内挿フィルタを試行錯誤で実装した。
Wikipediaの記事を見ながら、ざっくりとした表現から、Excelで作ってみたり、Cで書いてみたりしながら、理解を深めて書いた。
sincフィルタを用いた内挿処理なのだが、論理的にsincフィルタは無限のデータ範囲が必要になる。
この様な場合、窓関数が重要になるが、その当時はどのような窓が良いのかまでは結局調べず、エイヤーでcos()窓にしていた。
あまり性能は良くなかったのだが、とりあえずは使えるので放置していた。

最近になって、Lanczos filterの話を思い出したので、調べてみた。
日本語のWikipeidaには、あまり良い記事が無かったが、英語のページには細かく書かれていた。
ようは、sincフィルタの窓を、sincの真ん中の出っ張り(高さが1から0に落ちるところまで)にしたものだ。
実装もしやすい。
フィルタ係数は全部加算すれば1.0になるはずだが、実際には窓で切ってしまうので、誤差が乗る。
この誤差がcos()窓よりも、Lanczos窓の方が小さい。そのため、少ない係数の数でも、計算で混入する高周波が小さくなる。
cos()窓でも、広い範囲にすれば高周波は小さくなるが、広くすると立ち上がりの前の方に信号が染み出してくる。いうならば、因果律を越えて、過去に情報が漏れているような感じになる。厄介な問題だ。
シミ出しは無くならないものの、係数(タップ数)が少なくて済むなら、それを小さく抑えられる。

仕事で使う道具も、遊びで使う道具も、Lanczos窓に書き換えた。
ついでに内挿フィルタの処理速度をtuneし始めた。
現在の2倍を目指しているが、現時点では1.2倍。先は長い。

Step by Stepでやっていく予定。

0 件のコメント:

コメントを投稿