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;
		}
	}
}

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