FIR内插滤波器结构与代码实现

信号处理的应用中,有时需要将某个抽样信号变换成一个新的、具有不同抽样率的抽样信号,这就是多抽样速率信号处理。实现抽样率提高的过程被称为内插,实现抽样率降低的过程被称为抽取。由于抽取时内插的对偶系统,因此我们只要对内插滤波器的设计方法有了一定的了解就可以很快的得出抽取滤波器的设计方法。

在这里我们先对FIR内插滤波器的结构进行简单的分析,并对自己设计时采用的滤波器进行介绍。
一、直接结构
直接结构就是按照信号流程直接实现的结构,也是最简单的实现结构。
在这里插入图片描述
图中R为抽样率提高的倍数,被称为内插因子,即为补零的过程。在将数据进行内插处理后通过滤波器后便可以得到转换速率后的数据。
在这里插入图片描述
二、多项结构
当内插滤波器的长度较长的时候,我们可以通过把内插滤波器分解为多个不同的滤波器提高运算速率,这就是滤波器的多项结构。
对于R倍的插值滤波器,就存在有R个多项滤波器。
在这里插入图片描述
由于在设计中原型的内插滤波器长度通常都为R的倍数,所以可以确定为原长度N/R的FIR滤波器。但对于N不是R倍数的滤波器,为了保证多项滤波器的长度相同,可以现在原型内插滤波器系数后面补(N/R)R-N个零系数后进行多相分解,最终得到N/R长度的滤波器。
三、多级实现结构
当内插因子较大时,如果直接将转换工作一次性完成其计算效率反而不如通过多次转换。
在这里插入图片描述
从图中不难看出,F0为原始采样率,之后的各项F为内插后读的采样率,R为各级的内插因子,同时为了防止各级滤波器混叠,每一级低通滤波器的通带呵过渡带必须要满足以下要求:
在这里插入图片描述
其中FP与FS分别为单机实现内插滤波器的通带截至频率和阻带频率。
确定多级设计中各级滤波器的最优设计准则便是使滤波器设计时所需的乘法次数与存储量最小,具体的实现结构则要选择直接结构或者多项结构来实现。

在自己的项目设计采用的方法其实是对直接性结构的改进。FIR滤波器运行过程其实就是卷积的过程,对于插值中补零的数据可以忽略掉降低运算量,最终的运算量与多向结构相同。具体C语言实现代码如下,其中滤波器为256阶,进行16倍的倍增:

