ハブ君の寝言

日記のような何か

ΔΣ変調

sin波をΔΣ変調させて量子1bitがうんたらかんたら

#include<stdio.h>
#include<math.h>
#define N 1024
#define fs 0.01

/*-----------------------------------------
// 関数:
// 	LPF(double*, double*):
// 入力:
//	double in[N]
// 出力:
// 	double out[N]
// 動作:
// 	移動平均フィルタ
//	tap数分のデータの平均をとる
------------------------------------------*/
void LPF(const double in[N], double out[N])
#define tap 16
{
  int i,j;
  out[0]=in[0];
  for(i=1;i<tap;i++){	// iがtapまではin[0]からin[i]までの平均
    out[i]=0.0;
    for(j=0;j<i;j++){
      out[i] += in[j];
    }
    out[i]/=i;
  }
  for(;i<N;i++){	// i>tapではtap前までの平均
    out[i] = 0.0;
    for(j=0;j<tap;j++)
      out[i] += in[i-j];
    out[i]/=tap;
  }
}

/*-----------------------------------
// 関数:
// 	double Q(double);
// 入力:
//	double x
// 出力:
// 	xが0以上なら1を返す
//	そうでなければ-1を返す
// 動作:
// 	入力xの値を0と比較し値を返す
------------------------------------*/
double Q(double x){
  return x >= 0 ? 1.0 : -1.0;
}

/*------------------------------------
// 関数:
// 	void dsf(const double*, double*);
// 入力:
//	double Xin[N]
// 出力:
// 	double Yout[N]
// 動作:
// 	ΔΣ変調を行う
//	フィードバックでHPFを通し量子化する
------------------------------------*/
void dsf(const double Xin[N], double Yout[N]){
  double d[3];
  int i;
  d[0]=d[1]=d[2]=0.0;
  for(i=0;i<N;i++){
    d[0] = Xin[i] + d[0] - d[2];
    d[1] = d[0] + d[1] - d[2];
    d[2] = Yout[i] = Q(d[1]);
  }
}

/*
  main関数
*/
int main(){
	double *Xin = (double *)malloc(sizeof(double)*N);
	double *Yout = (double *)malloc(sizeof(double)*N);
	double *Yf = (double *)malloc(sizeof(double)*N);
	double *Zout = (double *)malloc(sizeof(double)*N);
	double t;
	
	int i;
	t=0.0;
	for(i=0;i<N;i++){
		Xin[i] = sin(t);		// sin波
		t+=fs;
	}
	dsf(Xin,Yout);		// ΔΣ変調
//	fft(Xin,Yf);		// FFTは割愛
	LPF(Yout,Zout);		// ローパスフィルタ
	t = 0.0;
	for(i=0;i<N;i++){
		printf("%lf %lf %lf %lf %lf\n",t,Yout[i],Xin[i],Yf[i],Zout[i]);
		t+=fs;
	}
	free(Xin);
	free(Yout);
	free(Yf);
	free(Zout);
	return 0;
}
  • -

参考:ΔΣ変調の部屋
http://www.okuma.nuee.nagoya-u.ac.jp/~murahasi/dsm/