加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数字滤波器的频率响应

(2013-05-03 11:05:13)
分类: DSP
   http://s9/mw690/864ca0b6gdbc7a6057c08&690

代码实现:
    b  ---  长度为(m+1),存放滤波器分子多项式的系数b(i)
    a  ---  长度为(n+1),存放滤波器分母多项式的系数a(i)
    m  ---  滤波器分子多项式的阶数
    n  ---  滤波器分母多项式的阶数
    x  ---  长度为len, sign=0时,存放滤波器频响的实部,sign=1时,存放滤波器频响|H(w)|;当sign=2时,存放分贝表示的滤波器幅频响应|H(w)|
    y  ---  长度为len, sign=0时,存放滤波器频响的虚部,sign=1和2时,存放滤波器的相频响应。
    len---  频率响应的长度
    sign--- 整型变量 
void gain(double *b,double *a,int m,int n,double *x,double *y,int len,int sign)
{
  int i,k;
  double ar,ai,br,bi,zr,zi,im,re,den,numr,numi,freq,temp;
  for(k=0;k
  {
    freq = k*0.5/(len-1);
    zr = cos(-8.0*atan(1)*freq);
    zi = sin(-8.0*atan(1)*freq);
    br = 0.0;
    bi = 0.0;
    for(i=m;i>0;i--)   //caculate the b(0)+b(1)e^(-jw)+....+b(M)e^(-jMw)
    {
        re = br;
        im = bi;
        br = (re+b[i])*zr-im*zi;
        bi = (re+b[i])*zi+im*zr;
    }
    ar = 0.0;
    ai = 0.0;
   for(i=n;i>0;i--)//caculate the 1+a(1)e^(-jw)+....+a(N)e^(-jNw)
   {
       re = ar;
       im = ai;
       ar = (re+a[i])*zr-im*zi;
       ai = (re+a[i])*zi+im*zr;
   }
   br = br+b[0];
   ar = ar+1.0;
   //(br+i*bi)*(ar-i*ai)
   numr = ar*br+ai*bi;
   numi = ar*bi-ai*br;
   den = ar*ar+ai*ai;   //(ar+i*ai)*(ar-i*ai)
        
   x[k] = numr/den;
   y[k] = numi/den;
  switch(sign)
  {
    case 1:
    {
        temp = sqrt(x[k]*x[k]+y[k]*y[k]);
        y[k] = atan2(y[k],x[k]);
        x[k] = temp;
        break;
    }
    case 2:
    {
       temp = sqrt(x[k]*x[k]+y[k]*y[k]);
       y[k] = atan2(y[k],x[k]);
       x[k] = 10.0*log10(temp);
       break;
    }
    default:
               ;
  }

 }
}

void main()
{
int i;
double a[]={1.0,0.0,0.9},b[]={0.0,-0.1};
double f,x[300],y[300];
FILE *fp;
gain(b,a,1,2,x,y,300,1);
if((fp=fopen("gainam.dat","w"))== NULL)
{
printf("cannot open file 'gainam.dat'!\n");
exit(0);
}
for(i=0;i<300;i++)
{
f = i*0.5/299;
fprintf(fp,"%lf  %lf\n",f,x[i]);
}
fclose(fp);
if((fp=fopen("fainph.dat","w"))==NULL)
{
printf("cannot open file 'gainph.dat'!\n");
exit(0);
}
for(i=0;i<300;i++)
{
        f = i*0.5/299;
fprintf(fp,"%lf   %lf\n",f,y[i]);
}
fclose(fp);

}
需要主要是,无论是幅频响应还是相频响应,它们的变量都是频率,代码中我们采用的是归一化的频率(0,0.5)之间,根据分辨率进行细分。实际频率可以不进行归一化。频率响应包括了幅频响应和相频响应,在具体分析时,往往需要分析幅频响应和相频响应。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有