| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 850 人关注过本帖
标题:用C语言编写的计算一个很长序列和一个短序列的线性卷积,采样重叠保留法,为 ...
取消只看楼主 加入收藏
feier102878
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-10-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
用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);

}
搜索更多相关主题的帖子: double C语言 
2011-10-19 09:46
feier102878
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-10-19
收藏
得分:0 
我自己顶,顶,顶!
2011-10-22 15:10
快速回复:用C语言编写的计算一个很长序列和一个短序列的线性卷积,采样重叠保留 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016880 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved