• 3762阅读
  • 3回复

解决一个,又来一个,为什么AVG函数没有运行? [复制链接]

上一主题 下一主题
离线hsxk1115
 
只看楼主 正序阅读 楼主  发表于: 2009-05-23
清各位帮我看下,为什么槽函数
void Ddy1::show_ddy1()没有调用自定义的函数float AVG(comb *a,comb *b),好像AVG这个函数根本没有运行。各位能看出我哪里错了么?

代码如下:
#include "ddy1.h"


//
Ddy1::Ddy1( QWidget * parent)
    : QDialog(parent)
{
    setupUi(this);

    connect(ddy1_pushButton, SIGNAL( clicked() ),this,SLOT(show_ddy1() ) );


}


# include <stdlib.h>
# include <stdio.h>
# include <string.h>

# include <math.h>
# define suijixuliechangdu 4096            
# define M 4096              
# define P 36            
# define pi 3.1415926
# define umin 0.5  
typedef struct  {
                   float real;
                   float imag;
}comb;
void fft(comb *x,int m);
void ifft(comb *x,int m);
float numb;
comb *inverse(comb *a,comb *b,int n)
{  
    comb *huju;
    huju=b;
    int j;
    for(j=0;j<M;j++,b++,a++)
    {  
        (*b).real=(*a).real*cos(n*2*pi*umin*sin(pi/numb))+(*a).imag*sin(n*2*pi*umin*sin(pi/numb));
        (*b).imag=(*a).imag*cos(n*2*pi*umin*sin(pi/numb))-(*a).real*sin(n*2*pi*umin*sin(pi/numb));
    }
    return huju;

}
comb *expand(comb *a,comb *b)
{
    comb *huju,*hj;
    huju=a;
    hj=b;
    int i;
    for(i=0;i<M;i++,a++,b++)
    {
        (*b).real=(*a).real;
        (*b).imag=(*a).imag;
    }
    a--;
   for(i=M;i<2*M-1;i++,a--,b++)
    {
        (*b).real=(*a).real;
        (*b).imag=-(*a).imag;
    }
    return hj;
}

void  revers(comb *a,comb *A)      
{
    comb *temp1,*temp2;
    temp1=a;
    temp2=A;
    int i;
    fft(a,12);
    (*A).real=0;
    (*A).imag=0;
    a++;
    A++;
    
    for(i=1;i<M/2;i++,a++,A++)
    {
        (*A).real=(*a).imag;
        (*A).imag=-(*a).real;
    }
    (*A).real=0;
    (*A).imag=0;
    a++;
    A++;
    for(i=(M+2)/2;i<M;i++,a++,A++)
    {
        (*A).real=-(*a).imag;
        (*A).imag=(*a).real;
    }
    a=temp1;
    A=temp2;
    ifft(A,12);
    ifft(a,12);
}


void fft(comb *x,int m)                    
{
    static comb *w;
    static int mstore=0;
    static int n=1;

   comb u,temp,tm;
   comb *xi,*xip,*xj,*wptr;

   int i,j,k,l,le,windex;
   double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real;
   if(m!=mstore)
    {

          if(mstore!=0)
              free(w);
          mstore=m;
          if(m==0) return;

         n=1<<m;
         le=n/2;
/* allocate the storage for w */
            w=(comb *)calloc(le-1,sizeof(comb));
            if(! w)
            {
              printf("\nUnable to allocate comb w array\n");
              exit(1);
            }
/* calculate the w values recursively */
         arg=4.0*atan(1.0)/le;
         wrecur_real=w_real=cos(arg);
         wrecur_imag=w_imag=-sin(arg);
         xj=w;
         for(j=1;j<le;j++)
         {
          xj->real=(float)wrecur_real;
          xj->imag=(float)wrecur_imag;
          xj++;
          wtemp_real=wrecur_real*w_real-wrecur_imag*w_imag;
          wrecur_imag=wrecur_real*w_imag+wrecur_imag*w_real;
          wrecur_real=wtemp_real;
         }
    }
/* start fft */
    le=n;
    windex=1;
    for(l=0;l<m;l++)
    {
          le=le/2;
/* first iteration with no multiplies */
         for(i=0;i<n;i=i+2*le)
         {
              xi=x+i;
              xip=xi+le;
              temp.real=(xi->real+xip->real);
              temp.imag=(xi->imag+xip->imag);
              xip->real=(xi->real-xip->real);
              xip->imag=(xi->imag-xip->imag);
              *xi=temp;
         }
/* remaining iterations use stored w */
           wptr=w+windex-1;
           for(j=1;j<le;j++)
           {
                u=*wptr;
                for(i=j;i<n;i=i+2*le)
                {
                 xi=x+i;
                 xip=xi+le;
                 temp.real=(xi->real+xip->real);
                 temp.imag=(xi->imag+xip->imag);
                 tm.real=xi->real-xip->real;
                 tm.imag=xi->imag-xip->imag;
                 xip->real=(tm.real*u.real-tm.imag*u.imag);
                 xip->imag=(tm.real*u.imag+tm.imag*u.real);
                 *xi=temp;          
                }
                wptr=wptr+windex;
           }
           windex=2*windex;
         }
/* rearrang data by bit reversing */
       for(i=0;i<n;++i)
       {
           j=0;
           for(k=0;k<m;++k)
              j=(j<<1)|(1&(i>>k));
              if(i<j)
              {
                   xi=x+i;
                   xj=x+j;
                   temp=*xj;
                   *xj=*xi;
                   *xi=temp;
              }
       }
    }

