[数字信号处理学习篇] FIR 滤波器基础(一)

1.[数字信号处理] FIR 滤波器基础
2.[数字信号处理]使用窗函数设计 FIR 滤波器
3.[数字信号处理]单位冲击响应的频响与 FIR 的实现代码(C 语言)
4.[数字信号处理]相位特性解卷绕
5.[数字信号处理]IIR 滤波器基础
6.[数字信号处理]IIR 滤波器的间接设计
7.[数字信号处理]IIR 滤波器的直接设计

对于一个滤波器而言,其单位冲击响应是有限区间的数列的话,这个滤波器是 FIR 滤波器。反
之,其单位冲击响应是无限区间的数列的话,这个滤波器是 IIR 滤波器
下面使用线性差分方程式,在时域内,解释一下 FIR 与 IIR 数字滤波器。使用单位脉冲响应和
其输入信号进行卷积运算,可得到下式
在这里插入图片描述
将其改写为递归的方式,则
在这里插入图片描述
上式是1次差分方程式,而对于N次数字滤波器的输入输出关系,表示为N次差分方程式,如下所示。
在这里插入图片描述
由上式看,输出 y(n) 需要自己的历史值,也就是,含有反馈。
a_k = 0 的时候,反馈有作用,其系统框图如下。
在这里插入图片描述
此时,输入单位脉冲,由于反馈的作用,系统的单位冲击响应是无限的。
a_k != 0 的时候,无反馈作用,其单位冲击响应是有限的,其单位框图如下。
在这里插入图片描述
输入单位脉冲,由于没有反馈的作用,系统的单位冲击响应是有限的。也就是 Finite Impulse
Response,字面意思。

接下来,用 C 实现一个 FIR 滤波器,这里,系数是随意设置的。

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#include <string.h>
 
 
double Real_Time_FIR_Filter(double *b,
                            int     b_Lenth,
                            double *Input_Data)
{    
    int Count;
    double Output_Data = 0;
    
    Input_Data += b_Lenth - 1;  
    
    for(Count = 0; Count < b_Lenth ;Count++)
    { 
            Output_Data += (*(b + Count)) *
                            (*(Input_Data - Count));
    }         
    
    return (double)Output_Data;
}
 
void Save_Input_Date (double Scand,
                      int    Depth,
                      double *Input_Data)
{
    int Count;
  
    for(Count = 0 ; Count < Depth-1 ; Count++)
    {
    	*(Input_Data + Count) = *(Input_Data + Count + 1);
    }
    
    *(Input_Data + Depth-1) = Scand;
}
 
 
int main(void)
{
    double b[] = {0.5 , -0.5 , 1};
    double Scand_Data = 0;
    char Command = 0;
   
    int b_Lenth = (sizeof(b)/sizeof(double));
    int Count = 0;
    
    double Input_Data[sizeof(b)/sizeof(double)] = {0};
    double Output_Data = 0;
    
    /*--------------------display----------------------------*/      
    printf("  b(k) : ");
    for(Count = 0; Count < b_Lenth ;Count++)
    {
    	printf("%f " , b[Count]);
    }
    printf("\n");
    /*-----------------------------------------------------*/
    
    Count = 0;
    while(1)
    {
    	if(Count == 0) printf("The Input : ");   
        else printf("The Next Input : ");   
   
    	scanf("%lf",&Scand_Data);
    	printf("Input x(%d) : %lf         ",Count,Scand_Data);    
    	
    	Save_Input_Date (Scand_Data,
                         b_Lenth,
                         Input_Data);
 
    	Output_Data = Real_Time_FIR_Filter(b,
                                           b_Lenth,
                                           Input_Data);        
                             
        printf("Output y(%d) : %lf  \n",Count,Output_Data);                    
 
    	scanf("%c",&Command);
    	if(Command == 27) break;    //ESC
    	
    	Count++;
    }
    
    printf("\n");
	
    return (int)0;
}

到此,一个FIR滤波器就实现了,只需要不停的输入输入信号就好了,ESC键可以停止程序。

其单位冲击响应用Matlab表示如下。
在这里插入图片描述

版权声明:本文为weixin_42788078原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42788078/article/details/103272550

智能推荐

FIR数字滤波器的FPGA实现

