⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firlh.cpp

📁 数个关于滤波器的产生的C程序
💻 CPP
字号:


 #include <math.h>
 #include <stdio.h>
 #define M 38
 #define pi 3.141592653589793
   //////////////////////////////////////////////////////////////
   // w为3dB截止频率;要求w<1,1对应采样频率的一般;滤波器阶数n;  //
   // b返回滤波器n+1个抽头系数;                                //
   // type整型变量标志位用于确定所选的窗函数                   //
   //   type: 1:  巴特利特(Bartlett)窗                         //
   //         2:  汉宁(Hanning)窗                              //
   //         3:  哈明(Hamming)窗                              //
   //         4:  布莱克曼(Blackman)窗                         //
   //         其他:矩形窗                                      //
   //  flag整型变量标志位确定滤波器的类型                      //
   //    flag: 0:低通滤波器 1:高通滤波器                       //
   // 函数返回 0为正常返回;                                    //
   //     返回-1为异常返回:原因w>1                             //
   //     返回-2为异常返回:flag!=0 or 1                        //
   //////////////////////////////////////////////////////////////
 int fir1(float w,int n,float b[],int type,int flag)
 { int i;
   float alpha,m;

   if(w>=1||w<=0)
    { printf("\n W must be in the range of (0,1)!\n");
      return(-1);
      }
   alpha=n/2.0;
   if(flag==0)                                     //  LP FILTER
    for(i=0; i<=(n+1)/2; i++)
     { //m=pi*(i-alpha);
       //if(m==0) b[i]=w;
       //else     b[i]=sin(w*m)/m;
       m=pi*(i-alpha+1e-20);
       b[i]=sin(w*m)/m;
       }
   else if(flag==1)                                //  HP FILTER
         for(i=0; i<=(n+1)/2; i++)
           { //m=pi*(i-alpha);
             //if(m==0) b[i]=1-w;
             //else     b[i]=(sin(m)-sin(w*m))/m;
             m=pi*(i-alpha+1e-20);
             b[i]=(sin(m)-sin(w*m))/m;
             }
        else
           { printf("\n ERROR! Flag must be 0 or 1!EXIT!\n");
             return(-2);
             }
   alpha=pi/alpha;
   switch(type)
    { case 1 : for(i=0; i<=(n+1)/2; i++)
                  if(i<=n/2) b[i]*=i*alpha/pi;
                  else       b[i]*=2-i*alpha/pi;
               break;
      case 2 : for(i=0; i<=(n+1)/2; i++)
                  b[i]*=0.5*(1-cos(i*alpha));
               break;
      case 3 : for(i=0; i<=(n+1)/2; i++)
                  b[i]*=0.54-0.46*cos(i*alpha);
               break;
      case 4 : for(i=0; i<=(n+1)/2; i++)
                  b[i]*=0.42-0.50*cos(i*alpha)
                            +0.08*cos(2*i*alpha);
               break;
      default: {   };
      }
   for(i=(n+1)/2+1; i<=n; i++)
      b[i]=b[n-i];
   return(0);
   }

   void main( )
   { float b[M+1],w;
     int rtn,i;

     w=0.12;
     rtn=fir1(w,M,b,3,0);
     printf("\n\n");
     if(rtn==0)
      for(i=0; i<=M; i++)
       { printf("%.4f\t",b[i]);
         if((i+1)%6==0) printf("\n");
         }
       
     scanf("%f",&w);
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -