public static class hiFilter.CubeSpline extends Object
FIFO(押し出し型)フィルタ;構築子+put()
 指定サンプル数のデータによって得られる領域(処理対象区間:窓)をスプライン補完し、サンプルが入力されるたびに
 中央区間部の補完データを出力します。
 サンプルデータ数は処理対象区間数+1となります。
 
出力には窓分の遅延が有ります。
例えば入力キューから値を得、補間したデータを出力キューに出すには次の様にします。
hiSyncQue<Double>_inputQue =new hiSyncQue<>();hiSyncQue<Double>_outputQue=new hiSynqQue<>(); hiFilter.CubeSpline _filter =new hiFilter.CubeSpline(5,10); Double _inputValue; while( (_inputValue=_inputQue.get()!= null ){ double[] _outputValues= _filter.put(_inputValue); if( _outputValues==null ) continue;// データ蓄積中 最初の5個はデータが出ません for( double _outputValue:_outputValues ){ _outputQue.put(_outputValue); } }
中央部区間のみ採用することにより区間と区間は滑らかに繋がるようにしてあります。 サンプル数(窓サイズ)を大きくとれば、より滑らかに繋がります。
ループしたデータの補間;static asLoop()
ループしたデータを最後から先頭に滑らかに繋がるように補間します。
 
次のような形で無限に繋がった滑らかな波形を生み出すことが出来ます。
   hiSyncQue<Double> _outputQue=new hiSynqQue<>();
   double _input_values[] = {....}// 元の値をセット
   int    _divide         = 5;    // 1区間の分割数
   double _output_values[]= hiFilter.CubeSpline.asLoop(_values,divide_);
   while(...){
      // _output_valuesの最後の値の次は先頭値で滑らかに繋がる
      for( double _val:_output_values ){
         _outputQue.put(_val);
         }
      }
出力データ数はサンプリングデータ数×1区間の分割数となります。
末端を持つデータの補間;static asFilament()
末端を持つ糸状の形態として補間します。
 
サンプリングデータの後端データが、結果の後端データになります。出力データ数はサンプリングデータ数×1区間の分割数+1となります。
   hiSyncQue<Double> _outputQue=new hiSynqQue<>();
   double _input_values[] = {....}// 元の値をセット
   int    _divide         = 4;    // 1区間の分割数
   double _output_values[]= hiFilter.CubeSpline.asFilament(_values,divide_);
   for( double _val:_output_values ){ // sample最終端を含む
      _outputQue.put(_val);
      }
| コンストラクタと説明 | 
|---|
| CubeSpline(int segments_,
          int divide_)
処理対象区間数と区間内の分解数を指定します。 | 
| 修飾子とタイプ | メソッドと説明 | 
|---|---|
| static double[] | asFilament(double[] values_,
          int divide_)指定値が単純に末端を持つものとしてスプライン値を得る. | 
| static double[] | asLoop(double[] values_,
      int divide_)指定値がループを形成するものとしてスプライン値を得る. | 
| double[] | put(double value_)値を追加する.中央区間の補完情報が押し出されてくる. | 
public CubeSpline(int segments_,
                  int divide_)
処理対象区間数と区間内の分解数を指定します。
例えば冒頭の図は対象区間数=5,分割数=10です。
segments_ - スプライン補完を行う対象区間数()divide_ - 区間の分解数public double[] put(double value_)
value_ - 入力値public static double[] asLoop(double[] values_,
                              int divide_)
指定値がループを形成するものとして最後と先頭が滑らかに繋がるスプライン補完された値を得ます。
values_ - 値の並びdivide_ - 区間の分解数public static double[] asFilament(double[] values_,
                                  int divide_)
values_ - 値の並びdivide_ - 区間の分解数