ΔΣ変調
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/