你好!欢迎来到深圳市品慧电子有限公司!
全国统一服务电话:(+86)-755-2950 0800
品慧电子 > 与数字滤波器相关的内容
联系品慧电子
  • 电话:+86-0755-2950 0800
  • 传真:+86-0755-2973 8675
  • 微信:联系客服
  • QQ:800009589
bluewave滤波器|bluewave有源数字滤波器

blueWave滤波器简介

BLUEWAVE是一款由德国生产的有源滤波装置,是全新一代的全数字有源滤波器,与传统技术相比具有更快、更小、功能更强大等优势,这些优势使其能轻松解决电能质量问题。除可以动态分相补偿谐波和无功外,还可以解决三相不平衡、电压波动及闪变等电能质量问题。

它完全克服了无源滤波装置的所有弊端,独立于系统阻抗,没有过载和谐振的危险,滤波更灵活有效。单台补偿容量从30A至300A,电压等级从380至690V,适用于3线或4线的系统,可不等容并联。体积非常小巧,防护等级达到了IP54,能在恶劣环境下运行,且有250%的超强过载能力。

blueWave滤波器工作原理

主要由IGBT电力电子元件组成的设备,检测到负载谐波并产生对应的补偿电流,修补电源电流几乎为正弦波。其滤波方式为“谐波抵消”。

blueWave滤波器应用

该产品主要应用于产生谐波较大的场合,如港口码头、汽车制造、通信、轨道交通等领域。与无功补偿模块配合使用构成LSVG系统,能达到更好的滤除谐波效果。

iir滤波器|iir数字滤波器|iir滤波器原理

iir滤波器就是iir数字滤波器,相对于fir滤波器还是有区别的。

IIR滤波器的特点:

1.IIR数字滤波器的系统函数可以写成封闭函数的形式。

2.IIR数字滤波器采用递归型结构,即结构上带有反馈环路。IIR滤波器运算结构通常由延时、乘以系数和相加等基本运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。

3.IIR数字滤波器在设计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,其设计工作量比较小,对计算工具的要求不高。在设计一个IIR数字滤波器时,我们根据指标先写出模拟滤波器的公式,然后通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。

4.IIR数字滤波器的相位特性不好控制,对相位要求较高时,需加相位校准网络。 在MATLAB下设计IIR滤波器可使用Butterworth函数设计出巴特沃斯滤波器,使用Cheby1函数设计出契比雪夫I型滤波器,使用Cheby2设计出契比雪夫II型滤波器,使用ellipord函数设计出椭圆滤波器。下面主要介绍前两个函数的使用。

与FIR滤波器的设计不同,IIR滤波器设计时的阶数不是由设计者指定,而是根据设计者输入的各个滤波器参数(截止频率、通带滤纹、阻带衰减等),由软件设计出满足这些参数的最低滤波器阶数。在MATLAB下设计不同类型IIR滤波器均有与之对应的函数用于阶数的选择。 IIR单位响应为无限脉冲序列FIR单位响应为有限的,iir幅频特性精度很高,不是线性相位的,可以应用于对相位信息不敏感的音频信号上;

fir幅频特性精度较之于iir低,但是线性相位,就是不同频率分量的信号经过fir滤波器后他们的时间差不变。这是很好的性质。另外有限的单位响应也有利于对数字信号的处理,便于编程,用于计算的时延也小,这对实时的信号处理很重要。

数字滤波器原理是什么?

数字滤波器原理--什么是数字滤波器?

数字滤波器是对数字信号进行滤波处理以得到期望的响应特性的离散时间系统。数字滤波器工作在数字信号域,它处理的对象是经由采样器件将模拟信号转换而得到的数位信号。数字滤波器的工作方式与模拟滤波器也完全不同:后者完全依靠电阻器、电容器、晶体管等电子元件组成的物理网络实现滤波功能;而前者是通过数字运算器件对输入的数字信号进行运算和处理,从而实现设计要求的特性。

数字滤波器原理--分类

数字滤波器有低通、高通、带通、带阻和全通等类型,它可以是时不变的或时变的、因果的或非因果的、线性的或非线性的,同样数字滤波器也可以按所处理信号的维数分为一维、二维或多维数字滤波器。数字滤波器具有高精度、高可靠性、可程控改变特性或复用、便于集成等优点。数字滤波器在语言信号处理、图像信号处理、医学生物信号处理以及其他应用领域都得到了广泛应用。

