巴特沃斯滤波器c语言Word文件下载.docx
《巴特沃斯滤波器c语言Word文件下载.docx》由会员分享,可在线阅读,更多相关《巴特沃斯滤波器c语言Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
同样的,这里也使用了欧拉公式。
归纳以上,极点的解为
上式所求得的极点,是在s平面内,在半径为Ωc的圆上等间距的点,其数量为2N个。
为了使得其IIR滤波器稳定,那么,只能选取极点在S平面左半平面的点。
选定了稳定的极点之后,其模拟滤波器的传递函数就可由下式求得。
1.3巴特沃斯滤波器的实现(C语言)
首先,是次数的计算。
次数的计算,我们可以由下式求得。
其对应的C语言程序为
[cpp]
viewplaincopy
1.N
=
Ceil(0.5*(
log10
(
pow
(10,
Stopband_attenuation/10)
-
1)
/
2.
(Stopband/Cotoff)
));
然后是极点的选择,这里由于涉及到复数的操作,我们就声明一个复数结构体就可以了。
最重要的是,极点的计算含有自然指数函数,这点对于计算机来讲,不是太方便,所以,我们将其替换为三角函数,
这样的话,实部与虚部就还可以分开来计算。
其代码实现为
1.typedef
struct
2.{
3.
double
Real_part;
4.
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.}
计算出稳定的极点之后,就可以进行传递函数的计算了。
传递的函数的计算,就像下式一样
这里,为了得到模拟滤波器的系数,需要将分母乘开。
很显然,这里的极点不一定是整数,或者来说,这里的乘开需要做复数运算。
其复数的乘法代码如下,
1.int
Complex_Multiple(COMPLEX
a,COMPLEX
b,
*Res_Real,double
*Res_Imag)
4.{
5.
*(Res_Real)
(a.Real_part)*(b.Real_part)
(a.Imag_Part)*(b.Imag_Part);
*(Res_Imag)=
(a.Imag_Part)*(b.Real_part)
+
(a.Real_part)*(b.Imag_Part);
return
(int)1;
8.}
有了乘法代码之后,我们现在简单的情况下,看看其如何计算其滤波器系数。
我们做如下假设
这个时候,其传递函数为
将其乘开,其大致的关系就像下图所示一样。
计算的关系一目了然,这样的话,实现就简单多了。
高阶的情况下也一样,重复这种计算就可以了。
其代码为
1.
Res[0].Real_part
poles[0].Real_part;
Res[0].Imag_Part=
poles[0].Imag_Part;
Res[1].Real_part
1;
Res[1].Imag_Part=
6.for(count_1
count_1
N-1;
count_1++)
7.{
8.
for(count
count
2;
count++)
10.
if(0
count)
11.
{
Complex_Multiple(Res[count],
poles[count_1+1],
&
(Res_Save[count].Real_part),
(Res_Save[count].Imag_Part));
else
if((count_1
2)
Res_Save[count].Real_part
+=
Res[count
1].Real_part;
19.
Res_Save[count].Imag_Part
1].Imag_Part;
20.
21.
else
22.
23.
24.
25.
26.1
Res_Save[count].Real_part
27.
Res_Save[count].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变换,我们可以得到如下式子
可以看出,我们还是需要将式子乘开,进行合并同类项,这个跟之前说的算法相差不大。
其代码为。
1.for(Count
Count<
=N;
Count++)
for(Count_Z
Count_Z
N;
Count_Z++)
Res[Count_Z]
Res_Save[Count_Z]
Res_Save
[0]
for(Count_1
Count_1
N-Count;
Count_1++)
for(Count_2
Count_2
Count_1+1;
Count_2++)
if(Count_2
Res[Count_2]
Res_Save[Count_2];
14.
if((Count_2
(Count_1+1))&
(Count_1
!
0))
-Res_Save[Count_2
1];
16.
Res_Save[Count_2]
Res_Save[Count_2
17.
Count_Z<
{
Res[C