低通滤波器差分方程用C语言实现的问题

2019-07-15 18:56发布

本帖最后由 hanl 于 2011-7-21 10:07 编辑


我用C语言实现一个butterworth低通滤波器,现在遇到问题,please help me!
实现过程:
1、采样频率10KHz,通带边界频率2KHz,通带波纹小于1dB,阻带边界频率3KHz,阻带衰减大于40dB。
2、用matlab求出滤波器系数b,a
  1. >> Fp = 2000;
  2. >> Fs = 3000;
  3. >> F = 10000;
  4. >> T = 1/F;
  5. >> Ap = 1;
  6. >> As = 40;
  7. >> Wp = Fp*T*2;
  8. >> Ws = Fs*T*2;
  9. >> [n,Wc] = buttord(Wp,Ws,Ap,As);
  10. >> [b,a] = butter(n,Wc)

  11. b =

  12. 0.0021 0.0186 0.0745 0.1739 0.2609 0.2609 0.1739 0.0745 0.0186 0.0021


  13. a =

  14. 1.0000 -1.0893 1.6925 -1.0804 0.7329 -0.2722 0.0916 -0.0174 0.0024 -0.0001

  15. >>
复制代码3、差分方程: y(0) = b(0)*x(0) + b(1)*x(1) +...+ b(9)*x(9) - {a(1)*y(1) + a(2)*y(2) +...+ a(9)*y(9)}
4、程序:
  1. double a[L] = {1.0000, -1.0893, 1.6925, -1.0804, 0.7329, -0.2722, 0.0916, -0.0174, 0.0024, -0.0001};
  2. double b[L] = {0.0021, 0.0186, 0.0745, 0.1739, 0.2609, 0.2609, 0.1739, 0.0745, 0.0186, 0.0021};

  3. read(&input); //输入范围:-10V~+10V ,量化范围 0~65535
  4. x[0] = input-32767;  
  5. for (i=0; i<=L-1; i++)
  6. {
  7. b_sum = b[i]*x[i] + b_sum;
  8. a_sum = a[i+1]*y[i+1] + a_sum;
  9. }
  10. y[0] = b_sum - a_sum;
  11. output = y[0];
  12. for (i=L-1; i>=1; i--)
  13. {
  14. x[i] = x[i-1];
  15. y[i] = y[i-1];
  16. }
  17. write(output);
复制代码5、测试结果
   a、无输入
Screenshot1.png   (单位:0.1ms)

b、输入1KHz正弦波,峰峰值 4V
Screenshot2.png   (单位:0.1ms)

到此,不知道哪里出了问题,请高人赐教

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。