数字滤波器原理

所谓数字滤波器,就是把输入序列通过一定的运算变换成输出序列。导入数字滤波器的信号处理过程如下图所示:

其中模拟信号必须利用采样定理进行采样。输入信号经过模拟低通滤波即抗折叠滤波器去掉输入信号中的高频分量。经过平滑化的模拟信号再用于采样。另外D-A转换后模拟信号要经过平滑滤波器进行平滑处理,该工作可用模拟低通滤波器来完成。

基于Matlab的FIR数字滤波器设计

提出FIR敷字滤波器的设计方案,并基于Matlab实现滤波仿真。通过使用Matlab信号处理工具箱提供的函数,选择适当的窗函数编写程序,其中窗函数按照实际信号的处理需求,参数折中选择。实验获得了比较理想的滤波器特性,可以实现较好的滤波作用。而且在实际应用中只需按需求修改滤波器参数,并结合程序的相应改动,即可实现不同功能的滤波器。另外,介绍了利用FDATool设计滤波器的方法,简单修改参数即可实现多种滤波器。

数字滤波器可以过滤时间离散信号,通过对抽样数据进行数字处理来达到频域滤波的目的,目前已经广泛应用在高保真的信号处理,如数字音频、图像处理、数据传输、生物医学等领域。由于计算机技术和大规模集成电路的发展,数字滤波器已可用计算机软件实现。借助Mathb强大的数据处理能力,灵活使用模块集和工具箱,可以按照需求编写程序来实现多种滤波器设计。伴随Matlab的不断发展以及工具箱的不断开发,工作平台的改善,使用Mathb的编程工作量会大大减少。Matlab提供了完整的联机查询、帮助系统,提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。而这也使得基于Matlab的设计变得方便易于使用。

1 数字滤波器及设计方案
应用数字滤波器处理模拟信号时,首先要对输入模拟信号进行限带、抽样和模/数转换,数字滤波器输入信号的抽样率应大于被处理信号带竟的两倍,其频率响应具有以抽样频率为间隔的周期重复特性,且以折叠频率即1/2抽样频率点呈镜像对称。滤波器的输出信号须经数/模转换、平滑处理。
FIR数字滤波器的输出值u(Kt)与输出的过去值u(Kt-kt)表达关系如下:


这是不断乘累加的过程,解决了滤波器的系数α问题,再加上乘法和加法计算即可实现滤波器设计。由于FIR滤波器的单位脉冲响应h(n)是有限长序列,因此滤波器没有不稳定的问题,FIR滤波器一般为非递归结构,因此在采用Matlab设计时采用有限精度的计算,以避免出现递归结构中极性震荡等不稳定现象。常见的两种FIR滤波器设计方法是窗函数法和频率采样法。虽然频率采样法可以精确控制采样点的频率响应,但是设计中必须插入过渡点来改善纹波,而且截止频率不易控制,过渡点也需要进一步的优化,对比来看窗函数法则是一种基本的设计理念,设计方法比较成熟。并且Matlab中提供的函数可以方便地实现加窗线性相位FIR滤波器设计,包括了比较常见的低通、带通、高通和带阻数字滤波器。本文采用的是窗函数结合编程的设计方法。
窗函数法的基本思想是先给定理想的滤波器频响为,


式中:ωc为截止频率;α为采样延迟。
而所要求设计的频响为,之后的工作便是使逼近。加窗w(n)对理想滤波器的单位抽样响应hd(n)(见式(3))截断,得到所要设计的h(n)。


对于FDATool设计法,本文通过选择适当参数,利用Matlab完成。

