Nicotto Town


毎日えんやこらせっせ


直線補間より機能的な曲線補間

 自然スプラインのリンギングに苦しんだ挙句、いろいろ調べてるうちに思いついた
補間方法。一ヶ月もすれば式とか忘れてそうなので、心覚えも兼ねて。

 直線補間て x0からx1 へ直線で結んでるだけだよね。簡単だよね。てな話だと、
これ以上先には進めない。遅いので有名なバブルソートが色々と
あーでもないこーでもないとこねくり回された末に、クイックソートや
コムソートが誕生したように、直線補間をあえて難しく見ます。w

 するってーと、直線補間は一次のB-Spline補間で、区間方程式がこうなってる

 f(x) = 1 - x   (0 <= x <= 1)
      0      (1 <= x)
     f(-x)    (x <= 0)

 直線だと嫌なの~! てーとコサイン補間てのがあって、こう

 f(x) = 0.5 + 0.5cos(πx)    (0 <= x <= 1)
       0                 (1 <= x)
     f(-x)              (x <= 0)

 コサインは割ときれいな曲線だし、線を繋げるポイントが傾きゼロなので、
曲線として滑らかに繋がってると言えなくもない。直線補間の傾きは-1で
傾きすぎかもだけども、必ず傾きゼロで繋げるのもどうなのよ?
って事で、傾き-1/2を考えた。おまけで傾きが自由に設定できるようにもなった。

 f(x) = 2(1+a)x**3 - 3(1+a)x**2 + ax + 1   (0 <= x <= 1)
       0                               (1 <= x)
     f(-x)                             (x <= 0)
      aが傾き (-1 <= a <= 0)で指定可能

 区間関数のグラフはこんなの
     http://kie.nu/Du-

 傾き-1の時は完全に直線補間で、ゼロの時はほぼコサイン補間。
どちらにしても、TrueTypeの曲線で有名な二次のB-Spline程は太ましくないのも
よさげ。通常時は中を取って-1/2で利用すると、とても良さげ。売りは

・最小2でも曲線的に補間可能
・オーバーシュートもリンギングも絶対しない
・確実に指定の点を通る
・計算コストが割と少ない

 B-Spline一族なら指定の点を通らないもっと平均化された曲線にしたいと思うことも
ありますよね。そんな時は事前に指定の点を平均化してから、この補間を使うと
ばっちり! 二次のB-Splineだと、均等に振動してる点は直線で補間してしまいますが、
その様な調整も事前に可能!


 と、物凄く素晴らしいかの様に宣伝したけど、だいたい何にでも使えるってのは、

     使いこなしが大変で、誰も使わない

と相場が決まってる。自分でもどれくらい使うかは全く謎。w

 まだ実際に試してないしな、どうなるのでしょうな~。そもそも直線補間より
遥かに良くなるのかな。

アバター
2012/12/21 22:47
 区間関数の符号を写し間違えてた! orz

 ちょっと式の変形が必要で、弄ろうとしたら変な結果しか出なくて、泣きそうになったわ。エクセルの文章から間違えてたので、セルの計算式で確認してやっと判った。

 日記の文章の式は、正しいものに修正済み。
アバター
2012/12/20 21:08
 まあ、レベルが違うけどな。

 滑らか曲線というと、最近はほとんどCG畑の話ばっかりで3Dが多い。MMDの動作を滑らかに補間するとかいっぱい引っかかる。1Dな音声がらみの話はなかなか引っかからないんだよな~。
アバター
2012/12/20 10:09
最近話題のCOMMやLINEといった無料音声通話アプリ技術陣の話をネットでみてたのですが、
あっちは雑音を減らして通話者の音声だけをきれいにとる波形の滑らか研究をしてましたが、
Enさんは人造音声をらしくの研究してると思いますが、けっこう近いことしてると思いました。




Copyright © 2025 SMILE-LAB Co., Ltd. All Rights Reserved.