使用C++设计滤波器(低通滤波器,高通滤波器,带通滤波器)

这篇博客详细介绍了如何使用C++设计各种滤波器,包括简单低通滤波器、FIR低通滤波器、IIR低通滤波器、简单带通滤波器、FIR带通滤波器和IIR带通滤波器。每个滤波器都有其特定的实现方法和应用场景,如FIR滤波器通过选择带通区域的系数实现,而IIR滤波器利用递归和非递归系数实现递归过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单低通滤波器

以下是一个使用C++语言编写的基本低通滤波器的示例代码,它可以对输入信号进行滤波以降低高频成分:

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 低通滤波器类
class LowPassFilter {
public:
    LowPassFilter(double sample_rate, double cutoff_frequency) {
        double dt = 1.0 / sample_rate;
        double RC = 1.0 / (cutoff_frequency * 2.0 * M_PI);
        alpha_ = dt / (dt + RC);
        prev_output_ = 0.0;
    }

    // 更新滤波器输出
    double update(double input) {
        double output = alpha_ * input + (1.0 - alpha_) * prev_output_;
        prev_output_ = output;
        return output;
    }

private:
    double alpha_;
    double prev_output_;
};

int main() {
    // 输入信号
    vector<double> input_signal = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};

    // 采样率和截止频率
    double sample_rate = 100.0;
    double cutoff_frequency = 10.0;

    // 创建低通滤波器
    LowPassFilter filter(sample_rate, cutoff_frequency);

    // 对输入信号进行滤波
    vector<double> output_signal;
    for (double input : input_signal) {
        double output = filter.update(input);
        output_signal.push_back(output);
    }

    // 输出滤波结果
    for (double output : output_signal) {
        cout << output << " ";
    }
    cout << endl;

    return 0;
}

在这个示例中,我们使用一个一阶滤波器来实现低通滤波器。该滤波器具有一个截止频率,所有高于该频率的信号成分都会被过滤掉。在构造函数中,我们根据采样率和截止频率计算出滤波器的alpha系数,这个系数用于控制信号在输入和输出之间的平衡。然后,我们在update函数中使用输入信号和alpha系数来计算滤波器的输出,并且将输出保存在prev_output_中,以便在下一次更新时使用。

在主函数中,我们创建了一个输入信号向量,并且创建了一个低通滤波器对象。然后,我们使用for循环将输入信号中的每个元素传递给滤波器进行处理,并且将输出保存在一个新的向量中。最后,我们将滤波后的输出向量输出到控制台。

FIR低通滤波器

以下是一个使用C++语言编写的基本FIR滤波器的示例代码,它可以对输入信号进行滤波以实现频率选择性:

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 创建一个函数,用于生成低通滤波器的系数
vector<double> createLowpassFilter(int M, double fc, double fs) {
    vector<double> h(M + 1);
    for (int n = 0; n <= M; ++n) {
        if (n == M / 2) {
            h[n] = 2.0 * fc / fs;
        } else {
            h[n] = sin(2.0 * M_PI * fc * (n - M / 2.0) / fs) / (M_PI * (n - M / 2.0));
        }
        h[n] *= 0.54 - 0.46 * cos(2.0 * M_PI * n / M);
    }
    return h;
}

// FIR滤波器类
class FirFilter {
public:
    FirFilter(const vector<double>& taps) : taps_(taps), buffer_(taps.size(), 0.0) {}

    // 更新滤波器输出
    double update(double input) {
        // 将新的输入添
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值