2 FIR数字滤波器设计
2.1 窗函数法设计FIR滤波器方案
在Matlab中可直接产生窗函数:矩形窗(Rectangle Window),三角窗(Triangular Window),汉宁窗(Hanging Window),凯塞窗(Kaiser Window)等,通过调用系统的函数即可实现窗的加载。具体调用方法如下:调用格式:w=函数名(n),根据长度n产生一个矩形窗w。一般正常的心电信号频率范围在0.05~100 Hz之内,这本身就是一种比较微弱的电信号,当受到身体其他器官的干扰信号后,心电信号将会严重失真。另外还要考虑到电子器件噪声和50 Hz的工频信号的存在。这就需要尽量消除噪声和干扰的影响。这里选取低通滤波器的设计指标为:通带截止频率ωp=0.2π,阻带截止频率ωs=0.3π,最小阻带衰减As≥50 dB。所以得出过渡带宽tr_width=ωs-ωp,列长N=10 π/tr_width。选择窗函数一般是选择主瓣较宽的,这样可以增加阻带的衰减,保证了通带的平稳,另外在保证阻带最小衰减指标的情况下,适当增加列长N值,窄化过渡带。根据窗函数最小阻带衰减的特性。只有海明窗和凯塞窗可提供大于50 dB的衰减。实际应用中选用窗函数大多是它们的折中,凯塞窗可以通过改变参数值来折中选择主瓣宽度和旁瓣衰减,基于此的滤波器适应能力强且比较灵活。本文即是采用的凯塞窗编程设计。窗函数设计法是用一定宽度窗函数截取无限脉冲响应序列获得有限长的脉冲响应序列,设计步骤为:
(1)通过傅里叶逆变换获得理想滤波器的单位脉冲响应hd(n)。


(2)由性能指标确定窗函数W(n)和窗口长度N。
(3)求得实际滤波器的单位脉冲响应h(n),h(n)即为所设计FIR滤波器系数向量a(n)。


(4)检验滤波器性能。
Matlab信号处理工具箱提供了各种窗函数、滤波器设计函数和滤波器实现函数。设计中利用Matlab提供的函数firl来实现,编程则是直接调用这些函数简单直观的完成设计。调用格式:firl(n,Wn,‘ftype’,Window),其中n为阶数、Wn为截止频率、ftype是滤波器的类型、Window是窗函数。应用凯塞窗的代码如下:

程序执行的结果如图1,图2所示。

 


从滤波效果图看,所设计的滤波器基本消除了噪声和干扰的影响,客观的得出真实信号。按照设计方案中滤波器的指标,执行函数操作可以得到:N=68,As=59。之后增加参数N值。在该设计中,利用凯塞窗函数,执行了多种N值的改变。伴随N值增大,过渡带变窄,但阻带的最小衰减没有改变。
 

 

2.2 FDATool设计方案
FDATool(Filter Design&Analysis Too1)是Matlab信号处理工具箱专用的滤波器设计分析工具,操作简单、灵活,可以采用多种方法设计FIR滤波器。这种方法设计的数字滤波器,可以随时调整滤波器滤披特性,而且滤波结果实时显示在图形区,减少了工作量,有利于滤波器设计的进一步优化。在Matlab命令窗口输入FDATool后回车会弹出FDATool界面,也可在Matlab主界面下方选择“start”→“toolbox”→“ filterdesign”。具体参数选择为:
(1)滤波器类型(filter type)为lowpass;
(2)设计方法(design method)为FIR,使用窗口Window;
(3)滤波器的阶数(fiter order)为15;
(4)窗口类型(Window)为Kaiser,beta为0.5;
(5)fs为48 000 Hz,fc为10 800 Hz。
点击“design filter”即可。值得注意的是,这里选择filter order为15阶,而不是所设计的16阶滤波器。因为常数系数项h(0)=0。通过菜单“analysis”选择“magnitude”和“phase response”即可得到图3,图4的特性显示。“analysis”选择“step response”和“im-pulse”可以得到图5,图6的响应显示。可以看出所设计FIR滤波器的阶跃响应和冲击响应比较接近理想状态。

 

 

 

3 结论
从图1~4的特性曲线中可以看出该滤波器的性能基本达到了妻求,滤波作用比较明显。曲线相对比较平稳,能够满足微弱信号滤波器的设计技术指标。特别是从方案二中的相频特性曲线来看,曲线通过原点且为一条平滑直线,说明具有良好的线性相位特性,而这也是在应用中选择FIR数字滤波器的重要原因,但是它的实际效果还要经过实践的检验。FIR幅频特性精度比IIR低,且滤波器所需阶次比较高,但是它拥有很好的线性相位,即不同频率分量的信号经过FIR滤波器后他们的时问差不变。另外,FIR还存在的缺点应加以改善,如信号的延迟偏大。这就考虑到用高性能的DSP器件,由于其处理速度快,此缺点在一点程度上是可以改善的。

