巴特沃斯滤波器c语言.docx

上传人:b****5 文档编号:14513790 上传时间:2023-06-24 格式:DOCX 页数:24 大小:224.51KB
下载 相关 举报
巴特沃斯滤波器c语言.docx_第1页
第1页 / 共24页
巴特沃斯滤波器c语言.docx_第2页
第2页 / 共24页
巴特沃斯滤波器c语言.docx_第3页
第3页 / 共24页
巴特沃斯滤波器c语言.docx_第4页
第4页 / 共24页
巴特沃斯滤波器c语言.docx_第5页
第5页 / 共24页
巴特沃斯滤波器c语言.docx_第6页
第6页 / 共24页
巴特沃斯滤波器c语言.docx_第7页
第7页 / 共24页
巴特沃斯滤波器c语言.docx_第8页
第8页 / 共24页
巴特沃斯滤波器c语言.docx_第9页
第9页 / 共24页
巴特沃斯滤波器c语言.docx_第10页
第10页 / 共24页
巴特沃斯滤波器c语言.docx_第11页
第11页 / 共24页
巴特沃斯滤波器c语言.docx_第12页
第12页 / 共24页
巴特沃斯滤波器c语言.docx_第13页
第13页 / 共24页
巴特沃斯滤波器c语言.docx_第14页
第14页 / 共24页
巴特沃斯滤波器c语言.docx_第15页
第15页 / 共24页
巴特沃斯滤波器c语言.docx_第16页
第16页 / 共24页
巴特沃斯滤波器c语言.docx_第17页
第17页 / 共24页
巴特沃斯滤波器c语言.docx_第18页
第18页 / 共24页
巴特沃斯滤波器c语言.docx_第19页
第19页 / 共24页
巴特沃斯滤波器c语言.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

巴特沃斯滤波器c语言.docx

《巴特沃斯滤波器c语言.docx》由会员分享,可在线阅读,更多相关《巴特沃斯滤波器c语言.docx(24页珍藏版)》请在冰点文库上搜索。

巴特沃斯滤波器c语言.docx

巴特沃斯滤波器c语言

1.模拟滤波器的设计

   1.1巴特沃斯滤波器的次数

    根据给定的参数设计模拟滤波器,然后进行变数变换,求取数字滤波器的方法,称为滤波器的间接设计。

做为数字滤波器的设计基础的模拟滤波器,称之为原型滤波器。

这里,我们首先介绍的是最简单最基础的原型滤波器,巴特沃斯低通滤波器。

由于IIR滤波器不具有线性相位特性,因此不必考虑相位特性,直接考虑其振幅特性。

    在这里,N是滤波器的次数,Ωc是截止频率。

从上式的振幅特性可以看出,这个是单调递减的函数,其振幅特性是不存在纹波的。

设计的时候,一般需要先计算跟所需要设计参数相符合的次数N。

首先,就需要先由阻带频率,计算出阻带衰减

将巴特沃斯低通滤波器的振幅特性,直接带入上式,则有

最后,可以解得次数N为

当然,这里的N只能为正数,因此,若结果为小数,则舍弃小数,向上取整。

   

1.2巴特沃斯滤波器的传递函数

     巴特沃斯低通滤波器的传递函数,可由其振幅特性的分母多项式求得。

其分母多项式

根据S解开,可以得到极点。

这里,为了方便处理,我们分为两种情况去解这个方程。

当N为偶数的时候,

这里,使用了欧拉公式

同样的,当N为奇数的时候,

同样的,这里也使用了欧拉公式。

归纳以上,极点的解为

上式所求得的极点,是在s平面内,在半径为Ωc的圆上等间距的点,其数量为2N个。

为了使得其IIR滤波器稳定,那么,只能选取极点在S平面左半平面的点。

选定了稳定的极点之后,其模拟滤波器的传递函数就可由下式求得。

    1.3巴特沃斯滤波器的实现(C语言)

     首先,是次数的计算。

次数的计算,我们可以由下式求得。

     

