切换到宽版
  • 1185阅读
  • 0回复

利用FFT进行快速卷积c程序例子 [复制链接]

上一主题 下一主题
离线baobiao007
 
发帖
29
财富
1
威望
0
交易币
0
只看楼主 倒序阅读 使用道具 0楼 发表于: 2011-02-13 | 石油求职招聘就上: 阿果石油英才网
— 本帖被 阿果 从 石油地质 移动到本区(2011-09-29) —
/*当序列长度>=128时,这种方法就比普通线性卷积速度快*/
#include<stdio.h>
#include<stdlib.h>
#include"FFT.h"
const int L1=4;
const int L2=5;
//普通线性卷积
void conv(float x[],int m,float y[],int n,float z[],int l)
{
    int i,j;
    for(i=0; i<l; i++)
    {
           z=0.0;
           for(j=0; j<n; j++)
                  if(i-j>=0&&i-j<=m-1)
        z+=y[j]*x[i-j];
    }
}
void main()
{
    int i, L;
    L=L1+L2-1;//保证L为2的幂次
    float x[L1]={1,1,1,1};
    float y[L2]={1,1,1,1,1};
    float *z1, *z2;
    z1=(float *)calloc(L,sizeof(float));
    z2=(float *)calloc(L,sizeof(float));

    //直接线性卷积
    conv(x,L1,y,L2,z1,L);

    //利用FFT
    //1.填充序列长度到L
    float *x1, *y1;
    float *xi, *yi, *zi;
    x1=(float *)calloc(L,sizeof(float));
    y1=(float *)calloc(L,sizeof(float));
                    xi=(float *)calloc(L,sizeof(float));
    yi=(float *)calloc(L,sizeof(float));
    zi=(float *)calloc(L,sizeof(float));
    for(i=0; i<L1; i++)
          x1=x;
    for(i=0; i<L2; i++)
          y1=y;
    //2.进行傅里叶正变换
    fft(x1,xi,3,1);
    fft(y1,yi,3,1);
    //3.频谱相乘
    for(i=0; i<L; i++)
    {
        z2=x1*y1-xi*yi;
        zi=x1*yi+xi*y1;
    }
    //4.傅里叶反变换
    fft(z2,zi,3,-1);

    //输出结果
    printf("普通线性卷积:        快速卷积:\n");
    for(i=0; i<L; i++)
          printf("z1[%d]=%f        z2[%d]=%f\n",i,z1,i,z2);

    free(z1);free(z2);free(x1);free(y1);
    free(xi);free(yi);free(zi);
}
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

网站事务咨询:QQ:1392013 | 26189883
阿果石油网为免费个人网站,为石油人提供免费的在线即时技术交流场所,拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论和行为!
如有言论或会员共享的资料涉及到您的权益,请立即通知网站管理员,本站将在第一时间给予配合处理,谢谢!