C++實作複數的濾波filter
- 導言
-
- 函數需求分析
- 源碼
- 注意
導言
最近在進行Qt開發,涉及大量的matlab轉C的工作,其中包括插值濾波等,這裡對matlab的filter函數進行了研究并用C++進行了重寫。
經對比,結果與matlab的filter()函數生成的濾波結果一緻。
函數需求分析
這裡我對工作中調用matlab的filter()函數的執行個體為例子進行講解:
- 原matlab程式 :
temp1_i=filter(lbf,1,real(x_d(1:lbn+LEN)));
temp1_q=filter(lbf,1,imag(x_d(1:lbn+LEN)));
- filter()生成的結果
- 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<濾波器階數)
*/
- 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;
}
注意
該文章僅個人學習使用,歡迎大家一起交流學習