其对应的C语言程序为

[cpp] viewplaincopy

1.N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) /   

2.            log10 (Stopband/Cotoff) ));  

     然后是极点的选择,这里由于涉及到复数的操作,我们就声明一个复数结构体就可以了。

最重要的是,极点的计算含有自然指数函数,这点对于计算机来讲,不是太方便,所以,我们将其替换为三角函数,

这样的话,实部与虚部就还可以分开来计算。

其代码实现为

[cpp] viewplaincopy

1.typedef struct   

2.{  

3.    double Real_part;  

4.    double Imag_Part;  

5.} COMPLEX;  

6.  

7.  

8.COMPLEX poles[N];  

9.  

10.for(k = 0;k <= ((2*N)-1) ; k++)  

11.{  

12.    if(Cotoff*cos((k+dk)*(pi/N)) < 0)  

13.    {  

14.        poles[count].Real_part = -Cotoff*cos((k+dk)*(pi/N));  

15.      poles[count].Imag_Part= -Cotoff*sin((k+dk)*(pi/N));        

16.        count++;  

17.        if (count == N) break;  

18.    }  

19.}   

    计算出稳定的极点之后,就可以进行传递函数的计算了。

传递的函数的计算,就像下式一样

这里,为了得到模拟滤波器的系数,需要将分母乘开。

很显然,这里的极点不一定是整数,或者来说,这里的乘开需要做复数运算。

其复数的乘法代码如下,

[cpp] viewplaincopy

1.int Complex_Multiple(COMPLEX a,COMPLEX b,  

2.                 double *Res_Real,double *Res_Imag)  

3.      

4.{  

5.       *(Res_Real) =  (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);  

6.       *(Res_Imag)=  (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part);      

7.     return (int)1;   

8.}  

有了乘法代码之后,我们现在简单的情况下,看看其如何计算其滤波器系数。

我们做如下假设

这个时候,其传递函数为

将其乘开,其大致的关系就像下图所示一样。

计算的关系一目了然,这样的话,实现就简单多了。

高阶的情况下也一样,重复这种计算就可以了。

其代码为

[cpp] viewplaincopy

1. Res[0].Real_part = poles[0].Real_part;   

2. Res[0].Imag_Part= poles[0].Imag_Part;  

3. Res[1].Real_part = 1;   

4. Res[1].Imag_Part= 0;  

5.  

6.for(count_1 = 0;count_1 < N-1;count_1++)  

