低通滤波c++怎么写
时间: 2024-11-28 16:28:06 浏览: 4
在C++中,实现低通滤波通常涉及到数字信号处理,特别是使用离散傅立叶变换(DFT)或者窗口函数设计IIR(无限 impulse response)或 FIR (finite impulse response)滤波器。这里我们以FIR滤波为例,它比较简单直观。
以下是一个基本的FIR低通滤波器的C++示例,使用了滑动窗口的概念:
```cpp
#include <vector>
#include <cmath>
// 设计一个线性相位FIR滤波器
std::vector<float> design_low_pass_filter(int taps, float cutoff_freq, int sample_rate) {
// 频率到指数映射(对于简单的一阶滤波)
double alpha = std::tan(cutoff_freq * M_PI / (sample_rate / 2));
std::vector<float> coefficients;
for (int i = 0; i < taps; ++i) {
coefficients.push_back(std::cos(i * 2 * M_PI * cutoff_freq / sample_rate - std::atan(alpha)));
}
return coefficients;
}
// 滤波器应用
void apply_low_pass_filter(const std::vector<float>& input_data, const std::vector<float>& filter_coeffs, std::vector<float>& output_data) {
int n_samples = input_data.size();
for (int i = 0; i < n_samples; ++i) {
float sum = 0;
for (int j = 0; j < filter_coeffs.size(); ++j) {
sum += input_data[(i + j) % n_samples] * filter_coeffs[j]; // 滑动窗口
}
output_data[i] = sum;
}
}
// 使用示例
int main() {
int taps = 10; // 滤波器长度
float cutoff_freq = 0.5; // 期望截止频率
int sample_rate = 44100; // 采样率
std::vector<float> filter_coeffs = design_low_pass_filter(taps, cutoff_freq, sample_rate);
std::vector<float> input_data = {/* your input data */};
std::vector<float> output_data(input_data.size());
apply_low_pass_filter(input_data, filter_coeffs, output_data);
// 输出结果...
}
```
注意这只是一个简化的例子,实际应用中可能需要调整参数、优化性能或使用更复杂的滤波算法。此外,`design_low_pass_filter`函数中的计算可能会根据具体的滤波器类型(如巴特沃斯、切比雪夫等)有所不同。
阅读全文