4 结语
本文通过设计实例,介绍了利用Matlab实现数字信号处理中的数字滤波器设计,从结果可以看出它们均可以达到技术指标要求,而且方法简单、快捷,大大减轻了工作量。滤波器的设计工作完成后,可以借助Matlah的export操作导出所设计滤波器的系统函数H(x)。由于Matl-ah具有强大的接口功能,仿真后的结果可以很方便的移植到DSP,CPLD或FPGA等器件中。在实际应用中,只需按要求修改滤波器参数,并对程序作较少的改动,即可实现不同的滤波器,实用性较强。

什么是fir数字滤波器 什么叫FIR滤波器

什么是fir数字滤波器

Part 1: Basics
1.1 什么是FIR滤波器?
FIR 滤波器是在数字信号处理(DSP)中经常使用的两种基本的滤波器之一,另一个为IIR滤波器.

1.2 FIR代表什么?
FIR是有限冲激响应(Finite Impulse Response)的简称.

1.3 FIR(有限冲激响应)中的有限该如何理解?
冲激响应是有限的意味着在滤波器中没有发反馈.

1.4 FIR 怎么发音?
有些人直接读字母音 F-I-R; 也有人发做fir的音[:], fir是冷杉树.

1.5 FIR 滤波器外有什么其他选择?
DSP滤波器还有一类: IIR(无限冲激响应,Infinite Impulse Response). IIR滤波器使用反馈,因此当信号输入后,输出是根据算法循环的.

1.6 FIR滤波器与IIR滤波器比较?
 每一种都有优缺点.但总得来说, FIR滤波器的优点远大于缺点,因此在实际运用中,FIR滤波器比IIR滤波器使用的比较多.

1.6.1 相对于IIR滤波器, FIR滤波器有什么优点?
相较于IIR滤波器, FIR滤波器有以下的优点:
* 可以很容易地设计线性相位的滤波器. 线性相位滤波器延时输入信号,却并不扭曲其相位.
* 实现简单. 在大多数DSP处理器, 只需要对一个指令积习循环就可以完成FIR计算.
* 适合于多采样率转换,它包括抽取(降低采样率), 插值(增加采样率)操作. 无论是抽取或者插值, 运用FIR滤波器可以省去一些计算, 提高计算效率. 相反,如果使用IIR滤波器,每个输出都要逐一计算,不能省略,即使输出要丢弃.
* 具有理想的数字特性. 在实际中,所有的DSP滤波器必须用有限精度(有限bit数目)实现,而在IIR滤波器中使用有限精度会产生很大的问题,由于采用的是反馈电路,因此IIR通常用非常少的bit实现,设计者就能解决更少的与非理想算术有关的问题。
* 可以用小数实现. 不像IIR滤波器,FIR滤波器通常可能用小于1的系数来实现。(如果需要,FIR滤波器的总的增益可以在输出调整)。当使用定点DSP的时候,这也是一个考虑因素,它能使得实现更加地简单。

1.6.2 相较于IIR滤波器, FIR滤波器的缺点是什么?
相比较于IIR滤波器, 有时FIR滤波器为了得到一个给定的滤波响应特性,需要花费更多的存储器或者计算. 当然,用FIR滤波器去实现某些响应也是不实际的.

1.7 在描述FIR滤波器的时候,都要提到什么术语?
* 冲激响应 - FIR滤波器的冲激响应实际上是FIR的系数.
* 抽头(Tap) - FIR的抽头是系数或者延时对. FIR抽头的个数(通常用N来表示)意味着:1)实现滤波器所需要的存储空间, 2) 需要计算的数目, 3) 滤波器能滤掉的数量, 实际上,越多的抽头意味着有更多的阻带衰减, 更少的波纹,更窄的滤波等等.
* 乘累加 (MAC) - 在FIR方面考虑,MAC是指把延时的数据采样与相应的系数相乘,然后累加结果。通常,FIR每一个抽头都需要一个MAC。大多数DSP微处理器实现MAC操作都是单指令周期。
* 跃迁带(Transition Band) -在通带和阻带边沿之间的频带。跃迁带越窄,需要更多的抽头去实现滤波器。也有说,小的跃迁带就是一个sharp滤波器。
* 延时线- 一组存储器单元,实现在FIR计算中的Z^-1延时。
* 环形缓存 - 一个特殊的缓存,是首尾相连的。通常由DSP微处理器实现。

Part 2: Properties
2.1 线性相位

2.1.1 FIR滤波器和线性相位之间有什么关系?
大多数的FIR滤波器是线性相位滤波器. 当需要设计线性相位滤波器时, 通常使用FIR滤波器.

