打印
[DSP编程]

DSP编程的问题

[复制链接]
1271|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangch_sh|  楼主 | 2014-10-22 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我搞DSP编程遇到一个问题。
在程序中有一个函数:
void mdefir1(int l,int iband,float fl,float fh,float fs,int iwindow,
float b[],float w[],int *ierror)
{
/*----------------------------------------------------------------------
  Subroutine mdesfir: To Design FIR Filter By Windowed Fourier Series.
  fl:low cut-off frequency. fh:high cut-off(For BP,BS). fl,fh,fs in Hz
  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 must be 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.
   fln,fhn: the edge frequency desired,in normalized form,0.<=fln,fhn<=.5
          |---        |   ---       |   ---           |--      --
          |   |       |  |          |  |   |          |  |    |
          |   |       |  |          |  |   |          |  |    |
        --|------    -|--------    -|-----------    --|--------------
          0  fln      0  fln        0 fln  fhn        0  fln  fhn
             fhn=*       fhn=*
        iband=1 LP    iband=2 HP      iband=3 BP        iband=4 BS
  iwindow: window type desired.
           iwindow=1: rectangular window ,   =2: triangular window ,
                  =3: cosin window ,         =4: Hanning window ,
                  =5: Hamming window ,       =6: Blackman window ,
                  =7: Papoulis window .
        w: l dimensioned real work array.
  Output parameters:
   b: l dimensioned real array.the result is in b(0) to b(l-1).
   ierror: ierror=0:      no errors detected
                 =1:      invalid length  (l<=0)
                 =2:      invalid window type
                 =3:      invalid filter type
                 =4:      invalid cut-off frequency
                                      in Chapter 8
-----------------------------------------------------------------------*/
        float pi,fln,fhn,wc1,wc2,s;
        int lim,i;
        float dly;
        pi=4.*atan(1.);
        fln=fl/fs;
        fhn=fh/fs;
        for(i=0;i<l;i++) b=0.;
       *ierror=0;
            dly=l/2.;
        lim=l/2;
        if(dly==(float)lim) *ierror=1;
        if(iwindow<1||iwindow>7) *ierror=2;
        if(iband<1||iband>4) *ierror=3;
        if(fln<0.||fln>0.5) *ierror=4;
        if(iband>=3&&fln>=fhn) *ierror=4;
        if(iband>=3&&fhn>=0.5) *ierror=4;
        if(*ierror!=0) return;
        dly-=.5;
        lim-=1;
        wc1=2.*pi*fln;
        if(iband>=3) wc2=2.*pi*fhn;
        mwindow(w,l,iwindow,ierror);
        switch (iband)
            {
                /*Low pass */
                 case 1:
                       {
                         for(i=0;i<=lim;i++)
                            {
                             s=i-dly;
                             b=((sin(wc1*s))/(pi*s));
                             b=b*w;
                             b[l-1-i]=b;
                             }
                         b[(l-1)/2]=wc1/pi;
                         return;
                       }
                 /*High pass */
                 case 2:
                           {
                            for(i=0;i<=lim;i++)
                             {s=i-dly;
                              b=((sin(pi*s)-sin(wc1*s))/(pi*s));
                              b=b*w;
                              b[l-1-i]=b;
                              }
                             b[(l-1)/2]=1.-wc1/pi;
                             return;
                           }
                 /*band pass */
                 case 3:
                             {
                               for(i=0;i<=lim;i++)
                               {s=i-dly;
                                b=((sin(wc2*s)-sin(wc1*s))/(pi*s));
                                b=b*w;
                                b[l-1-i]=b;
                                }
                                b[(l-1)/2]=(wc2-wc1)/pi;
                                return;
                             }
                 /*band stop */
                 case 4:
                              {
                               for(i=0;i<=lim;i++)
                                     {s=i-dly;
                                      b=((sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s));
                                      b=b*w;
                                      b[l-1-i]=b;
                                      }
                                  b[(l-1)/2]=(wc1+pi-wc2)/pi;
                                  return;
                              }
                 default:break;
             }
}

主程序:
int main()
{
        int l=29;
    int iband=1;
    float fl=PI/4;
    float fh=PI/3;
    float fs=1000;
    int iwindow=5;
    float b[N];
    float w[N];
    int ierror;
    int i;
    float amp[N];
    float phase[N];
    //FILE *fp;
    complex x[N];
    for(i=0;i<N;i++)
    {
         x.real=0;
         x.imag=0;
    }


         //w=(sin((i-14)*PI/6)+sin((i-14))+sin())/
    mdefir1(l,iband,fl,fh,fs,iwindow,b,w,&ierror);
    mfirres(b,28,N,x);
    mampres(x,amp,N,100,0);   
        i=6;
        while(1);

}

这样就好使。
如果改成如下:
int main()
{
        int l=29;
    int iband=1;
    float fl=PI/4;
    float fh=PI/3;
    float fs=1000;
    int iwindow=5;
    float b[N];
    float w[N];
    int *ierror;
    int i;
    float amp[N];
    float phase[N];
    //FILE *fp;
    complex x[N];
    for(i=0;i<N;i++)
    {
         x.real=0;
         x.imag=0;
    }


         //w=(sin((i-14)*PI/6)+sin((i-14))+sin())/
    mdefir1(l,iband,fl,fh,fs,iwindow,b,w,ierror);
    mfirres(b,28,N,x);
    mampres(x,amp,N,100,0);   
        i=6;
        while(1);

}

红色的那个地方就运行不过去,出错。

相关帖子

沙发
wangch_sh|  楼主 | 2014-10-22 09:49 | 只看该作者
再详细说明一下。
就是函数void mdefir1(int l,int iband,float fl,float fh,float fs,int iwindow,
float b[],float w[],int *ierror)
有一个参数:int *ierror
我在调用时,如果定义int *ierror;
调用时mdefir1(l,iband,fl,fh,fs,iwindow,b,w,ierror);
这样写,红色的哪行代码*ierror=0;就卡在那儿,过不去。
如果定义成int ierror;
调用时mdefir1(l,iband,fl,fh,fs,iwindow,b,w,&ierror);
就没问题。
我搞不懂,请高手解惑。谢谢!

使用特权

评论回复
板凳
wangch_sh|  楼主 | 2014-10-22 14:05 | 只看该作者
高手支招啊!

使用特权

评论回复
地板
aresc| | 2014-10-22 20:23 | 只看该作者
本帖最后由 aresc 于 2014-10-22 21:11 编辑

不行的那个ierror只是个指针变量,你要让它指到一个整形变量上,类似这种:

int p;
int *ierror = &p;

否则你那个指针没有赋值,就执行非法写操作了。


使用特权

评论回复
5
wangch_sh|  楼主 | 2014-10-23 08:19 | 只看该作者
谢谢!
不过应该是这样:
int p;
int *ierror;
ierror = &p;

使用特权

评论回复
6
NWPU_CHEN| | 2014-10-23 09:45 | 只看该作者
这应该属于一个指针与内存的问题,指针定义完后,如没有赋给给定可访问的内存地址,那它的地址是随机的,也就是你的ierror所指向地址是随机的,极可能碰到该地址指向内存不能访问(没权利访问),当你子函数赋值的时候会出现不能赋值不能访问这地址的尴尬,程序死到那了,而定义成整形变量后这个变量所在内存区域一定是可以访问的,所以你的&ierror没一点问题,所以用之前一定要给定一个可访问的地址,楼上那位说的也对

使用特权

评论回复
7
wangch_sh|  楼主 | 2014-10-23 10:39 | 只看该作者
谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