matlab filter 函数,C++ 实现matlab filter()函数
时间: 2023-08-14 20:07:18 浏览: 79
Matlab中的filter函数可以用于数字信号处理中的滤波操作,C++中可以使用IIR滤波器来实现类似的功能。
IIR滤波器的一般形式为:
$y(n) = b_0 x(n) + b_1 x(n-1) + ... + b_M x(n-M) - a_1 y(n-1) - ... - a_N y(n-N)$
其中,$x(n)$ 为输入信号,$y(n)$ 为输出信号,$b_i$ 和 $a_i$ 分别为前向系数和反向系数,$M$ 和 $N$ 分别为前向系数和反向系数的阶数。
在C++中,可以使用z-transform来将滤波器转换成差分方程的形式,然后利用递推公式来实现滤波器的计算。
下面是一个简单的使用IIR滤波器实现Matlab中filter函数的例子:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<double> filter(vector<double> x, vector<double> b, vector<double> a) {
int N = x.size();
int M = b.size() - 1;
int N2 = a.size() - 1;
vector<double> y(N);
vector<double> w(M+1);
vector<double> w2(N2+1);
for (int n = 0; n < N; n++) {
y[n] = b[0] * x[n] + w[0];
for (int i = 1; i <= M; i++) {
w[i-1] = b[i] * x[n] + w[i] - a[i] * y[n];
}
for (int i = 1; i <= N2; i++) {
w2[i-1] = y[n-i+1];
}
for (int i = 1; i <= N2; i++) {
y[n] -= a[i] * w2[i];
}
}
return y;
}
int main() {
vector<double> x = {1, 2, 3, 4, 5};
vector<double> b = {1, 2, 1};
vector<double> a = {1, -0.5};
vector<double> y = filter(x, b, a);
for (int i = 0; i < y.size(); i++) {
cout << y[i] << " ";
}
cout << endl;
return 0;
}
```
该程序中实现了一个二阶IIR滤波器,使用了一个长度为3的前向系数向量 $b$ 和一个长度为2的反向系数向量 $a$。程序中使用了三个向量 $x$、$y$ 和 $w$ 来分别存储输入信号、输出信号和状态变量,其中 $w$ 用于存储反向系数的状态变量,$w2$ 则用于存储输出信号的状态变量。程序中使用了三个for循环来实现滤波器的计算,分别对应于前向系数、反向系数和输出信号的计算。
阅读全文