• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: Matlab
  • 标签: IIR  C语言  直接法  

资源简介

本程序通过直接法,实现了给定参数的IIR低通滤波器的设计。 本程序所设计的滤波器的参数与Matlab校准过。 将需要的数据输入.dat文件,实现自动处理。其输出与Matlab一致。 详细的设计过程,参看博客。 http://blog.csdn.net/thnh169/article/details/9076283

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 


#define     pi     ((double)3.1415926)

typedef struct 
{
    double Real_part;
    double Imag_Part;
} COMPLEX;

struct DESIGN_SPECIFICATION
{
    double Cotoff;   
    double Stopband;
    double Stopband_attenuation;
};



int Ceil(double input)
{
     if(input != (double)((int)input)) return ((int)input) +1;
     else return ((int)input); 
}


int Complex_Multiple(COMPLEX aCOMPLEX b
                                 double *Res_Realdouble *Res_Imag)

{
       *(Res_Real) =  (a.Real_part)*(b.Real_part) - (a.Imag_Part)*(b.Imag_Part);
       *(Res_Imag)=  (a.Imag_Part)*(b.Real_part) + (a.Real_part)*(b.Imag_Part);    
 return (int)1; 
}

 int Complex_Division(COMPLEX aCOMPLEX b
                                    double *Res_Realdouble *Res_Imag)
{
        *(Res_Real) =  ((a.Real_part)*(b.Real_part) + (a.Imag_Part)*(b.Imag_Part))/
           ((b.Real_part)*(b.Real_part) + (b.Imag_Part)*(b.Imag_Part));

 *(Res_Imag)=  ((a.Real_part)*(b.Imag_Part) - (a.Imag_Part)*(b.Real_part))/
           ((b.Real_part)*(b.Real_part) + (b.Imag_Part)*(b.Imag_Part));

 return (int)1; 
}

double Complex_Abs(COMPLEX a)
{
      return (double)(sqrt((a.Real_part)*(a.Real_part) + (a.Imag_Part)*(a.Imag_Part)));
}

double IIRFilter  (double *a int Lenth_a
                           double *b int Lenth_b
                           double Input_Data
                           double *Memory_Buffer) 
{
    int Count;
    double Output_Data = 0; 
    int Memory_Lenth = 0;
    
    if(Lenth_a >= Lenth_b) Memory_Lenth = Lenth_a;
    else Memory_Lenth = Lenth_b;
    
    Output_Data += (*a) * Input_Data;  //a(0)*x(n)             
    
    for(Count = 1; Count < Lenth_a ;Count++)
    {
        Output_Data -= (*(a + Count)) *
                       (*(Memory_Buffer + (Memory_Lenth - 1) - Count));                                       
    } 
    
    //------------------------save data--------------------------// 
    *(Memory_Buffer + Memory_Lenth - 1) = Output_Data;
    Output_Data = 0;
    //----------------------------------------------------------// 
    
    for(Count = 0; Count < Lenth_b ;Count++)
    {    
        Output_Data += (*(b + Count)) *
                       (*(Memory_Buffer + (Memory_Lenth - 1) - Count));      
    }
    
    //------------------------move data--------------------------// 
    for(Count = 0 ; Count < Memory_Lenth -1 ; Count++)
    {
     *(Memory_Buffer + Count) = *(Memory_Buffer + Count + 1);
    }
    *(Memory_Buffer + Memory_Lenth - 1) = 0;
    //-----------------------------------------------------------//

    return (double)Output_Data; 
}


int Direct( double Cotoff
           double Stopband
           double Stopband_attenuation
           int N
           double *azdouble *bz)
{
      printf(“Wc =  %lf  [rad/sec] \n“ Cotof

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1358  2013-05-02 19:00  input.dat

     文件       9755  2013-05-02 15:25  IIR.c

----------- ---------  ---------- -----  ----

                11113                    2


评论

共有 条评论