#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 3   /* フィルタ次数+1 */
void iniv(double a[],int n);
void iir(int n,double a[],double b[], double x,double *y,double w[]);
main()
{
   int i,j,IT;
   double a[N],b[N],w[N];
   double x,y;
/* 配列の初期化 */
   iniv(w,N);
   iniv(a,N);
   iniv(b,N);
/* IIRフィルタの係数設定 */
   a[0]=1.0;
   a[1]=1.0;
   a[2]=1.0;
   b[1]=2.0;
   b[2]=3.0;
/* 入力信号の取り込み回数ITの設定 */
   IT=10;
/* ループ */
   for(i=0;i<IT;i++){
/* 入力信号の設定 (このサンプルはインパルス) */
      if(i==0)
         x=1.0;
      else
         x=0.0;
/* IIR関数へ */
      iir(N,a,b,x,&y,w);
/* 出力表示 */
      printf("out[%4d]=%lf\n",i,y);
/* データのシフト */
      for(j=N;j>=1;j--){
         w[j]=w[j-1];
      }
   }
}
/* 配列の初期化関数 */
void iniv(double a[],int n)
{
   int i;
   for(i=0;i<=n;i++){
      a[i]=0.0;
   }
}
/* IIRフィルタ関数 */
void iir(int n,double a[],double b[],double x, double *y,double w[])
{
   *y=0.0;
   w[0]=x+b[1]*w[1]+b[2]*w[2];
   *y=a[0]*w[0]+a[1]*w[1]+a[2]*w[2];
}
