/******************************************************************************

    wavfilt --- SSKFバンクによる8帯域分割と非線形量子化

      version 3.50                           by とご(電脳わ〜るど:DW0243)

    02/19/1995                                           "filter.c"

    帯域分割および合成に使用する関数を定義します。
    フィルタによる帯域分割の手法については参考文献をご覧のうえでソースをよく
  見てください。そのまんまというか、この部分にはこれといった工夫はありません。
  ただ参考文献でのＺ関数記述と、プログラムとの関連が掴みにくいかもしれません。
    ちなみにデータの連続性を保つための処理は処理単位の独立性を損なっており、
  せっかく苦労して導入したのはいいのですが、あとあと苦労の種になりかねないと
  感じています。

 *****************************************************************************/

#include "common.h"

void filtering(int *a,int *b,int *c,unsigned long d)
{
  int t,s;
  int tmp_low,tmp_high;

  /* t:被フィルタリング数列の現在の始点を表す */
  t = 1;
  /* ダウンサンプリングの手間を省くためにt=2k+1のときのみ処理する */
  for(s = 0; s < d; s++){
    tmp_low = -a[t]+3*a[t+1]+3*a[t+2]-a[t+3];
    tmp_high = a[t]-3*a[t+1]+3*a[t+2]-a[t+3];

    tmp_low /= CorrectFactor;
    tmp_high /= CorrectFactor;

    b[s] = tmp_low;
    c[s] = tmp_high;
    t += 2;
  }
  /* データの連続性を維持するための処置(説明は割愛) */
  /* 簡単にいうと、現在のセルの処理には直前のセルの尾部が必要なのね。*/
  memcpy((void *)&a[0],(void *)&a[d*2],4*(FilterSize - 1));
}


void untifilt(int *a,int *b,int *c,unsigned long d)
/* 現時点で2クロックの遅延は不可避 */
{
  int t,s;
  int cs_tmp1,cs_tmp2;

  /* t:復元前の被アンチフィルタリング数列の現在の始点 */
  /* s:復元結果の数列の位置 */
  t = 0;
  for(s = 0; s < d; s+=2){
  /* 帯域復元と合成とをいっぺんに記述してます(笑) */
    cs_tmp1 = 3*a[t]+a[t+1]+3*b[t]-b[t+1];
    cs_tmp2 = a[t]+3*a[t+1]+b[t]-3*b[t+1];

    c[s] = cs_tmp1 / CorrectFactor;
    c[s+1] = cs_tmp2 / CorrectFactor;
    t++;
  }

  /* 復元データの連続性を確保するための処置(説明は割愛) */
  /* 理由は簡単、filtering()のときと同じ(笑) */
  memcpy((void *)&a[0],(void *)&a[d/2],(FilterSize/2-1)*4);
  memcpy((void *)&b[0],(void *)&b[d/2],(FilterSize/2-1)*4);

}