void ifft(comb *x,int m)                                    //IFFT                  
{
   static comb *w;
   static int mstore=0;
   static int n=1;

   comb u,temp,tm;
   comb *xi,*xip,*xj,*wptr;

   int i,j,k,l,le,windex;
   float scale;
   double arg,w_real,w_imag,wrecur_real,wrecur_imag,wtemp_real;
   if(m!=mstore)
   {
/* free previously allocated storage and set new m */
          if(mstore!=0)free(w);
          mstore=m;
          if(m==0)return;      /* if m=0 then done */

/* n=2**m=fft length */
        n=1<<m;
        le=n/2;
/* allocate the storage for w */
         w=(comb*)calloc(le-1,sizeof(comb));
         if(!w)
         {
          printf("\nUnable to allocate comb w array\n");
          exit(1);    
         }
/* calculate the w values recursively */
         arg=4.0*atan(1.0)/le;
         wrecur_real=w_real=cos(arg);
         wrecur_imag=w_imag=sin(arg);
         xj=w;
         for(j=1;j<le;j++)
         {
          xj->real=(float)wrecur_real;
          xj->imag=(float)wrecur_imag;
          xj++;
          wtemp_real=wrecur_real*w_real-wrecur_imag*w_imag;
          wrecur_imag=wrecur_real*w_imag+wrecur_imag*w_real;
          wrecur_real=wtemp_real;
         }
   }
/* start ifft */
   le=n;
   windex=1;
   for(l=0;l<m;l++)
   {
    le=le/2;

/* first iteration with no multiplies */
         for(i=0;i<n;i=i+2*le)
         {
              xi=x+i;
              xip=xi+le;
              temp.real=(xi->real+xip->real);
              temp.imag=(xi->imag+xip->imag);
              xip->real=(xi->real-xip->real);
              xip->imag=(xi->imag-xip->imag);
              *xi=temp;
         }
/* remaining iterations use stored w */
           wptr=w+windex-1;
           for(j=1;j<le;j++)
           {
                u=*wptr;
                for(i=j;i<n;i=i+2*le)
                {
                 xi=x+i;
                 xip=xi+le;
                 temp.real=(xi->real+xip->real);
                 temp.imag=(xi->imag+xip->imag);
                 tm.real=xi->real-xip->real;
                 tm.imag=xi->imag-xip->imag;
                 xip->real=(tm.real*u.real-tm.imag*u.imag);
                 xip->imag=(tm.real*u.imag+tm.imag*u.real);
                 *xi=temp;          
                }
                wptr=wptr+windex;
           }
           windex=2*windex;
   }
/* rearrang data by bit reversing */
       for(i=0;i<n;++i)
       {
           j=0;
           for(k=0;k<m;++k)
              j=(j<<1)|(1&(i>>k));
              if(i<j)
              {
                   xi=x+i;
                   xj=x+j;
                   temp=*xj;
                   *xj=*xi;
                   *xi=temp;
              }
       }
/* scale all results by 1/n */
       scale=(float)(1.0/n);
       for(i=0;i<n;i++)
               {
                x.real=scale*x.real;
                x.imag=scale*x.imag;
               }
}
float AVG(comb *a,comb *b)  
{
    float sum=0,i;
    comb *temp1,*temp2;
    temp1=a;
    temp2=b;
    for(i=0;i<M;i++,a++,b++)
    {
        sum+=(*a).real*(*b).real;
    }
    a=temp1;
    b=temp2;
    return sum/M;
    printf("11111");
    printf("%f",sum/M);
    printf("\n");
    
}




void Ddy1::show_ddy1()
{
    float numb = this->numb_lineEdit->text().toFloat();
    float sigma = this->lineEdit_112->text().toFloat();
    printf("%f\n%f\n",numb,sigma);
    float AVG(comb *a,comb *b);
    
    
    int i;
    double x1[suijixuliechangdu],x2[suijixuliechangdu],y[suijixuliechangdu],z[suijixuliechangdu];




    for(i=0;i<suijixuliechangdu;i++)
    {
       x1=double(rand())/RAND_MAX;
       x2=double(rand())/RAND_MAX;
       y=sqrt(-2*log(x1))*sin(2*pi*x2);
       z=y*sigma;
       //printf("%f",z);
       //printf("\n");
     }
    comb a0[M],*pa0;                                       //
pa0=a0;
    for(i=0;i<suijixuliechangdu;i++)                          //ǰsuijixuliechangdu
离线hsxk1115
只看该作者 3楼 发表于: 2009-05-23
引用第2楼浪漫天使于2009-05-23 12:29发表的  :
void Ddy1::show_ddy1()
{
    float numb = this->numb_lineEdit->text().toFloat();
    float sigma = this->lineEdit_112->text().toFloat();
    printf("%fn%fn",numb,sigma);
.......

float AVG(comb *a,comb *b);这一句也可以去掉,我问的问题是好像AVG函数没有输出,不过AVG函数里有
printf("11111");
    printf("%f",sum/M);
    printf("\n");
这几句,应该在终端里面有输出才对把?
不知道应该怎么样调用,我不知很理解
附件: abc.tar.gz (107 K) 下载次数:2
离线浪漫天使
只看该作者 2楼 发表于: 2009-05-23
void Ddy1::show_ddy1()
{
    float numb = this->numb_lineEdit->text().toFloat();
    float sigma = this->lineEdit_112->text().toFloat();
    printf("%f\n%f\n",numb,sigma);
    float AVG(comb *a,comb *b);
    

有你这样调用 float AVG(comb *a,comb *b); 函数的么???
离线hsxk1115
只看该作者 1楼 发表于: 2009-05-23
程序中的FFT,IFFT函数都有运行,不知道为什么AVG函数不运行,原理应该是一样的把
快速回复
限100 字节
 
上一个 下一个