用C语言编写的计算一个很长序列和一个短序列的线性卷积,采样重叠保留法,为什么运行出来的结果不对???
void convols(double x[],double h[],int len,int m,int n){
extern void FFT_IFFT_Cal (double * in_r, double * in_i, double * out_r, double * out_i, int len, int FFT_IFFT_flag);
int i,j,i1,num,nblks;
double *r,*s;
double *i_in,*out_hr,*out_hi,*out_xr,*out_xi,*o_r,*o_i;
i_in=malloc(n*sizeof(double));
o_r=malloc(n*sizeof(double));
o_i=malloc(n*sizeof(double));
out_hr=malloc(n*sizeof(double));
out_hi=malloc(n*sizeof(double));
out_xr=malloc(n*sizeof(double));
out_xi=malloc(n*sizeof(double));
r=malloc(n*sizeof(double));
s=malloc((n-m+1)*sizeof(double));
num=n-m+1;
nblks=(int)floor((len-n+m)/num)+1;
for(i=0;i<n;i++)
{
i_in[i]=0.0;
}
for(i=m;i<n;i++)
{
h[i]=0.0;
}
FFT_IFFT_Cal (h, i_in,out_hr, out_hi, n, 0);
for(j=0;j<nblks;j++)
{
if(j==0)
{
for(i=0;i<(m-1);i++)
{
r[i]=0.0;
}
for(i=(m-1);i<n;i++)
{
i1=i-m+1;
r[i]=x[i1];
}
}
else
{
for(i=0;i<n;i++)
{
i1=i+j*num-m+1;
r[i]=x[i1];
}
for(i=0;i<num;i++)
{
i1=i+(j-1)*num;
x[i1]=s[i];
}
}
FFT_IFFT_Cal (r, i_in,out_xr, out_xi, n, 0);
for(i=0;i<n;i++)
{
o_r[i]=out_hr[i]*out_xr[i]-out_hi[i]*out_xi[i];
o_i[i]=out_hr[i]*out_xi[i]+out_hi[i]*out_xr[i];
}
FFT_IFFT_Cal (o_r, o_i,r, i_in, n, 1);
for(i=(m-1);i<n;i++)
{
i1=i-m+1;
s[i1]=r[i];
}
}
for(i=0;i<num;i++)
{
i1=i+(j-1)*num;
x[i1]=s[i];
}
i1=j*num;
for(i=i1;i<len;i++)
{
x[i]=0.0;
}
free(r);
free(s);
free(i_in);
free(o_r);
free(o_i);
free(out_hr);
free(out_hi);
free(out_xr);
free(out_xi);
}