用C++实现滤波器

使用C++来实现滤波器。首先设定计算单位冲激响应的点数,比如64,再创建一个单位冲激序列,只在n=0处为1,其余为0,然后传递函数的分子系数[0.008 -0.033 0.05 -0.033 0.008],最后传递函数的分母系数[1 2.37 2.7 1.6 0.41],用这些系统参数来计算单位冲激响应,使用类似以下MATLAB代码中的filter函数计算单位冲激响应。

设置系统参数

matlab 复制代码
N=64; % 设定计算单位冲激响应的点数
x=[1 zeros(1,N-1)]; % 创建一个单位冲激序列,只在n=0处为1,其余为0
num=[0.008 -0.033 0.05 -0.033 0.008]; % 传递函数的分子系数
den=[1 2.37 2.7 1.6 0.41]; % 传递函数的分母系数

计算单位冲激响应

matlab 复制代码
y=filter(num,den,x); % 使用MATLAB的filter函数计算单位冲激响应

C++使用给定的系统参数(分子系数和分母系数)来计算单位冲激响应,如下所示:

cpp 复制代码
#include <iostream>
#include <vector>

// 假设的filter函数,用于模拟MATLAB的filter函数
std::vector<double> filter(const std::vector<double>& b, const std::vector<double>& a, const std::vector<double>& x) {
    size_t N = x.size();
    size_t M = a.size() - 1; // 分子系数的长度(减1是因为分母系数a[0]总是1)
    size_t L = N + M - 1; // 输出序列的长度

    std::vector<double> y(L, 0.0); // 初始化输出序列

    for (size_t n = 0; n < N; ++n) {
        double sum = 0.0;
        for (size_t k = 0; k <= M; ++k) {
            if (n - k < 0) continue; // 如果x[n-k]不存在,则跳过
            sum += b[k] * x[n - k]; // 分子部分的卷积
        }

        for (size_t k = 1; k <= M; ++k) {
            if (n - k < 0) continue; // 如果y[n-k]不存在,则跳过
            sum -= a[k] * y[n - k]; // 分母部分的反馈
        }

        y[n] = sum; // 存储当前输出值
    }

    return y;
}

int main() {
    // 单位冲激序列,只在n=0处为1,其余为0
    std::vector<double> unit_impulse(64, 0.0);
    unit_impulse[0] = 1.0;

    // 传递函数的分子系数和分母系数
    std::vector<double> b = {0.008, -0.033, 0.05, -0.033, 0.008};
    std::vector<double> a = {1, 2.37, 2.7, 1.6, 0.41};

    // 计算单位冲激响应
    std::vector<double> impulse_response = filter(b, a, unit_impulse);

    // 打印结果(仅打印前几个值作为示例)
    for (size_t i = 0; i < 10 && i < impulse_response.size(); ++i) {
        std::cout << "y[" << i << "] = " << impulse_response[i] << std::endl;
    }

    return 0;
}
相关推荐
逆小舟14 小时前
【Linux】人事档案——用户及组管理
linux·c++
再见晴天*_*16 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun082717 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge19 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘19 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务20 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
混分巨兽龙某某20 小时前
基于Qt Creator的Serial Port串口调试助手项目(代码开源)
c++·qt creator·串口助手·serial port
西红柿维生素20 小时前
JVM相关总结
java·jvm·算法
小冯记录编程20 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio
1uther20 小时前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