天天看點

C++實作複數的濾波filter導言

C++實作複數的濾波filter

  • 導言
    • 函數需求分析
    • 源碼
    • 注意

導言

最近在進行Qt開發,涉及大量的matlab轉C的工作,其中包括插值濾波等,這裡對matlab的filter函數進行了研究并用C++進行了重寫。

經對比,結果與matlab的filter()函數生成的濾波結果一緻。

函數需求分析

這裡我對工作中調用matlab的filter()函數的執行個體為例子進行講解:

  1. 原matlab程式 :
temp1_i=filter(lbf,1,real(x_d(1:lbn+LEN)));
   temp1_q=filter(lbf,1,imag(x_d(1:lbn+LEN)));
           
  1. filter()生成的結果
    C++實作複數的濾波filter導言
    C++實作複數的濾波filter導言
  2. C++版filter()輸入輸出參數詳情:
參數名 介紹
Ti 已有的點的x坐标的值
To 插入的點的X坐标的值
I_Id 已有的點實部的y坐标的值
Q_Id 已有的點虛部的y坐标的值
Y 插入的點的實部和虛部的Y坐标的值以複數的形式傳回
comDouble filter(vector<double> b, double a, comDouble x)
  /*
  	注意:該函數僅實作了a為标量且為1時的函數濾波!!!
  	參數介紹:
  	b:		濾波器系數
  	a:		分母系數
  	x:		複數
  	x.real: 複數實部
  	x.imag: 複數虛部

  	Y:		複數濾波結果
  	Y.real:複數實部濾波結果
  	Y.imag:複數虛部濾波結果

  	公式:(a = 1時)
  	當 i < 濾波器階數 時有:
  		Y[i] = ∑b[j]*x[i-j] (下限j=0, 上限j<i) 
  	當 i > 濾波器階數 時有:
  		Y[i] = ∑b[j]*x[i-j] (下限j=0, 上限j<濾波器階數)
  */
           
  1. C++版interp函數生成結果 :結果表明,生成結果與matlab生成結果一緻。

源碼

那麼廢話不多說,直接上代碼

#include <vector>
#include <iostream>
using namespace std;
const struct comDouble
{
   vector<double> real;
   vector<double> imag;

   double time;
};
comDouble filter(vector<double> b, double a, comDouble x)
{
   /*
   	注意:該函數僅實作了a為标量且為1時的函數濾波!!!
   	參數介紹:
   	b:		濾波器系數
   	a:		分母系數
   	x:		複數
   	x.real: 複數實部
   	x.imag: 複數虛部

   	Y:		複數濾波結果
   	Y.real:複數實部濾波結果
   	Y.imag:複數虛部濾波結果

   	公式:(a = 1時)
   	當 i < 濾波器階數 時有:
   		Y[i] = ∑b[j]*x[i-j] (下限j=0, 上限j<i) 
   	當 i > 濾波器階數 時有:
   		Y[i] = ∑b[j]*x[i-j] (下限j=0, 上限j<濾波器階數)
   */
   comDouble Y;
   for (int i = 0; i < b.size(); i++)
   {
   		double real = 0.0;
   		double imag = 0.0;
   
   		for (int j = 0; j <= i; j++) {
   			real += b[j] * x.real[i - j];
   			imag += b[j] * x.imag[i - j];
   		}
   		Y.real.push_back(real);
   		Y.imag.push_back(imag);
   }
   for (int i = b.size(); i < x.real.size(); i++) {
   		double real = 0.0;
   		double imag = 0.0;
   		
   		for (int j = 0; j < b.size(); j++) {
   			real += b[j] * x.real[i - j];
   			imag += b[j] * x.imag[i - j];
   		}
   		
   		Y.real.push_back(real);
   		Y.imag.push_back(imag);
   }
   return Y;
}
           

注意

該文章僅個人學習使用,歡迎大家一起交流學習

繼續閱讀