当前位置:   article > 正文

数字滤波器_数字滤波器的实现

数字滤波器的实现


前言

本文主要介绍了利用filter solutions 软件设计我们所需的数字滤波器


一、带通滤波实例

1.理论设计

结合我之前发过的一篇文章链接: link,里面提到了我有一个期望采得的声音信号是1kHz的,但是我用adc采样的时候可能会采到各种频率的信号,包括外部的白噪声,人声……等等。那我们想要采到一个干净的1kHz信号的话就需要对采得的数据进行滤波。
在此我们选择的是带通滤波,中心频率为1kHz,下转折频率为800Hz,上转折频率为1200Hz。采样频率10kHZ,有了这些基础的参数,我们就可以利用filter solutions进行设计。如下图所示:
在这里插入图片描述
设置完我们所需的参数后,点击右侧的synthesize filter即可生成滤波器的传递函数:
在这里插入图片描述
下面进行公式的推导:
在这里插入图片描述
在这里插入图片描述

2.代码实现

下面所附为我本人写的代码,对照上述推出的结论,更好理解一些。

// An highlighted block
/*三阶巴特沃兹带通滤波器*/
void BTWZ_Filter(float *new_data)
{
	static double input_k; 			// k 次的数据
	static double input_k_1; 		//k-1次的数据
	static double input_k_2; 		//k-2次的数据
	static double input_k_3; 		//k-3次的数据
	static double input_k_4; 		//k-4次的数据
	static double input_k_5; 		//k-5次的数据
	static double input_k_6; 		//k-6次的数据
	
	static double output_k; 		// k 次的数据
	static double output_k_1; 		//k-1次的数据
	static double output_k_2; 		//k-2次的数据
	static double output_k_3; 		//k-3次的数据
	static double output_k_4; 		//k-4次的数据
	static double output_k_5; 		//k-5次的数据
	static double output_k_6; 		//k-6次的数据
	
	input_k = *new_data;
	output_k = 4.4838239*output_k_1 - 9.222935*output_k_2 + 10.896321*output_k_3 - 7.7949215*output_k_4 
							+ 3.2027361*output_k_5 - 0.6041097*output_k_6 + 1.5670104e-3*input_k - 4.7010311e-3*input_k_2 
							+ 4.7010311e-3*input_k_4 - 1.5670104e-3*input_k_6;
	*new_data = output_k;
	
	//迭代
	input_k_6 = input_k_5;
	input_k_5 = input_k_4;
	input_k_4 = input_k_3;
	input_k_3 = input_k_2;
	input_k_2 = input_k_1;
	input_k_1 = input_k;
	
	output_k_6 = output_k_5;
	output_k_5 = output_k_4;
	output_k_4 = output_k_3;
	output_k_3 = output_k_2;
	output_k_2 = output_k_1;
	output_k_1 = output_k;	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

filter solutions也提供的官方的代码,在上述传递函数的界面中,左上角有一个code按键,点击即可生成标准c代码。
经我的测试,该传递函数生成的滤波器还是非常理想的,基本上在带通频率外的数据会很快的衰减到0,而带通频率内的数据在70次迭代后就会趋于稳定。

二、不同滤波器的特点

以下均收集于网络资料。

1.Gaussian

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

2.Bessel

贝赛尔滤波器是具有最大平坦的群延迟(线性相位响应)的线性过滤器。带通(通常为用户关注区域)的相位响应近乎呈线性。 Bessel滤波器可用于减少所有IIR滤波器固有的非线性相位失真。但它的选择性比同阶(或极数)的巴特沃斯(Butterworth)滤波器或切比雪夫(Chebyshev)滤波器要差。

3.Butterwroth

巴特沃斯滤波器也被称作最大平坦滤波器。巴特沃斯滤波器的特点是通频带内的频率响应曲线最大限度平坦,没有纹波,而在阻频带则逐渐下降为零。

4.Chebyshev

切比雪夫滤波器是在通带或阻带上频率响应幅度等波纹波动的滤波器。切比雪夫滤波器在过渡带比巴特沃斯滤波器的衰减快,但频率响应的幅频特性不如后者平坦。切比雪夫滤波器和理想滤波器的频率响应曲线之间的误差最小,但是在通频带内存在幅度波动。
在这里插入图片描述
在这里插入图片描述
一型切比雪夫滤波器:
在通带(或称“通频带”)上频率响应幅度等波纹波动的滤波器称为“I型切比雪夫滤波器”。
在这里插入图片描述
二型切比雪夫滤波器:
在阻带(或称“阻频带”)上频率响应幅度等波纹波动的滤波器称为“II型切比雪夫滤波器”。
在这里插入图片描述

5.Legendre

勒让德滤波器在通带内的波动优于切比雪夫I型滤波器。

6.Elliptic

椭圆滤波器是在通带和阻带等波纹的一种滤波器。椭圆滤波器相比其他类型的滤波器,在阶数相同的条件下有着最小的通带和阻带波动。它在通带和阻带的波动相同,这一点区别于在通带和阻带都平坦的巴特沃斯滤波器,以及通带平坦、阻带等波纹或是阻带平坦、通带等波纹的切比雪夫滤波器。从传递函数来看,巴特沃斯和切比雪夫滤波器的传递函数都是一个常数除以一个多项式, 为全极点网络, 仅在无限大阻带处衰减为无限大. 而椭圆函数滤波器在有限频率上既有零点又有极点。极零点在通带内产生等波纹, 阻带内的有限传输零点减少了过渡区, 可获得极为陡峭的衰减曲线。也就是说在阶数相同的条件下,椭圆滤波器相比于其他类型的滤波器,能获得更窄的过渡带宽和较小的阻带波动, 就这点而言, 椭圆滤波器是最优的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/401431
推荐阅读
相关标签
  

闽ICP备14008679号