7.{  

8.  for(count = 0;count <= count_1 + 2;count++)  

9.  {  

10.      if(0 == count)  

11.  {  

12.              Complex_Multiple(Res[count], poles[count_1+1],  

13.                   &(Res_Save[count].Real_part),  

14.                   &(Res_Save[count].Imag_Part));  

15.      }  

16.      else if((count_1 + 2) == count)  

17.      {  

18.            Res_Save[count].Real_part  += Res[count - 1].Real_part;  

19.    Res_Save[count].Imag_Part += Res[count - 1].Imag_Part;  

20.      }         

21.   else   

22.   {  

23.              Complex_Multiple(Res[count], poles[count_1+1],  

24.                   &(Res_Save[count].Real_part),  

25.                   &(Res_Save[count].Imag_Part));                 

26.1     Res_Save[count].Real_part  += Res[count - 1].Real_part;  

27.     Res_Save[count].Imag_Part += Res[count - 1].Imag_Part;  

28.  }  

29.  }  

30.   *(b+N) = *(a+N);  

到此,我们就可以得到一个模拟滤波器巴特沃斯低通滤波器了。

2.双1次z变换

   2.1双1次z变换的原理

    我们为了将模拟滤波器转换为数字滤波器的,可以用的方法很多。

这里着重说说双1次z变换。

我们希望通过双1次z变换,建立一个s平面到z平面的映射关系,将模拟滤波器转换为数字滤波器。

    和之前的例子一样,我们假设有如下模拟滤波器的传递函数。

将其做拉普拉斯逆变换,可得到其时间域内的连续微分方程式,

其中,x(t)表示输入,y(t)表示输出。

然后我们需要将其离散化,假设其采样周期是T,用差分方程去近似的替代微分方程,可以得到下面结果

然后使用z变换,再将其化简。

可得到如下结果

从而,我们可以得到了s平面到z平面的映射关系,即

由于所有的高阶系统都可以视为一阶系统的并联,所以,这个映射关系在高阶系统中,也是成立的。

然后,将关系式

带入上式,可得

到这里,我们可以就可以得到Ω与ω的对应关系了。

     这里的Ω与ω的对应关系很重要。

我们最终的目的设计的是数字滤波器,所以,设计时候给的参数必定是数字滤波器的指标。

而我们通过间接设计设计IIR滤波器时候,首先是要设计模拟滤波器,再通过变换,得到数字滤波器。

那么,我们首先需要做的,就是将数字滤波器的指标,转换为模拟滤波器的指标,基于这个指标去设计模拟滤波器。

另外,这里的采样时间T的取值很随意,为了方便计算,一般取1s就可以。

    2.2双1次z变换的实现(C语言)

     我们设计好的巴特沃斯低通滤波器的传递函数如下所示。

   

我们将其进行双1次z变换,我们可以得到如下式子

可以看出,我们还是需要将式子乘开,进行合并同类项,这个跟之前说的算法相差不大。

其代码为。

[cpp] viewplaincopy

1.for(Count = 0;Count<=N;Count++)  

2.    {         

3.           for(Count_Z = 0;Count_Z <= N;Count_Z++)  

4.            {  

5.                 Res[Count_Z] = 0;  

6.             Res_Save[Count_Z] = 0;    

7.            }  

8.                Res_Save [0] = 1;  

9.           for(Count_1 = 0; Count_1 < N-Count;Count_1++)  

10.            {  

11.              for(Count_2 = 0; Count_2 <= Count_1+1;Count_2++)  

12.                {  

13.                    if(Count_2 == 0)  Res[Count_2] += Res_Save[Count_2];      

14.                  else if((Count_2 == (Count_1+1))&&(Count_1 !

= 0))    

15.                            Res[Count_2] += -Res_Save[Count_2 - 1];   

16.                  else  Res[Count_2] += Res_Save[Count_2] - Res_Save[Count_2 - 1];  

17.              for(Count_Z = 0;Count_Z<= N;Count_Z++)  

18.                 {  

19.                      Res_Save[Count_Z]  =  Res[Count_Z] ;  

20.                     Res[Count_Z]  = 0;  

21.                 }            

22.            }  

23.        for(Count_1 = (N-Count); Count_1 < N;Count_1++)  

24.            {  

25.                        for(Count_2 = 0; Count_2 <= Count_1+1;Count_2++)  

26.                {  

27.                     if(Count_2 == 0)  Res[Count_2] += Res_Save[Count_2];     

28.                 else if((Count_2 == (Count_1+1))&&(Count_1 !

= 0))    

29.                              Res[Count_2] += Res_Save[Count_2 - 1];  

30.                 else    

31.                       Res[Count_2] += Res_Save[Count_2] + Res_Save[Count_2 - 1];     

32.             }  

33.                  for(Count_Z = 0;Count_Z<= N;Count_Z++)  

34.                  {  

35.                       Res_Save[Count_Z]  =  Res[Count_Z] ;  

36.                   Res[Count_Z]  = 0;  

37.                  }  

38.            }  

39.            for(Count_Z = 0;Count_Z<= N;Count_Z++)  

40.        {  

41.                    *(az+Count_Z) +=  pow(2,N-Count) * (*(as+Count)) *  

42.                       Res_Save[Count_Z];  

43.                *(bz+Count_Z) +=  (*(bs+Count)) * Res_Save[Count_Z];               

44.         }    

45.    }  

到此,我们就已经实现了一个数字滤波器。

3.IIR滤波器的间接设计代码(C语言)

[cpp] viewplaincopy

1.#include   

2.#include   

3.#include   

4.#include   

5.  

6.  

7.#define     pi     ((double)3.1415926)  

8.  

9.  

10.struct DESIGN_SPECIFICATION  

11.{  

12.    double Cotoff;     

13.    double Stopband;  

14.    double Stopband_attenuation;  

15.};  

16.  

17.typedef struct   

18.{  

19.    double Real_part;  

20.    double Imag_Part;  

21.} COMPLEX;  

22.  

23.  

24.  

25.int Ceil(double input)  

26.{  

27.     if(input !

= (int)input) return ((int)input) +1;  

28.     else return ((int)input);   

29.}  

30.  

31.  

32.int Complex_Multiple(COMPLEX a,COMPLEX b  

33.                                     ,double *Res_Real,double *Res_Imag)  

34.      

35.{  

36.       *(Res_Real) =  (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);  

37.       *(Res_Imag)=  (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part);      

38.     return (int)1;   

39.}  

40.  

41.  

42.int Buttord(double Cotoff,  

43.                 double Stopband,  

44.                 double Stopband_attenuation)  

45.{  

46.   int N;  

47.  

48.   printf("Wc =  %lf  [rad/sec] \n" ,Cotoff);  

49.   printf("Ws =  %lf  [rad/sec] \n" ,Stopband);  

50.   printf("As  =  %lf  [dB] \n" ,Stopband_attenuation);  

51.   printf("--------------------------------------------------------\n" );  

52.       

53.   N = Ceil(0.5*( log10 ( pow (10, Stopband_attenuation/10) - 1) /   

54.                    log10 (Stopband/Cotoff) ));  

55.     

56.     

57.   return (int)N;  

58.}  

59.  

60.  

61.int Butter(int N, double Cotoff,  

62.               double *a,  

63.               double *b)  

64.{  

65.    double dk = 0;  

66.    int k = 0;  

67.    int count = 0,count_1 = 0;  

68.    COMPLEX poles[N];  

69.    COMPLEX Res[N+1],Res_Save[N+1];  

70.  

71.    if((N%2) == 0) dk = 0.5;  

72.    else dk = 0;  

73.  

74.    for(k = 0;k <= ((2*N)-1) ; k++)  

75.    {  

76.         if(Cotoff*cos((k+dk)*(pi/N)) < 0)  

77.         {  

78.               poles[count].Real_part = -Cotoff*cos((k+dk)*(pi/N));  

79.          poles[count].Imag_Part= -Cotoff*sin((k+dk)*(pi/N));        

80.              count++;  

81.            if (count == N) break;  

82.         }  

83.    }   

84.  

85.     printf("Pk =   \n" );     

86.     for(count = 0;count < N ;count++)  

87.     {  

88.           printf("(%lf) + (%lf i) \n" ,-poles[count].Real_part  

89.                                      ,-poles[count].Imag_Part);  

90.     }  

91.     printf("--------------------------------------------------------\n" );  

92.       

93.     Res[0].Real_part = poles[0].Real_part;   

94.     Res[0].Imag_Part= poles[0].Imag_Part;  

95.  

96.     Res[1].Real_part = 1;   

97.     Res[1].Imag_Part= 0;  

98.  

99.    for(count_1 = 0;count_1 < N-1;count_1++)  

100.    {  

101.         for(count = 0;count <= count_1 + 2;count++)  

102.         {  

103.              if(0 == count)  

104.           {  

105.                    Complex_Multiple(Res[count], poles[count_1+1],  

106.                                   &(Res_Save[count].Real_part),  

107.                                   &(Res_Save[count].Imag_Part));  

108.               //printf( "Res_Save :

 (%lf) + (%lf i) \n" ,Res_Save[0].Real_part,Res_Save[0].Imag_Part);  

109.              }  

110.  

111.              else if((count_1 + 2) == count)  

112.              {  

113.                     Res_Save[count].Real_par

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2