C++blackman窗函数低通滤波
时间: 2024-06-13 13:06:23 浏览: 107
```C++
#include <iostream>
#include <cmath>
using namespace std;
const int N = 100; // 信号长度
const double PI = acos(-1.0); // 圆周率
// blackman窗函数
void blackman(double w[], int n) {
for (int i = 0; i < n; i++) {
w[i] = 0.42 - 0.5 * cos(2 * PI * i / (n - 1)) + 0.08 * cos(4 * PI * i / (n - 1));
}
}
// 低通滤波器
void lowpass_filter(double x[], double y[], int n, double fc, double fs) {
double w[N], h[N];
blackman(w, n); // blackman窗函数
double wc = 2 * PI * fc / fs; // 截止频率
for (int i = 0; i < n; i++) {
if (i == n / 2) {
h[i] = wc / PI;
} else {
h[i] = sin(wc * (i - n / 2)) / (PI * (i - n / 2));
}
h[i] *= w[i]; // 加窗
}
// 卷积
for (int i = 0; i < n; i++) {
y[i] = 0;
for (int j = 0; j < n; j++) {
if (i - j >= 0) {
y[i] += x[j] * h[i - j];
}
}
}
}
int main() {
double x[N], y[N];
double fc = 10, fs = 100; // 截止频率和采样频率
for (int i = 0; i < N; i++) {
x[i] = sin(2 * PI * 5 * i / fs) + sin(2 * PI * 20 * i / fs); // 5Hz和20Hz的正弦信号叠加
}
lowpass_filter(x, y, N, fc, fs); // 低通滤波
for (int i = 0; i < N; i++) {
cout << y[i] << endl; // 输出滤波后的信号
}
return 0;
}
```
阅读全文