2.1.2 什么是线性相位滤波器?
线性相位是指滤波器的相位响应是频率的线性函数(在+/-180度)。因此滤波器的延时后,所有的频率相位相同。因而滤波器不会产生相位和延迟扭曲。在某些领域,比如数字解调器,没有相位或者延迟扭曲是FIR滤波器相对于其他IIR和模拟滤波器的一个关键优点

2.1.3 线性滤波器的条件是什么?
FIR滤波器经常被设计成为线性相位的,当然不是必须要这么做。如果滤波器的系数是关于中心系数对称的,也就是说第一个系数和最后一个系数相同,第二个系数和倒数第二个相同,那么FIR滤波器就是线性的。有奇数个系数的FIR滤波器,中心单独的系数没有对应的。

2.1.4 什么是线性相位FIR滤波器的延时?
非常简单的公式: 给定FIR滤波器有N个抽头,那么延时是(N - 1) / (2 * Fs), 这里Fs是采样频率. 比如, 21抽头的线性相位滤波器运行在1kHz, 那么延时就是(21 - 1) / (2 * 1 kHz)=10 微秒.

2.1.4 除了线性相位,还可以选择什么?
当然是非线性的了。实际上,最流行的选择是最小相位滤波器。最小相位滤波器,也叫最小延时滤波器,比线性相位滤波器具有更少的延时,当两者的幅度响应相同时以非线性相位特性。低通滤波器在它的冲击响应中心有最大的系数。而最小相位滤波器的最大系数在开始部分。

2.2 频率响应
2.2.1 什么是FIR滤波器的Z变换r?
对于N抽头的滤波器, 系数为h(k), 那么输出由:
         y(n)=h(0)x(n) + h(1)x(n-1) + h(2)x(n-2) + ... h(N-1)x(n-N-1),
滤波器的z变换就是:
        H(z)=h(0)z-0 + h(1)z-1 + h(2)z-2 + ... h(N-1)z-(N-1) , or
       

2.2.2 FIR滤波器的频率响应公式是什么?
H(z)中的变量z为连续的复数变量,可以描述为 z=r·ejw,这里r是幅度,w是z的角度。如果令r=1,H(z)就变成了滤波器频率响应H(jw)。这也就意味着替代z为ejw,得到了滤波器频率响应H(w)。
       H(jw)=h(0)e-j0w + h(1)e-j1w + h(2)e-j2w + ... h(N-1)e-j(N-1)w , or
使用欧拉公式, e-ja=cos(a) - jsin(a), 我们可以把H(jw)写成矩形表示:
       H(jw)=h(0)[cos(0w) - jsin(0w)] + h(1)[cos(1w) - jsin(1w)] + ... h(N-1)[cos((N-1)w) - jsin((N-1)w)] , or
     

2.2.3 能用离散傅立叶变换(DFT)来计算FIR的频率响应么?
可以。对于N抽头的FIR,可以得到N  evenly-spaced points of the frequency response by doing a DFT on the filter coefficients.但是,为了得到任意频率的频率响应,需要使用上边的公式。

2.2.4 FIR滤波器的DC增益指的是什么?
DC(0 Hz)输入信号包含每个采样都为1.0。通过延时线后,输出是所有系数的和。因而,在DC处滤波器的增益就是所有系数之和。
可以通过上边的公式进行验证。问我们设w为0, cos项就一直为1,而sin项则一直为0。因此频率响应就变成了:
     

2.2.5 如何调整FIR滤波器的增益?
简单地在系数上乘上因子.

2.3 数字性质
2.3.1 FIR滤波器是固有稳定的?
是的,因为没有反馈,任何有限的输入产生有限的输出。

2.3.2 什么使FIR滤波器的数字性质变好?
缺少反馈是关键。在计算机中实现FIR滤波器时,每个计算都产生数字错误。由于FIR滤波器没有反馈,因此不能够记住以前的错误。相反,IIR滤波器的反馈可能导致错误的积累。这个实际的影响就是,可以用更少的bit去实现与IIR滤波器相同精度的滤波器。比如,FIR滤波器通常用16位来实现的话,IIR滤波器就通常需要32位,或者更多。