void inter_FIR(double *Input,double *Output,int number)
{
	const double Coeff[257] = {
  1.296151352968e-05,-6.635713039775e-06,-7.980506635582e-06,-1.061137430109e-05,
  -1.414931146114e-05,-1.827309935317e-05,-2.266404022378e-05,-2.697826143876e-05,
  -3.083545717102e-05,-3.382286170616e-05,-3.55054434457e-05,-3.544872065906e-05,
  -3.323981459214e-05,-2.852116296821e-05,-2.102014523686e-05,-1.058118432804e-05,
  2.801558287217e-06,1.895820245094e-05,3.752306278652e-05,5.792101795884e-05,
  7.936630609774e-05, 0.000100873471325,0.0001212813059382,0.0001392893088484,
  0.0001535100046395,0.0001625329061373,0.0001649974329498,0.0001596765039241,
  0.0001455635029706,0.0001219590764418,8.855232140523e-05,4.549559553228e-05,
  -6.537327658961e-06,-6.631591433422e-05,-0.0001320383045673,-0.0002013453765832,
  -0.000271373038676,-0.0003388244935077,-0.0004000869311534,-0.0004513685696688,
  -0.0004888679865433,-0.0005089609148112,-0.0005084042119201,-0.000484537998116,
  -0.0004355120123028,-0.0003603983323765,-0.0002595026382239,-0.0001342785391462,
  1.244748732052e-05,0.0001764943513875,0.0003523946263963,0.0005335042543557,
  0.0007121810435609,0.0008800377830906, 0.001028255920185, 0.001147954899867,
   0.001230596644079, 0.001268421441675, 0.001254885546269,  0.00118508807832,
   0.001056164763429,0.0008676230088776,0.0006216008143527,0.0003230306353781,
  -2.031097305041e-05,-0.0003978786970522,-0.0007965661968389,-0.001201048623263,
  -0.001594258617886,-0.001957982262238,-0.002273559473735,-0.002522670020123,
  -0.002688171052911,-0.002754956898795,-0.002710804094203,-0.002547166522622,
  -0.002259873882786, -0.00184969775804,-0.001322758373629,-0.0006907327798104,
  2.916719099835e-05,0.0008144352410821, 0.001637778270386, 0.002467849964206,
   0.003270225704502, 0.004008578651497, 0.004646032969713,  0.00514664304221,
   0.005476961461525, 0.005607603580462, 0.005514824161847, 0.005181904355502,
   0.004600463852874, 0.003771476652528, 0.002706012030015, 0.001425658116851,
  -3.743131713523e-05,-0.001640891035757,-0.003332898726193,-0.005053328877315,
  -0.006735281571982,-0.008306957213671, -0.00969381614427, -0.01082096493648,
   -0.01161569100389, -0.01201005753748, -0.01194347104165, -0.01136512690264,
    -0.0102362383233, -0.00853196156491,-0.006242938021113,-0.003376383407277,
  4.333200407353e-05, 0.003974646333037, 0.008359332966541,  0.01312359287234,
    0.01817968436771,  0.02342805608886,  0.02875991965396,  0.03406018672839,
    0.03921067143788,  0.04409346286467,  0.04859436369962,  0.05260626478611,
    0.05603233725554,  0.05878897802261,  0.06080833431957,  0.06204039512158,
    0.06245452156688,  0.06204039512158,  0.06080833431957,  0.05878897802261,
    0.05603233725554,  0.05260626478611,  0.04859436369962,  0.04409346286467,
    0.03921067143788,  0.03406018672839,  0.02875991965396,  0.02342805608886,
    0.01817968436771,  0.01312359287234, 0.008359332966541, 0.003974646333037,
  4.333200407353e-05,-0.003376383407277,-0.006242938021113, -0.00853196156491,
    -0.0102362383233, -0.01136512690264, -0.01194347104165, -0.01201005753748,
   -0.01161569100389, -0.01082096493648, -0.00969381614427,-0.008306957213671,
  -0.006735281571982,-0.005053328877315,-0.003332898726193,-0.001640891035757,
  -3.743131713523e-05, 0.001425658116851, 0.002706012030015, 0.003771476652528,
   0.004600463852874, 0.005181904355502, 0.005514824161847, 0.005607603580462,
   0.005476961461525,  0.00514664304221, 0.004646032969713, 0.004008578651497,
   0.003270225704502, 0.002467849964206, 0.001637778270386,0.0008144352410821,
  2.916719099835e-05,-0.0006907327798104,-0.001322758373629, -0.00184969775804,
  -0.002259873882786,-0.002547166522622,-0.002710804094203,-0.002754956898795,
  -0.002688171052911,-0.002522670020123,-0.002273559473735,-0.001957982262238,
  -0.001594258617886,-0.001201048623263,-0.0007965661968389,-0.0003978786970522,
  -2.031097305041e-05,0.0003230306353781,0.0006216008143527,0.0008676230088776,
   0.001056164763429,  0.00118508807832, 0.001254885546269, 0.001268421441675,
   0.001230596644079, 0.001147954899867, 0.001028255920185,0.0008800377830906,
  0.0007121810435609,0.0005335042543557,0.0003523946263963,0.0001764943513875,
  1.244748732052e-05,-0.0001342785391462,-0.0002595026382239,-0.0003603983323765,
  -0.0004355120123028,-0.000484537998116,-0.0005084042119201,-0.0005089609148112,
  -0.0004888679865433,-0.0004513685696688,-0.0004000869311534,-0.0003388244935077,
  -0.000271373038676,-0.0002013453765832,-0.0001320383045673,-6.631591433422e-05,
  -6.537327658961e-06,4.549559553228e-05,8.855232140523e-05,0.0001219590764418,
  0.0001455635029706,0.0001596765039241,0.0001649974329498,0.0001625329061373,
  0.0001535100046395,0.0001392893088484,0.0001212813059382, 0.000100873471325,
  7.936630609774e-05,5.792101795884e-05,3.752306278652e-05,1.895820245094e-05,
  2.801558287217e-06,-1.058118432804e-05,-2.102014523686e-05,-2.852116296821e-05,
  -3.323981459214e-05,-3.544872065906e-05,-3.55054434457e-05,-3.382286170616e-05,
  -3.083545717102e-05,-2.697826143876e-05,-2.266404022378e-05,-1.827309935317e-05,
  -1.414931146114e-05,-1.061137430109e-05,-7.980506635582e-06,-6.635713039775e-06,
  1.296151352968e-05
};
	int i=0,j=0,k=0,h=0;
	double Siganl_temp[16]={0};
	//进行FIR滤波部分
	for(i=0;i<=number-1;i++)
	{
		for (j=15;j>0;j--)
		{
			Siganl_temp[j]=Siganl_temp[j-1];
		}
		Siganl_temp[0]=Input[i];


		for ( k=0;k<16;k++ )
		{
			for( h=0;h<16;h++)
			{
				Output[i*16+k]=Output[i*16+k]+Siganl_temp[h]*Coeff[k+16*h];
			}
			Output[i*16+k]=Output[i*16+k]*16;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章