精华内容
下载资源
问答
  • 自学应用程序或大学实验室,让学生通过实际实验找出以下问题的答案:a) 放置极点和​​零点 b) 设计IIR 带通滤波器之间的截止锐度和稳定性有何不同) 使用双线性变换 (BLT)? 可以选择不同的滤波器类型并听到...
  • 基于TMS320C54X的IIR带通滤波器设计与仿真 文档 c语言代码 matlab代码
  • 看到一个带通滤波器设计如下,开始研究是如何设计的 代码: band_low = 0.3; band_high = 1.2; fs_origin = 25; hd_band = design(fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin),'...

    写在前面的话:

    由滤波器系数得到传输函数:

    使用matlab fdatool设计滤波器,得到幅频响应,得到滤波器系数,由系数如何得到滤波器的参数?

    我的方法是 使用:点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器或者在 simulink中设计滤波器,双击设计好的滤波器,可以参看其框图,根据框图可以将传输函数写出,即可得到滤波器的参数。

    看到一个带通滤波器的设计如下,开始研究是如何设计的

    带通滤波器设计matlab代码:

    band_low = 0.3;       
    band_high = 1.2;       
    fs_origin = 25; 
    hd_band = design(fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin),'butter'); %带通滤波器
    %fvtool(hd_band); % view
    measure(hd_band) %Measure the frequency response characteristics of the filter 
    %filtered = filter(hd_band,x);  % 滤波器的使用,输入数组x,输出数组filtered

    查看官网MathWorks,找到关于滤波器的设计design,带通滤波器的设计fdesign.bandpass

    The fdesign.bandpass function returns a bandpass filter design specification object that contains specifications for a filter such as passband frequency, stopband frequency, passband ripple, and filter order. Use the design function to design the filter from the filter design specifications object.

    本处只解析此处滤波器的设计参数,若查看更多,移至官网MathWorks

    • N:Filter order for FIR filters. Or both the numerator and denominator orders for IIR filters when Na and Nb are not provided. Specified using FilterOrder. 关于滤波其的阶数
    • F3dB1:Frequency of the 3 dB point below the passband value for the first cutoff, specified in normalized frequency units. Applies to IIR filters.
    • F3dB2:Frequency of the 3 dB point below the passband value for the second cutoff, specified in normalized frequency units. Applies to IIR filters.
    • Fs bandpassSpecs = fdesign.bandpass(___,Fs) provides the sample rate in Hz of the signal to be filtered. Fs must be specified as a scalar trailing the other numerical values provided. In this case, all frequencies in the specifications are in Hz as well. 

    上面这句话解释了传入采样频率的必要性。

    'N,F3dB1,F3dB2' butter

    以上参数的设置使用与IIR butter

    fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin)
    show:  
    bandpass (具有属性):
    
                   Response: 'Bandpass'
              Specification: 'N,F3dB1,F3dB2'
                Description: {3×1 cell}
        NormalizedFrequency: 0
                         Fs: 25
                FilterOrder: 4
                      F3dB1: 0.3000
                      F3dB2: 1.2000

    fvtool(hd_band)% 查看幅频特性

    measure(hd_band) %Measure the frequency response characteristics of the filter 

    Sample Rate             : 25 Hz       
    First Stopband Edge     : Unknown     
    First 6-dB Point        : 250.7041 mHz
    First 3-dB Point        : 300 mHz     
    First Passband Edge     : Unknown     
    Second Passband Edge    : Unknown     
    Second 3-dB Point       : 1.2 Hz      
    Second 6-dB Point       : 1.4315 Hz   
    Second Stopband Edge    : Unknown     
    First Stopband Atten.   : Unknown     
    Passband Ripple         : Unknown     
    Second Stopband Atten.  : Unknown     
    First Transition Width  : Unknown     
    Second Transition Width : Unknown  

    使用fdatool同样实现此滤波器的设计

    设计的滤波器通过File-Export导出到工作区;

    也可以在analysis中查看器信息,比如系数、幅频、相频特性。比如查看analysis中点击Filter Information中可以看到fdesign使用的内容:'N,F3dB1,F3dB2'

    完成了带通滤波器的设计,就在考虑如何转化为C语言代码,这里有个网站可以进行转化,设计滤波器转为C语言实现,但是结果并没有达到我想要的要求,我的目的是怎样将fdatool中设计的滤波器系数中得到其对应的传递函数H(Z),有了传递函数,就可以自己写C语言实现了

    在上面fdatool设计的滤波器中,两种方法查看设计的滤波器,任意一种都可以;

    1. 点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器,
    2. 或者采用如下图操作,从左到右三个按键

       

    双击可以看到滤波器的内部结构,如图显示为两个二阶滤波器级联:

    放大其中一个滤波器如下

    简单作了标记如下

    并给出其对应的C语言实现,此代码无法直接运行只是提取了一部分带通滤波器实现部分

    /* IIR fourth-order filter coefficients */
    typedef struct 
    {
    	float(*a)[3];
    	float(*b)[3];
    	float* gain;
    } IIR_ORDER4_COEFF_T;
    
    /* Save the in-process' data of the second-order filter */
    typedef struct 
    {
    	float m1;
    	float m2;
    } FILTER_ORDER2_T;
    
    /*三轴信号处理前的滤波:四阶带通(0.3-1.2)Hz)滤波,由两个二阶滤波级联起来*/
    float a_raw[2][3] = {
    	{ 1.00, (float)-1.9175958145710057, (float)0.9246554650412394 },    //第一级二阶滤波,分母
    	{ 1.00, (float)-1.7227109782351659, (float)0.7854234338937474 }    //第二级二阶滤波,分母
    };//分母
    float b_raw[2][3] = {
    	{ 1.00, (float)0.00, (float)-1.00 },    //第一级二阶滤波,分子
    	{ 1.00, (float)0.00, (float)-1.00 }    //第二级二阶滤波,分子
    };//分子
    float gain_raw[2] = { (float)0.1048485643154691/*第一级增益*/, (float)0.1048485643154691/*第二级增益*/ };
    
    /******************************************************************************/
    /** Start, initialize the parameters
    * @param[in]
    *
    * @return
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    void StartSwim(void) 
    {
    	/* signal filter parameter initialization */
    	IIR_Raw.a = a_raw;
    	IIR_Raw.b = b_raw;
    	IIR_Raw.gain = gain_raw;
    }
    
    /*
    x: input
    m1:保存中间滤波器数据
    m2:保存中间滤波器数据
    a:滤波器系数
    b:滤波器系数
    gain:增益,对于只支持定点小数运算的,需要把增益分配到每个二阶IIR滤波器的系数中,使得每次中间的结果都不溢出,即使其频率响应的最大值最接近0dB
    */
    float filterOrder2(float* x, float* m_1, float* m_2, float* a, float* b, float* gain){
    	float y, m;
    	//计算没有增益的滤波输出,存于y_
    	m = *x - a[1] * *m_1 - a[2] * *m_2;    //求当前m,同时作为求y_的中间步骤
    	y = m + b[1] * *m_1 + b[2] * *m_2;
    	//更新*m_1和*m_2
    	*m_2 = *m_1;
    	*m_1 = m;
    	//返回带增益的滤波输出
    	return y* *gain;
    }
    
    /******************************************************************************/
    /** filter: Fourth-order filter, direct type II
    * @param[in]
    * filter_state	:Store the middle state of the filter
    * @return
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    float FilterOrder4(float data, FILTER_ORDER4_T* filter_state, IIR_ORDER4_COEFF_T* IIR_coeffs)
    {
    	float data_filtered;
    
    	filter_state->first_order2_out = filterOrder2(&data, &filter_state->first_order2.m1, &filter_state->first_order2.m2, IIR_coeffs->a[0], IIR_coeffs->b[0], IIR_coeffs->gain);  //第一级二阶滤波
    	data_filtered = filterOrder2(&filter_state->first_order2_out, &filter_state->second_order2.m1, &filter_state->second_order2.m2, IIR_coeffs->a[1], IIR_coeffs->b[1], &IIR_coeffs->gain[1]);  //第二级二阶滤波
    	
    	return data_filtered;
    }
    
    /******************************************************************************/
    /** Band-pass filtering for the norm data: 0.25-2Hz
    * @param[in] x:norm data
    *
    * @return filtered data
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    float BandFilter(float x)
    {
    	float y = FilterOrder4(x, &xyz_filter, &IIR_vec);
    
    	return y;
    }

    关于fdatool设计的带通滤波器的系数使用

    使用Matlab的FDAtool工具可以很方便地设计IIR滤波器。使用File菜单中的export选项可以把滤波器的参数输出到Matlab的工作空间中。若滤波器为IIR型,则输出的变量名为G和SOS。它把高阶的IIR滤波器转换为一系列二阶IIR滤波器的级联。SOS为二阶IIR滤波器的系数(b,a),G为各级的增益系数,可用来调节各级通带的衰减。计算IIR滤波器的输出的时候,先将输入数据乘以G, 然后一一通过SOS中的每个IIR滤波器,就得到最终的结果了。

    SOS的每一行表示一级二阶IIR滤波器系[b0,b1,b2,a0,a1,a2],G的每个元素表示相应级的增益系数。也即将G乘上SOS的b0,b1,b2。得到一组新的滤波器系数SOS',可调用MATLAB滤波函数sosfilt对输入信号进行滤波。

    但是如果二阶IIR滤波器的程序只支持定点小数运算的话,那么就需要调整一下系数了。因为设计出来的G有时候很小(不知道会不会很大),这样一旦把输入数据乘以G后,就会使得二阶IIR滤波器的输入过小,造成很大的误差。我们需要把G分配到每个二阶IIR滤波器的系数中,使得每次得到的中间结果都刚好不会溢出。若以IIRi表示第i个二阶IIR滤波器的话,则我们需要保证IIR1, IIR1 * IIR2, IIR1 * IIR2 * IIR3, … 的频率响应都不超过0dB,*号表示级联。为了使得输出的精度最好,我们还需要让上面这些滤波器的频率响应中的最大值最接近0dB。

    级联型:将系统传递函数H(z)因式分解为多个二阶子系统,系统函数就可以表示为这些二阶子系统传递函数的乘积。实现时将每个二阶子系统用直接型实现,整个系统函数用二阶环节的级联实现。

    高阶IIR滤波器的实现是采用二阶滤波器级联的方式来实现的。默认情况下,Filter Coefficients把结果分成多个2阶Section显示,其中还有增益。增益的目的是为了保证计算的精度和系统的稳定性。

     

    简单介绍低通滤波器的使用,其函数参考fdesign官网

    如下

    简单设计了低通滤波

    %% 低通滤波
    function filtered = LowFilter(x)
    fs_origin=1;
    fc=0.03;
    N=4;
    hd_low = design(fdesign.lowpass('N,F3dB',N,fc, fs_origin),'butter');
    filtered = filter(hd_low,x); 
    end

    ..

     

    展开全文
  • 基于MATLAB仿真带通滤波器的程序,包括归一化波形,频谱波形!
  • 熟悉带通滤波器设计原理; 提供编程所需要的计算机一台 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1、设计中心频率为500Hz,带宽为400Hz的IIR数字带通滤波器; 2、独立...
  • 内容简介:课程设计 基于MATLABIIR数字带通滤波器设计 共12页,4424字一、数字滤波器数字滤波器是对数字信号实现滤波的线性时不变系统。数字滤波实质上是一种运算过程,实现对信号的运算处理。输入数字信号(数字...

    内容简介:

    课程设计 基于MATLAB的IIR数字带通滤波器设计 共12页,4424字

    一、数字滤波器

    数字滤波器是对数字信号实现滤波的线性时不变系统。数字滤波实质上是一种运算过程,实现对信号的运算处理。输入数字信号(数字序列)通过特定的运算转变为输出的数字序列,因此,数字滤波器本质上是一个完成特定运算的数字计算过程,也可以理解为是一台计算机。描述离散系统输出与输入关系的卷积和差分方程只是给数字信号滤波器提供运算规则,使其按照这个规则完成对输入数据的处理。时域离散系统的频域特性: ,

    其中 、 分别是数字滤波器的输出序列和输入序列的频域特性(或称为频谱特性), 是数字滤波器的单位取样响应的频谱,又称为数字滤波器的频域响应。输入序列的频谱 经过滤波后 ,因此,只要按照输入信号频谱的特点和处理信号的目的, 适当选择 ,使得滤波后的 满足设计的要求,这就是数字滤波器的滤波原理。

    数字滤波器根据其冲激响应函数的时域特性,可分为两种,即无限长冲激响应(IIR)数字滤波器和有限长冲激响应(FIR)数字滤波器。IIR 数字滤波器的特征是,具有无限持续时间冲激响应,需要用递归模型

    来实现,其差分方程为:

    系统函数为:

    设计IIR滤波器的任务就是寻求一个物理上可实现的系统函数H(z),使其频率响应H(z)满足所希望得到的频域指标,即符合给定的通带截止频率、阻带截止频率、通带衰减系数和阻带衰减系数。

    二、IIR数字滤波器设计方法

    IIR数字滤波器是一种离散时间系统,其系统函数为

    假设M≤N,当M>N时,系统函数可以看作一个IIR的子系统和一个(M-N)的FIR子系统的级联。IIR数字滤波器的设计实际上是求解滤波器的系数 和 ,它是数学上的一种逼近问题,即在规定意义上(通常采用最小均方误差准则)去逼近系统的特性。如果在S平面上去逼近,就得到模拟滤波器;如果在z平面上去逼近,就得到数字滤波器。

    1.用脉冲相应不变法设计IIR数字滤波器

    利用模拟滤波器来设计数字滤波器,也就是使数字滤波器能模仿模拟滤波器的特性,这种模仿可以从不同的角度出发。脉冲响应不变法是从滤波器的脉冲响应出发,使数字滤波器的单位脉冲响应序列h(n)模仿模拟滤波器的冲激响应ha(t),即将ha(t)进行等间隔采样,使h(n)正好等于ha(t)的采样值,满足

    h(n)=ha(nT)

    式中,T是采样周期。

    如果令Ha(s)是ha(t)的拉普拉斯变换,H(z)为h(n)的Z变换,利用采样序列的Z变换与模拟信号的拉普拉斯变换的关系得

    (1-1)

    则可看出,脉冲响应不变法将模拟滤波器的S平面变换成数字滤波器的Z平面,这个从s到z的变换z=esT是从S平面变换到Z平面的标准变换关系式

    ......

    相关说明:

    1、下载本站部分资料,需要注册成为本站会员。如果你尚未注册或登录,请首先注册或登录。

    2、48小时内下载同一文件,不重复扣金币。

    3、下载后请用WinRAR或WinZIP解压缩后使用。

    4、如采用迅雷等下载工具下载失败,请直接用浏览器下载。

    5、如仍有其他下载问题,请看常见问题解答。

    下载地址:

    展开全文
  • 1引言随着计算机和信息科学的极大发展,信号处理已经逐步发展成为一门独立...而数字滤波器作为信号处理一项关键技术是数字信号处理的重要基础,在对信号的过滤、检测、与参数估算等处理过程中,它是使用最为广泛的一种...

    1引言随着计算机和信息科学的极大发展,信号处理已经逐步发展成为一门独立的学科,是信息科学的重要组成部分,在语音处理、图像处理、雷达、航空航天、地质勘探、通信、生物医学等众多领域得到了广泛的应用。信号是数字信号处理领域最基本最重要的概念,信号是信息的载体是信息的物理体现。而数字滤波器作为信号处理一项关键技术是数字信号处理的重要基础,在对信号的过滤、检测、与参数估算等处理过程中,它是使用最为广泛的一种线性系统。数字滤波器按照其冲激响应函数的时域特性,可分为无限长冲激响应(infinitimpulseresponse,IIR)滤波器和有限长冲激响应(finiteim-pulseResponse,FIR)滤波器。在满足相同指标下,IIR滤波器的阶数明显小于FIR,硬件实现容易且大大减少了运算量,在不要求严格线性相位的情况下,IIR滤波器的应用相当广泛。Matlab是一种交互式的以矩阵为基础的软件,它用于科学与工程项目的计算与可视化,它只需要其它编程语言的几分之一的时间即可以解决复杂的数值计算问题。它的强有力也在于那些相对简单的编程功能和提供的非常方便简单的不同学科的工具箱。由于只有低通滤波器的AFD表是现成的,于是为了设计其它滤波器(高通,带通,带阻)我们往往需要一些频率的变换。而本文旨在通过介绍一些常用的方法来解决IIR带通滤波器的设计问题。2IIR滤波器基本概念一个N阶递归型数字滤波器的差分方程为My(n)=i=0bix(n-r)-Ni=1aiy(n-i)IIR滤波器的系统函数H(Z)=Mr=0brz-r1+NK=1akz-k从以上的系统函数可知,设计IIR滤波器的任务就是通过计算寻求一个因果、物理上可实现的系统函数H(Z),使其频率响应H(ejw)满足所希望得到的频域指标,即符合给定的通带截止频率、阻带截止、通带衰减和阻带衰减。3数字滤波器的设计过程数字滤波器的一般设计过程可分为以下四个步骤:1)按照实际的需要,确定滤波器的性能要求或指标;2)用一个因果稳定的离散线性时不变系统,去逼近这一性能指标;3)用有限精度的运算实现所设计的系统;4)通过模拟,验证所设计的系统是否符合性能要求4应用实例1)用切比雪夫函数直接设计IIR数字带通滤波器在工程中模拟滤波器可以设计出相应的数字低通滤波器,此方法也能推广到设计其它类型的选频滤波器。通过对低通滤波器的频率轴进行变换可以得到其它类型的选频器。而matlab提供了能在s平面上实现频带转换的函数,我们下面首先说明下z平面映射的用法,接着再通过一个切比雪夫滤波器的应用实例来印证这种方法。通过给定的低通滤波器原型,并设H(z)是期望的选频数字滤波器,通过一系列的变换得到:nZ-1=G(z-1)=k=1z-1-k1-kz-1限于篇幅下表只给出了原型低通到带通的转换,如需对高通和带阻有所研究的读者可以自行查资料。表1数字滤波器的频带变换变换类型变换参数带通z-1z-2-1z-1+22z-2-1z-1+1w1=低截止频率wu高截止频率1=-2k/(k+1)2=(k-1)/(k+1)k=cos[(wu+wl)/2]cos[(wu-wl)/2]k=coswu-wetanwcCheby1函数设计IIR带通数字滤波器的调用方式[b,a]=cheby1(N,r,Wn)其中Wn为二元向量即Wn=[w1,w2],则此函数返回的是一个2n阶的带通切比雪夫I型带通滤波器的设计结果,其通带为[w1,w2]例1设计一个数字带通滤波器,要求如下:设计一个通带为0.6*pi到0.8*pi的8阶滤波器,其采样频率为1000Hz,其中那个滤波器在通带

    展开全文
  • 警告 此文章将耗费你成吨的流量,请wifi下阅读,造成的流量浪费...初版源代码获取(请勿用作他用,仅供学习):https://gitee.com/kingstacker/iir.git 若有问题可以联系我邮箱:kingstacker_work@163.com 版...

    转至:https://www.cnblogs.com/kingstacker/p/7577190.html

     

    警告

    此文章将耗费你成吨的流量,请wifi下阅读,造成的流量浪费本人不承担任何责任。初版源代码获取(请勿用作他用,仅供学习):https://gitee.com/kingstacker/iir.git

    若有问题可以联系我邮箱:kingstacker_work@163.com

    版权所有,转载请注明出处。

    感谢

    感谢杜勇老师的书籍:

    感谢杜勇老师不厌其烦的答复我的邮件垂询。

    感谢自己,编代码调试眼睛快瞎了。。。。。

     

    前言

    这个课程设计做过一年多了,知识什么的差不多都忘记了,最近去面试直接就问项目,而且问得挺细,一脸懵逼,眼泪掉下来,

    简历上写的项目你自己一定要说的明白

    简历上写的项目你自己一定要说的明白

    简历上写的项目你自己一定要说的明白

    所以,又复习了一遍,当然更为娴熟也添加了新的东西。

    基础知识:

    什么叫滤波器?

    简单的说,就像筛米,留下你需要的米,滤掉不需要的米头。过滤的功能。

    什么叫数字滤波器?

    用数字芯片做的滤波器,而不是rc搭的,输入是离散的序列,输出也是离散的序列;

    快速了解时域频域:

    https://zhuanlan.zhihu.com/p/19763358?from=singlemessage&isappinstalled=1

    什么叫时域?

    信号随时间的变化。

    什么叫频域?

     

     

     曾经有个通俗的解释是:弹钢琴,琴键1234等表示的就是频域,产生的各种音乐就是时域,你以为的万变其实是永恒的不变。

    什么叫fir与iir滤波器?

    FIR(Finite Impulse Response)滤波器:有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。

    无限脉冲响应。递归滤波器,也就是IIR数字滤波器,顾名思义,具有反馈。 

    fir和iir有啥异同(important)?

     根据冲激响应的不同,将数字滤波器分为有限冲激响应(FIR)滤波器和无限冲激响应(IIR)滤波器。对于FIR滤波器,冲激响应在有限时间内衰减为零,其输出仅取决于当前和过去的输入信号值。对于IIR滤波器,冲激响应理论上应会无限持续,其输出不仅取决于当前和过去的输入信号值,也取决于过去的信号输出值。

    1. 在相同技术指标下,IIR滤波器由于存在着输出对输入的反馈,因而可用比FIR滤波器较少的阶数来满足指标的要求,这样一来所用的存储单元少,运算次数少,较为经济。例如用频率抽样法设计阻带衰减为-20db的FIR滤波器,其阶数要33阶才能达到,而如果用双线性变换法设计只需4-5阶的切贝雪夫滤波器,即可达到指标要求,所以FIR滤波器的阶数要高5-10倍左右。

    2. FIR滤波器可得到严格的线性相位,而IIR滤波器则做不到这一点,IIR滤波器选择性愈好,则相位的非线性愈严重,困而,如果IIR滤波器要得到线性相位,又要满足幅度滤波的技术要求,必须加全通网络进行相位校正,这同样会大大增加滤波器的阶数,从这一点上看,FIR滤波器又优于IIR滤波器。

    3. FIR滤波器主要采用非递归结构,因而从理论上到实际的有限精度的运算中,都是稳定的。有限精度运算误差也较小,IIR滤波器必须采用递归的结构,极点必须在Z平面单位圆内,才能稳定,这种结构,运算中的四舍五入处理,有时会引起寄生振荡。

    4. FIR滤波器,由于冲激响应是有限长的,因而可以用快速傅里叶变换算法,这样运算速度可以快得多,IIR滤波器则不能这样运算。

    5. 从设计上看,IIR滤波器可以利用模拟滤波器设计的现成闭合公式、数据和表格,因而计算工作量较小,对计算工具要求不高。FIR滤波器则一般没有现成的设计公式,窗函数法只给出窗函数的计算工式,但计算通带、阻带衰衰减仍无显示表达式。一般FIR滤波器设计只有计算机程序可资利用,因而要借助于计算机。

    6. IIR滤波器主要是设计规格化的、频率特性为分段常数的标准低通、高通、带通、带阻、全通滤波器,而FIR滤波器则要灵活得多,例如频率抽样设计法,可适应各种幅度特性的要求,因而FIR滤波器则要灵活得多,例如频率器可设计出理想正交变换器、理想微分器、线性调频器等各种网络,适应性较广。而且,目前已有许多FIR滤波器的计算机程序可供使用。

    什么叫定点数?

    计算机中采用的一种数的表示方法。参与运算的数的小数点位置固定不变。

    什么叫滤波器的零点极点?

    滤波器可以看成是一个信号处理的系统,其输入输出之间存在一定的关系,这种关系无论在时域还是频域都可以用数学表达式来表示.而这数学表达式又是分子分母都是多项式的表达式(称为传输函数),这样满足使传输函数的分子为零的是零点,满足使传输函数分母为零的就是其极点.

    iir滤波器的种类:很多啊,直接一型,直接二型,级联型,并联型。

    对于matlab的fdatool工具中二阶节默认结构为:

    对于这个结构用图表示为:

    差分方程表示为:

    零极点表示为:零点就是差分方程的前面三项,极点就是后面两项。用FPGA实现主要就是实现滤波器的差分方程。

     

    流程:

    任务要求:

    16阶二阶级联IIR数字滤波器设计,16bit有符号整数连续输入,采样率80khz,通带频率1k-8khz。系数为16bit有符号整数。

    1.系数产生:通过matlab中的fdatool软件生成所需系数。(当然可以用各种函数生成,太难工科生表示要阵亡了,还是默默用fdatooll吧)

    把需求放入fdatool中:生成的架构就是直接二型二阶节结构。

     

     零极点图:

    未量化的系数:

    未量化的系数导出:生成一个c文件。

     

    那么问题来了,这个c文件中的内容是啥子意思呢,一开始我也是一脸懵逼,而且网上的资料少之又少,文件如下所示,含义已注释:

    复制代码

      1 /*
      2  * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
      3  *
      4  * Generated by MATLAB(R) 7.8 and the Signal Processing Toolbox 6.11.
      5  *
      6  * Generated on: 22-Sep-2017 20:23:35
      7  *
      8  */
      9 
     10 /*
     11  * Discrete-Time IIR Filter (real)
     12  * -------------------------------
     13  * Filter Structure    : Direct-Form II, Second-Order Sections
     14  * Number of Sections  : 8
     15  * Stable              : Yes
     16  * Linear Phase        : No
     17  */
     18 
     19 /* General type conversion for MATLAB generated C-code  */
     20 #include "tmwtypes.h"
     21 /* 
     22  * Expected path to tmwtypes.h 
     23  * D:\workfile\Matlab2009\extern\include\tmwtypes.h 
     24  */
     25 /*
     26  * Warning - Filter coefficients were truncated to fit specified data type.  
     27  *   The resulting response may not match generated theoretical response.
     28  *   Use the Filter Design & Analysis Tool to design accurate
     29  *   single-precision filter coefficients.
     30  */
     31 #define MWSPT_NSEC 17
     32 const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1 };
     33 //上面1313的玩意表示下面这个数组哪个项有效,1则表示第一项有效,3表示都有效;
     34 const real32_T NUM[MWSPT_NSEC][3] = {
     35   {
     36      0.1001105756,              0,              0  //第一个二阶节的增益;
     37   },
     38   {
     39                 1,   0.7806397676,              1 //第一个二阶节的零点;b0,b1,b2;
     40   },
     41   {
     42      0.1001105756,              0,              0 //第二个二阶节的增益;
     43   },
     44   {
     45                 1,   -1.999714136,              1 //第二个二阶节的零点;b0,b1,b2;
     46   },
     47   {
     48      0.3725369573,              0,              0 //以下就是类似的了;
     49   },
     50   {
     51                 1,  -0.9795594215,              1 
     52   },
     53   {
     54      0.3725369573,              0,              0 
     55   },
     56   {
     57                 1,    -1.99809742,              1 
     58   },
     59   {
     60      0.6452683806,              0,              0 
     61   },
     62   {
     63                 1,   -1.352879047,              1 
     64   },
     65   {
     66      0.6452683806,              0,              0 
     67   },
     68   {
     69                 1,   -1.996625185,              1 
     70   },
     71   {
     72      0.7896357179,              0,              0 
     73   },
     74   {
     75                 1,   -1.448690891,              1 
     76   },
     77   {
     78      0.7896357179,              0,              0 
     79   },
     80   {
     81                 1,   -1.995926261,              1 
     82   },
     83   {
     84                 1,              0,              0    //总的增益为1,上面8个分增益相乘最终为1;
     85   }
     86 };
     87 const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1 };
     88 const real32_T DEN[MWSPT_NSEC][3] = {
     89   {
     90                 1,              0,              0  //忽略项;
     91   },
     92   {
     93                 1,   -1.765431523,   0.8537048697 //第一个二阶节的极点;a0,a1,a2;
     94   },
     95   {
     96                 1,              0,              0 
     97   },
     98   {
     99                 1,   -1.893844962,    0.919323802  //以下类似;
    100   },
    101   {
    102                 1,              0,              0 
    103   },
    104   {
    105                 1,   -1.666594863,    0.877212882 
    106   },
    107   {
    108                 1,              0,              0 
    109   },
    110   {
    111                 1,   -1.959967136,   0.9707458019 
    112   },
    113   {
    114                 1,              0,              0 
    115   },
    116   {
    117                 1,   -1.614711642,   0.9346644878 
    118   },
    119   {
    120                 1,              0,              0 
    121   },
    122   {
    123                 1,   -1.982463837,   0.9896451831 
    124   },
    125   {
    126                 1,              0,              0 
    127   },
    128   {
    129                 1,   -1.603200555,   0.9806866646 
    130   },
    131   {
    132                 1,              0,              0 
    133   },
    134   {
    135                 1,   -1.991223216,   0.9973948002 
    136   },
    137   {
    138                 1,              0,              0 
    139   }
    140 };

    复制代码

     

    系数量化选项:系数量化你可以自己量化也可以让软件量化,不过它量化出来的数据零点并不是乘完增益后再进行量化的。最好还是乘完增益后再量化,所以还是自己用excel慢慢量化吧,眼泪掉下来。

     未量化excel表:

    excel中计算单元格方便到不行:零点乘完增益放大16384;极点直接放大16384;下图gain请无视。

    新的b0=b0*gain1*16384;新的a0=a0*16384;放大16384倍方便FPGA实现除法截位。

    2.编码实现:

    先看一下16阶iir滤波器架构:级联8个二阶节。

    一个二阶节:

    现在就可以编码实现它了,这是第一版代码,尚未优化,仿真ok,不要逻辑综合,会占用成吨的资源。

    由于技术垃圾,不做十分精确输出位控制,输出都为16bit数据。

    两个n位的加法结果需要n+1位;两个n位的乘法结果需要2n位。

    matalb生成modelsim仿真文件向量:

    生成1500hz,采样80khz波形向量文件。生成其他hz的波形文件类似。

    复制代码

     1 f1=1500;   %频率1500hz;
     2 Fs=80000;  %采样80khz;
     3 N=16;        %16bit量化;
     4 t=0:1/Fs:0.01;  %采样时长0.01;
     5 c2=2*pi*f1*t;
     6 s2=sin(c2);  %正弦波产生;
     7 s2=s2/max(abs(s2));
     8 Q_s=round(s2*(2^(N-1)-1));
     9 plot(t,s2,'r*-');   %画图;
    10 
    11 fid=fopen('D:\data\data_1500\data_1500.txt','w');    %采样点保存为10进制;
    12 fprintf(fid,'%8d\r\n',s2);
    13 fprintf(fid,';'); 
    14 fclose(fid);
    15 
    16 fid=fopen('D:\data\data_1500\data_1500_B.txt','w'); %采样点保存为2进制;
    17 for i=1:length(Q_s)
    18     B_s=dec2bin(Q_s(i)+(Q_s(i)<0)*2^N,N)
    19     for j=1:N
    20        if B_s(j)=='1'
    21            tb=1;
    22        else
    23            tb=0;
    24        end
    25        fprintf(fid,'%d',tb);  
    26     end
    27     fprintf(fid,'\r\n');
    28 end
    29 fprintf(fid,';'); 
    30 fclose(fid);

    复制代码

     

    仿真测试:

    对600hz正弦波滤波结果:600hz波形被滤除。

     

     对5000hz正弦波滤波结果:5000hz波形通过。

     

     

     对9000hz波形滤波结果:开始有点点迷之振荡,基本滤除9000hz的波。

     

    最开始的结果经过多久出来到out?(特么上次面试还问这个了,十脸懵逼,根本没注意这啊。。。emmm很气)

    可以看到是复位拉高后的9个时钟周期后yout数据产生,因为流水线啊,emmm。

     初版代码综合上板子:通过rom输出5khz的数据。

     

    所以优化很重要,这是未优化版本。

    signaltapII抓下波:

     

    优化版以及未优化版比较:只包含iir部分,不含pll以及rom。系统时钟跟采样时钟一样,80khz。

    未优化版:直接采用*(乘)的方式。

     

    优化版:采用内置乘法器,以及采用移位相加的方法。资源少的可怜啊,一共才30个9bit乘法器。。。。,若再增加乘法器,le使用量又会往上涨。未来优化方向:提高时钟频率,复用乘法器。

     

     

    其他:

    怎么优雅的分解系数用来移位相加:

    直接写了个c程序,来看看效果:

    c源代码:看看就好啦,很久没写c,完全没有代码style了emmm。

    复制代码

     1 #include <stdio.h>
     2 #include <math.h>
     3 int main(void)
     4 {
     5     int coefficient;
     6     int sum;
     7     int sum1;
     8     int mul;
     9     int mul1;
    10     int j;
    11     int i;
    12     int k=0;
    13     int m;
    14     int n=0;
    15     int cha;
    16     printf("All rights by kingstacker!\n");
    17     begin:
    18     printf("Pelese input the coefficient:");
    19     scanf("%d",&coefficient);
    20     printf("%d=",coefficient);
    21     sum = coefficient;
    22     sum1 = coefficient;
    23     for (m=15;m>=0;m--)   //add;
    24     {
    25         mul1=pow(2,m);
    26         if (sum1 >= mul1)
    27         {
    28              sum1 = sum1 -mul1;
    29              n=n+1;
    30              printf("+%d(2^%d)",mul1,m );
    31             
    32         }
    33         
    34     }
    35     printf("\nIf add,use %d add source !\n",n-1 );
    36     //sub;
    37     for (j=0;j<=15;j++)
    38     {
    39         mul=pow(2,j);
    40         if (mul >= sum)
    41         {
    42             goto this;
    43         }
    44     }
    45     this:
    46     cha = mul - sum;
    47     printf("%d=%d(2^%d)",sum,mul,j );
    48     for (i=j;i>=0;i--)
    49     {
    50        mul1 = pow(2,i);
    51        if (cha >= mul1)
    52        {
    53            cha = cha - mul1;
    54            k=k+1;
    55            printf("-%d(2^%d)",mul1,i );  
    56        }
    57     }
    58     printf("\nIf sub,use %d add source !\n",k );
    59     //result;
    60     if((n-1) <= k)
    61     {
    62         printf("\nadd is better!\n");
    63     }
    64     else
    65     {
    66         printf("\nsub is better!\n");
    67     }
    68     k=0;
    69     n=0;
    70     goto begin;
    71     printf("Thanks for you use!bye!\n");
    72     
    73 }

    复制代码

     

    以上。

    展开全文
  • 2015·9(上)《科技传播》 138 科技创新 ... 1 利用模拟滤波器来设计IIR带通滤波器的步骤 1)按照一定的变换将给出的数字滤波器的指标转换为模拟带通滤波器的技术指标。 2)根据转换后的技术指标设计模拟低通滤波器 G1(...
  • 巴特沃斯带通滤波器matlab代码图像处理器 空间领域 亮度 对比 3x3低通 5x5低通 7x7低通 9x9低通 边缘检测高通 高升 整体直方图均衡 自适应直方图均衡 频域 低通-理想 低通-高斯 低通-巴特沃思 高通-理想 高通-高斯...
  • 切比雪夫II 型带通IIR 数字滤波器设计1.设计思路(1) 数字—模拟指标转换。利用双线性变换的频率预畸变公式2tan 2ωT =Ω,把所要求的数字滤波器)(z H 数字频率指标转换为相应的模拟滤波器)(s H 的模拟频率指标。(2) ...
  • matlab代码,直接运行出结果,含以下几个部分的代码: 1. 巴特沃兹带通滤波器设计 2.带阻滤波器设计 3.递归型滤波器设计 4.对信号进行数字滤波
  • 基于Matlab带通IIR数字滤波器设计与仿真.pdf
  • 喜欢就本文就点个赞吧~~版权...今天就来个一步一步描述如何设计部署一个IIR滤波器到你的系统。写这篇文章考虑到很多粉丝是做单片机系统开发的,经常会需要采集模拟信号,系统中往往存在各种各样的干扰,干扰常常让...
  • iir数字滤波器设计及其matlab实现 1IIR 数字滤波器设计及其 MATLAB 实现自动化学院 杨梅 201422070125摘 要IIR 数 字 滤 波 器 在 设 计 上 可 以 借 助 成 熟 的 模 拟 滤 波 器 的 成 果 ,如 巴 特 沃 斯 、 契 ...
  • Matlab设计了一种巴特沃斯带通滤波器,适合初学者使用
  • 实验六IIR滤波器matlab实现一、实验目的和任务1.理解并掌握IIR数字滤波器的机理;2. 掌握设计IIR数字滤波器的原理和方法;3. 观察IIR滤波器的频域特性。二、实验原理1、IIR数字滤波器与FIR数字滤波器的区别1.1、...
  • 基于双线性变换法的IIR数字巴特沃思带通滤波器设计,用MATLAB仿真
  • 利用MATLAB结合双线性变换法设计一个数字切比雪夫带通IIR滤波器课程设计,共19页!包括摘要、正文、个人总结。
  • fir带通滤波器设计

    2011-12-20 20:59:43
    通过MATLSB设计确定FIR和IIR滤波器系数; DSP初始化。 A/D采样; FIR和IIR运算,观察滤波器前后的波形变化; 对带有噪声的不同输入信号进行FIR和IIR滤波,观察滤掉后噪声后的波形; 熟练使用CCS 对程序进行调试。
  • IIR数字滤波器设计(数字信号处理)

    万次阅读 多人点赞 2018-12-18 16:31:38
    欢迎来访交流 ~~ IIR数字滤波器设计(数字信号处理) ...2.掌握IIR数字滤波器MATLAB实现方法,会调用ellipord()和ellip() 函数设计各种滤波器。 3.观察分析滤波器输入输出数据波形,理解数字滤波的概念...
  • 欢迎来访交流 ~~ IIR数字滤波器设计...2.掌握IIR数字滤波器MATLAB实现方法,会调用ellipord()和ellip() 函数设计各种滤波器。3.观察分析滤波器输入输出数据波形,理解数字滤波的概念。二、实验原理及步骤(一...
  • IIR数字滤波器设计

    千次阅读 2017-03-10 16:42:14
    IIR数字滤波器设计FIR与IIR的区别 两种滤波器都是数字滤波器。根据冲激响应的不同,将数字滤波器分为有限冲激响应(FIR)滤波器和无限冲激响应(IIR滤波器。 对于FIR滤波器,冲激响应在有限时间内衰减为零,其...
  • 数字信号处理课程设计IIR/FIR高通、带通、低通滤波器进行语音信号处理,GUI界面。
  • IIR滤波器MATLAB与FPGA的设计实现

    千次阅读 2020-01-24 21:07:20
    IIR滤波器MATLAB与FPGA的设计实现 博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢! 引言 数字滤波器是数字信号系统里面最常用、最重要、最基本的元件之一。无限脉冲响应...
  • 院系 基层教学单位 学 号 学生姓名 专业班级 设计题目 基于MatlabIIR数字滤波器设计(脉冲响应不变法) 设 计 技 术 参 数 基于Matlab软件利用脉冲响应不变法设计IIR低通高通带通带阻数字滤波器并分析滤波器单位脉冲...
  • 提出一种通过两个二阶节级联构成四阶IIR数字椭圆滤波器设计方法,并利用Matlab仿真软件设计了通带内波纹不大于0.1dB,阻带衰减不小于42dB的IIR数字滤波器。论述了一种采用可编程逻辑器件,通过VHDL硬件描述语言...
  • %从低通滤波器变换成带通滤波器 close all clear Fpass = 0.1; % Passband Frequency Fstop = 0.2; % Stopband Frequency Apass = 1; % Passband Ripple (dB) Astop = 60; % Stopband Attenuation (dB) h = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 761
精华内容 304
关键字:

iir带通滤波器matlab设计

matlab 订阅