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

📄 mdefir2.c

📁 几十个数字信号处理中的经典例程!!涵盖数字信号处理的大部分内容。
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "msp.h"
void mdefir2(int l,int iband,float fl,float fh,complex b[],
float trans,float fs,int *ierror)
{
/*---------------------------------------------------------------------
  Fl:low cut-off frequency. Fh:high cut-off(For BP,BS). fl,fh,fs in Hz
          |---        |   ---      |   ---           |--      --
          |   |       |  |         |  |   |          |  |    |
          |   |       |  |         |  |   |          |  |    |
        --|------    -|--------   -|-----------    --|--------------
          0   fl      0  fl       0   fl  fh       0    fl   fh

   Digital filter coefficients are returned in b(l)
                h(z)=b(0)+b(1)z^(-1)+ ... +b(l-1)z^(-l+1)
  Input parameters:
   l    : the length of FIR filter. l<201 and l must be the odd.
   iband:  iband=1 low  pass FIR filter.
           iband=2 high pass FIR filter.
           iband=3 band pass FIR filter.
           iband=4 band stop FIR filter.
   trans:   0<= trans <1.0 , it is the transition point.
  Output parameters:
   b: l dimensioned real array.the result is in b(0) to b(l-1).

                                       in Chapter 8
---------------------------------------------------------------------*/
        complex h[201];
        complex z;
        int i,lim,nlow,nhigh;
        float pi,fln,fhn,dly,band,s;
        pi=4.*atan(1.);
        fln=fl/fs;
        fhn=fh/fs;
        for(i=0;i<l;i++)
           {h[i].real=0.;
            h[i].imag=0.0;
            }
        *ierror=0;
        dly=(float)l/2.;
        lim=l/2;
        if(dly==(float)lim)
           *ierror=1;
        if(l>=201)
           *ierror=2;
        if(iband==4)
            band=(fhn-fln)*l;
        if(iband==4&&band<4.)
        {
            printf("  Please increse the length L for Band-Stop Filter\n");
            *ierror=3;
        }
        if(iband<1||iband>4)
           *ierror=4;
        if(fln<=0.||fln>0.5)
           *ierror=5;
        if(iband>=3&&fln>=fhn)
           *ierror=6;
        if(trans<0.0&&trans>=1.)
           *ierror=7;
        if(*ierror!=0)
           return;
        s=-(l-1)*pi/l;
        switch(iband)
              {case 1:
                  {
                    nlow=1;
                    nhigh=fln*l-1;
                    h[0].real=1.0;h[0].imag=0.0;
                    for(i=nlow;i<=nhigh;i++)
                       {
                        z.real=0.0;
                        z.imag=s*i;
                        z=cexp(z);
                        h[i].real=z.real;
                        h[i].imag=z.imag;
                        h[l-i].real=h[i].real;
                        h[l-i].imag=-h[i].imag;
                        }
                    z.real=0.0;
                    z.imag=s*(nhigh+1);
                    z=cexp(z);
                    h[nhigh+1].real=trans*z.real;
                    h[nhigh+1].imag=trans*z.imag;
                    h[l-nhigh-1].real=h[nhigh+1].real;
		    h[l-nhigh-1].imag=-h[nhigh+1].imag;
		    break;
                  }
               case 2:
                       {
                       h[0].real=0.0;
                        h[0].imag=0.0;
                        nlow=fln*l;
                        nhigh=lim;
                        for(i=nlow;i<=nhigh;i++)
                           {z.real=0.0;
                            z.imag=s*i;
                            z=cexp(z);
                            h[i].real=z.real;
                            h[i].imag=z.imag;
                            h[l-i].real=h[i].real;
                            h[l-i].imag=-h[i].imag;
                            }
                        z.real=0.0;
                        z.imag=s*(nlow-1);
                        z=cexp(z);
                        h[nlow-1].real=trans*z.real;
                        h[nlow-1].imag=trans*z.imag;
                        h[l-nlow+1].real=h[nlow-1].real;
			h[l-nlow+1].imag=-h[nlow-1].imag;
			break;
                       }
               case 3:
                       {
                        nlow=fln*l;
                        nhigh=fhn*l;
                        h[0].real=0.0;h[0].imag=0.0;
                        for(i=nlow;i<=nhigh;i++)
                           {z.real=0.0;z.imag=s*i;
                            z=cexp(z);
                            h[i].real=z.real;
                            h[i].imag=z.imag;
                            h[l-i].real=h[i].real;
                            h[l-i].imag=-h[i].imag;
                            }
                        z.real=0.0;
                        z.imag=s*(nhigh+1);
                        z=cexp(z);
                        h[nhigh+1].real=trans*z.real;
                        h[nhigh+1].imag=trans*z.imag;
                        h[l-nhigh-1].real=h[nhigh+1].real;
                        h[l-nhigh-1].imag=-h[nhigh+1].imag;
                        z.real=0.0;
                        z.imag=s*(nlow-1);
                        z=cexp(z);
                        h[nlow-1].real=trans*z.real;
                        h[nlow-1].imag=trans*z.imag;
                        h[l-nlow+1].real=h[nlow-1].real;
			h[l-nlow+1].imag=-h[nlow-1].imag;
			break;
                       }
               case 4:
                  {
                    nlow=1;
                    nhigh=fln*l-1;
                    h[0].real=1.0;h[0].imag=0.0;
                    for(i=nlow;i<=nhigh;i++)
                       {z.real=0.0;
                        z.imag=s*i;
                        z=cexp(z);
                        h[i].real=z.real;
                        h[i].imag=z.imag;
                        h[l-i].real=h[i].real;
                        h[l-i].imag=-h[i].imag;
                        }
                    z.real=0.0;
                    z.imag=s*(nhigh+1);
                    z=cexp(z);
                    h[nhigh+1].real=trans*z.real;
                    h[nhigh+1].imag=trans*z.imag;
                    h[l-nhigh-1].real=h[nhigh+1].real;
                    h[l-nhigh-1].imag=-h[nhigh+1].imag;
                    nlow=fhn*l;
                     nhigh=lim;
                    for(i=nlow;i<=nhigh;i++)
                       {z.real=0.0;
                        z.imag=s*i;
                        z=cexp(z);
                        h[i].real=z.real;
                        h[i].imag=z.imag;
                        h[l-i].real=h[i].real;
                        h[l-i].imag=-h[i].imag;
                        }
                    z.real=0.0;
                    z.imag=s*(nlow-1);
                    z=cexp(z);
                    h[nlow-1].real=trans*z.real;
                    h[nlow-1].imag=trans*z.imag;
                    h[l-nlow+1].real=h[nlow-1].real;
		    h[l-nlow+1].imag=-h[nlow-1].imag;
		    break;
                }
       }
  mcmpdft(h,b,l,1);
 }

⌨️ 快捷键说明

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