2.4 为什么通常在多采样率系统中采用FIR滤波器而不采用IIR滤波器?
因为只有一小部分的计算需要用减采样或者插值滤波器来实现。
由于FIR滤波器不使用反馈,因而只有那些实际需要使用的输出才需要计算。比如,在减采样的时候(N个输出中只有一个有效),那么其他的N-1输出就不会进行计算。类似的,对于插值滤波器(在采样点中插入0来提高采样率),你不必实际地用FIR滤波器乘以系数,求和得到,你只需要忽略和这些值有关的乘加(因为它们不会改变结果)。
相反,因为IIR滤波器使用反馈,每个输入都必须使用,每个输入必须计算,因为所有的输入和输出对滤波器的反馈都有影响。

2.5 有哪些特殊的FIR滤波器?
Aside from "regular" and "extra crispy" there are:

  •  矩形 -矩形 FIR 滤波器是每个系数都是1.0的简单的滤波器。因而对于N个抽头的矩形滤波器,它的输出仅仅是过去N个采样之和。由于矩形FIR只能实现加法,因此当乘法器实现比较昂贵时,在硬件实现中会考虑。       
  •  希尔伯特变换(Hilbert Transformer) - 希尔伯特变换是把信号相移90度。它们经常被用在给定实数部分,产生虚数部分。
  •  差分(Differentiator) -差分器的幅度响应是频率的线性函数。现在已经不流行了,但是以前曾经在FM解调器上使用过。
  •  Lth-Band - 也叫做“Nyquist"滤波器,这些滤波器是在多速率应用中特殊的一类滤波器。主要的卖点是,每L个系数有一个为0,那么就将减少乘累加操作的实现(著名的半带滤波器就是这一种)。
  •  Raised-Cosine - 这是一种特殊类型的滤波器,有时会用在数字数据应用方面。(通带上的频率响应是被上移一个常数的cos形状)。

Part 3: Design
3.1 有哪些设计FIR滤波器的方法?
三种最流行的设计方法:

  • Parks-McClellan: Parks-McClellan 方法( MATLAB里用Remez)是设计FIR滤波器中可能是使用最光的.method (inaccurately called "Remez" by Matlab) is probably the most widely used FIR filter design method. It is an iteration algorithm that accepts filter specifications in terms of passband and stopband frequencies, passband ripple, and stopband attenuation. The fact that you can directly specify all the important filter parameters is what makes this method so popular. The PM method can design not only FIR  "filters" but also FIR "differentiators" and FIR "Hilbert transformers".
  •  Windowing:. In the windowing method, an initial impulse response is derived by taking the Inverse Discrete Fourier Transform (IDFT) of the desired frequency response. Then, the impulse response is refined by applying a data window to it.
  •  Direct Calculation: The impulse responses of certain types of FIR filters (e.g. Raised Cosine and Windowed Sinc) can be calculated directly from formulas.

3.2 如何实际地设计FIR滤波器?
当然是用FIR设计程序呀. 虽然可以使用手工亲自的方法进行设计滤波器,但是使用FIR滤波器程序比较简单.

Part 4: Implementation
4.1 实现FIR滤波器基本的方法是什么?
FIR滤波器的结构上包含两个东西:一个是采样点延迟线,一个是系数. 可以由以下方法实现FIR滤波器:
1. 把输入的采样点放入到延迟线中.
2. 把延迟线中的数与相应的系数相乘并累加.
3. 移位, 使下一个输入采样能进入延迟线.

4.2 用C语言如何实现FIR滤波器?
为了展示众多的方法和技巧,这里提供用C语言实现的FIR滤波器算法。

fir_algs_1-0.c C 源码
fir_algs_1-0.zip C 源码( MS Visual C++ 6.0 工程文件)

包括以下功能模块:
1. fir_basic: 实现基本的FIR滤波器
2. fir_circular: 说明环行buffer是如何实现FIR的。
3. fir_shuffle: 一些TI的处理器上使用的shuffle down技巧
4. fir_split: 把FIR滤波器展开为两块,避免使用环行缓存。
5. fir_double_z: 使用双精度的延迟线,使可以使用一个flat buffer。
6. fir_double_h: 使用双精度的系数,使可以使用一个flat buffer。

4.3 用汇编如何实现FIR滤波器?
FIR滤波器的汇编算法是跟处理器对应的,但是大多数普通的系统会使用一个DSP处理器提供的环行缓存。
1. 配置环行缓存。加载系数和延迟线指针。然后对每个采样点执行以下操作:
2. Store the incoming data in the delay line; increment the delay-line pointer.Digital
3. Clear the multiplier-accumulator.
4. Loop over all coefficients/delays; accumulate the values obtained by multiplying the coefficients by the delayed samples.
5. Round or truncate the result as the FIR output.

     Alternatively, a "shuffle down" method is used in Texas Instruments' older fixed-point processors to implement circular buffers. The processor literally moves each sample delay values by one slot during each multiply-accumulate (via the "MACD" instruction).
     Each DSP microprocessor manufacturer provides example FIR assembly code in its data books or its application handbooks, so be sure to look at those before you "reinvent the circular buffer".

4.4 如何测试以及实现的FIR滤波器?
 Here are a few methods:

  •  Impulse Test: A very simple and effective test is to put an impulse into it (which is just a "1" sample followed by at lest N - 1 zeroes.) You can also put in an "impulse train", with the "1" samples spaced at least N samples apart. If all the coefficients of the filter come out in the proper order, there is a good chance your filter is working correctly. (You might want to test with non-linear phase coefficients so you can see the order they come out.) We recommend you do this test whenever you write a new FIR filter routine.
  •  Step Test: Input N or more "1" samples. The output after N samples, should be the sum (DC gain) of the FIR filter.
  •  Sine Test: Input a sine wave at one or more frequencies and see if the output sine has the expected amplitude.
  •  Swept FM Test: From Eric Jacobsen: "My favorite test after an impulse train is to take two identical instances of the filter under test, use them as I and Q filters and put a complex FM linear sweep through them from DC to Fs/2. You can do an FFT on the result and see the complete frequency response of the filter, make sure the phase is nice and continuous everywhere, and match the response to what you'd expect from the coefficient set, the precision, etc."

4.5 在实现FIR滤波器的过程中有什么有用的技巧?
    FIR tricks center on two things 1) not calculating things that don't need to be calculated, and 2) "faking" circular buffers in software.

4.5.1 如何跳过不必要的计算?
    First, if your filter has zero-valued coefficients, you don't actually have to calculate those taps; you can leave them out. A common case of this is "half-band" filter, which have the property that every-other coefficient is zero.
    Second, if your filter is "symmetric" (linear phase), you can "pre-add" the samples which will be multiplied by the same coefficient value, prior to doing the multiply. Since this technique essentially trades an add for a multiply, it isn't really useful in DSP microprocessors which can do a multiply in a single instruction cycle. However, it is useful in ASIC implementations (in which addition is usually much less expensive than multiplication); also, some newer DSP processors now offer special hardware and instructions to make use of this trick.

4.5.2 How do I fake circular buffers in software?
    When hardware support for circular buffers isn't available, you have to "fake" them. Also, since ANSI C has no construct to describe circular buffers, most C compilers can't generate code to use them, even if the target processor has them.

    You can always implement a circular buffer by duplicating the logic of a circular buffer in software (and many have), but the overhead can be prohibitive; the circular-fake might take several instructions to implement, compared to just a single instruction to do the multiply-accumulate operation. Therefore you need to fake it.

    Here are several basic techniques to fake circular buffers:

       1. Split the calculation: You can split any FIR calculation into its "pre-wrap" and "post-wrap" parts. By splitting the calculation into these two parts, you essentially can do the circular logic only once, rather than once per tap. (See fir_double_z in FirAlgs.c above.)
       2. Duplicate the delay line: For a FIR with N taps, use a delay line of size 2N. Copy each sample to its proper location, as well as at location-plus-N. Therefore, the FIR calculation's MAC loop can be done on a flat buffer of N points, starting anywhere within the first set of N points. The second set of N delayed samples provides the "wrap around" comparable to a true circular buffer. (See fir_double_z in FirAlgs.c above.)
     nbsp;  3. Duplicate the coefficients: This is similar to the above, except that the duplication occurs in terms of the coefficients, not the delay line. Compared to the previous method, this has a calculation advantage of not having to store each incoming sample twice, and it also has a memory advantage when the same coefficient set will be used on multiple delay lines. (See fir_double_h in FirAlgs.c above.)
       4. Use block processing: In block processing, you use a delay line which is a multiple of the number of taps. You therefore only have to move the data once per block to implement the delay-line mechanism. When the block size becomes "large", the overhead of a moving the delay line once per block becomes negligible.