目录 1.FIR数字滤波器实现原理 2.FPGA实现 2.1全串行FIR滤波器 2.1.1 原理图  2.1.2 Verilog代码 2.1.3 仿真测试代码 2.1.4 仿真结果图 1.FIR数字滤波器实现原理 一个 N 阶的 FIR 滤波器输出公式 y(n) 如下: 式1中 h(k)为滤波器的系数,x(n-k)为x(n)延时k个周期。系统的传输函数H(z)可表示成公式2: ...

FIR-IIR滤波器设计1:窗函数法设计FIR数字滤波器

文章目录 0、基础知识 1、调用函数 2、具体调用方式 3、频响曲线 4、实际例子 0、基础知识 FIR滤波器的z变换为: H(z)=∑n=0N−1h(n)z−n H(z)=\sum_{n=0}^{N-1} h(n) z^{-n} H(z)=n=0∑N−1​h(n)z−n 它在z平面上有N−1个零点并在原点z=0处有N&m...

FIR数字滤波器 C语言频域实现 matlab设计FIR参数

FIR数字滤波器 C语言频域实现 matlab设计FIR参数 一、FIR实现步骤 1、FIR参数做FFT 2、输入数据做FFT 3、FIR做复数乘积 4、将复数乘积结果做IFFT输出 二、FIR代码实现 1、FIR参数的生成 2、FIR系数做FFT计算 3、输入数据做overlap 4、输入数据做FFT 5、数据做复数乘积 6、数据做IFFT并输出 三、代码说明以及待完善 1、说明 2、待完善 本...

linux上安装Qt4.8.6+QtCreator4.0.3

一、Qt简介 Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。 准备工作 操作系统:centos6.5 位数:64位 二、安装 1、获取源码Qt4.8.6 2、获取源码QtCreator4.0.3 2、安装QtCreator4.0.3 进入QtCreator安装界面,指定...

react-native metro 分析

文章目录 前言 概念 Resolution Transformation Serialization 打包方式 Moudles Plain bundle Indexed RAM bundle File RAM bundle 流程 前置流程 resolve流程 Transformer流程 序列化流程 缓存 为什么要缓存 缓存的请求与缓存 Metro配置 结构 前言 metro是一种支持ReactNa...

猜你喜欢

嵌入式Linux——应用调试:用户态打印段错误信息

简介:     很多时候我们会遇到段错误:segmentation fault,而段错误有时是由内核引起的,有时是由应用程序引起的。在内核态时,发生段错误时会打印oops信息,但是在用户态时,发生段错误却只会打印segmentation fault而并不会打印其他的信息。所以本文主要介绍在用户态时,通过修改内核设置和添加启动参数来打印引发segmentati...

springboot1.4.1整合logback 遇到的问题

springboot1.4.1整合logback 遇到的问题 项目使用了springboot1.4.1整合logback,然而设置的过期时间15 并没有生效, 2GB达到2G自动删除也没有生效,仅仅实现了按大小分割。 经过查看pom 父工程内的源码发现是默认的logback版本是1.1.7,而过期时间配置是在logback 1.1.8以后才支持的。 不得不说这是springboot1.4.1 的b...

记一次C/S架构的渗透测试

概述 目标站点是http://www.example.com,官网提供了api使用文档,但是对其测试后没有发现漏洞,目录、端口扫描等都未发现可利用的点。后发现官网提供了客户端下载,遂对其进行一番测试。 信息收集 先抓了下客户端的包,使用Fiddler和BurpSuite都抓不到,怀疑走的不是HTTP协议,用WireShark查看其确实用的是HTTP协议,但是数据包不好重放,这里最后使用了WSExp...

Linux:结合Securecrt进行文件上传(lrzsz)P2

1、安装rzsz软件   2、点击Scurecrt的option——X/Y/Z配置上传和下载目录   3、首先在Linux里切换到一个目录,然后用rz命令,文件就会上传到钙Linux的目录下   只要敲rz即可,然后在弹出的对话框里选择需要上传的文件即可 4、下载文件用sz   下载单个文件:在当前目录下有该文件     sz filename   下载...

SQL 提示作为 布局 生存工具指南

下面是一些展示AdventureWorks中表现最好的销售人员并列出他们的经理的结构化查询语言代码。 它产生以下结果。 所以,代码是有效的,但它是丑陋的。 如果我需要理解和改进代码,我首先需要把它变成可读的形式。 我有结构化查询语言提示,所以我可以按下计算机的ctrl按键键 踢你自己),它会应用默认的内置代码样式,并对此进行修复。 不,不是,因为我相信你仍然不喜欢它的格式。 没有两个开发人员能够就...