FIR数字滤波器设计与实现

低通滤波器的设计与实现

打开Matlab ,运行命令filterDesigner,选择FIR 最小二乘或者其它,设置采样频率,和低通滤波器截止频率。点击设计滤波器,如图1:

点击目标生成.C头文件,滤波器系数如下:

复制代码
const int BL = 41;
double BBB[41] = {
   -0.00209557154698,-0.001476623089881,-0.0007749172356411, 0.001078324976728,
   0.003836735408429, 0.006655352519891, 0.008206881969049, 0.007078038071226,
   0.002355979867595,-0.005762925264306, -0.01559789169637, -0.02403993585321,
   -0.02714550652792, -0.02117231404326,-0.003786352520018,  0.02491382612837,
    0.06195502635744,   0.1018081070428,     0.13750215203,   0.1622394922755,
     0.1710869277889,   0.1622394922755,     0.13750215203,   0.1018081070428,
    0.06195502635744,  0.02491382612837,-0.003786352520018, -0.02117231404326,
   -0.02714550652792, -0.02403993585321, -0.01559789169637,-0.005762925264306,
   0.002355979867595, 0.007078038071226, 0.008206881969049, 0.006655352519891,
   0.003836735408429, 0.001078324976728,-0.0007749172356411,-0.001476623089881,
   -0.00209557154698
};

FIR滤波器实例代码如下:

复制代码
const int BL = 41;
double BBB[41] = {
   -0.00209557154698,-0.001476623089881,-0.0007749172356411, 0.001078324976728,
   0.003836735408429, 0.006655352519891, 0.008206881969049, 0.007078038071226,
   0.002355979867595,-0.005762925264306, -0.01559789169637, -0.02403993585321,
   -0.02714550652792, -0.02117231404326,-0.003786352520018,  0.02491382612837,
    0.06195502635744,   0.1018081070428,     0.13750215203,   0.1622394922755,
     0.1710869277889,   0.1622394922755,     0.13750215203,   0.1018081070428,
    0.06195502635744,  0.02491382612837,-0.003786352520018, -0.02117231404326,
   -0.02714550652792, -0.02403993585321, -0.01559789169637,-0.005762925264306,
   0.002355979867595, 0.007078038071226, 0.008206881969049, 0.006655352519891,
   0.003836735408429, 0.001078324976728,-0.0007749172356411,-0.001476623089881,
   -0.00209557154698
};

void  plot::fir_filter_realtime(float *input, float *output, double * coeffs, int input_len, int coeffs_len)
{
    int i,j;
    float sum;

    for(j = 0; j < input_len; j++)
    {
        sum = 0;
        for (i=0;i<coeffs_len; i++) {
            sum += input[i+j] *  coeffs[i];
        }
        output[j] = sum;
    }
}

void plot::dataInit(void)
{
    //创建一个测试信号
    int fs = 1000;     //采样频率
//    float t = 0:1/fs:1;  //时间向量  分辨率
    float t = 1.0 / fs;
    const float pi = 3.1415926;

    int i = 0;
    for (i = 0; i < _DATA_LENGTH; i++) {
        rawData[i] = sin(2 * pi * 50 * t * i) + sin(2 * pi * 150 * t * i) + sin(2 * pi * 250 * t * i);
        rawData2[i] = sin(2 * pi * 50 * t * i);
    }


    for (i = 0; i < _DATA_LENGTH; i += 2)
    {
            fir_filter_realtime(&rawData[i],&filterData[i], BBB, 2,41);
    }

}

效果如图所示,上下依次是

1 -> 50Hz,150Hz,250Hz原始叠加信号。

2 -> 50Hz原始信号。

3 -> 低通滤波后的信号,可见FIR滤波对相位没有影响。

相关推荐
leoufung8 分钟前
LeetCode 76:Minimum Window Substring 题解与滑动窗口思维详解
算法·leetcode·职场和发展
DanCheOo12 分钟前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
小O的算法实验室21 分钟前
2026年IEEE TETCI,山区环境下基于双种群进化的协同无人机巡逻任务协同优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
刘~浪地球26 分钟前
DeepSeek V4 安全性与伦理:AI发展之路的思考
人工智能·deepseek v4
DanCheOo27 分钟前
开源 | ai-memory v2.6.2:不用配 API Key,一行命令把 Cursor 对话变成结构化知识库
人工智能·ai·ai编程
木枷27 分钟前
rl/swe/sft相关论文列表
人工智能·深度学习
爱学习的张大30 分钟前
具身智能论文精度(八):Pi0.6
人工智能·深度学习
析稿AI写作31 分钟前
如何系统整合文献资源,写出有理论根基与深度的学术论文?
人工智能·ai写作·论文笔记
EnCi Zheng35 分钟前
02-序列到序列模型
人工智能·神经网络·transformer
一起学开源38 分钟前
企业级AI应用开发底座应该怎么设计?
人工智能·系统架构·智能体