fftpack库的学习

fftpack库,使用的是pffft库中下载的,不需要额外配置,只需要fftpack.h和fftpack.c两个文件即可。使用也比较简单,有实数fft和复数fft两种。

1、复数例子

/复数fft

void cfft_test()

{

    int N = 16;

    int Nfloat = 2 * N;

    int Nbytes = Nfloat * sizeof(fftpack_real);

    fftpack_real *wrk   = (fftpack_real*)malloc(2 * Nbytes + 15 * sizeof(fftpack_real));

    fftpack_real *refin = (fftpack_real*)malloc(Nbytes);





    printf("==================\ncomplex orgin data:\n");

    for (int k = 0; k < Nfloat; k += 2) {

         refin[k] = k*0.5f;

         refin[k + 1] = 0 * k*0.5f;

         printf("%d %f %f\n", k / 2, refin[k], refin[k + 1]);

    }

    cffti(N, wrk);

    cfftf(N, refin, wrk);



    printf("==================\nfft:\n");

    for (int i = 0; i < 2 * N; i += 2)

         printf("%d  %f  %f\n", i / 2, refin[i], refin[i + 1]);

    printf("======================\nifft:\n");

    cfftb(N, refin, wrk);

    for (int i = 0; i < 2 * N; i += 2)

         printf("%d  %f  %f\n", i / 2, refin[i] / N, refin[i + 1] / N);

    free(wrk);

    free(refin);

}

2、实数例子

//实数fft

void rfft_test()

{

    int N = 16;

    int Nfloat = N;

    int Nbytes = Nfloat * sizeof(fftpack_real);

    fftpack_real *wrk    = (fftpack_real*)malloc(2 * Nbytes + 15 * sizeof(fftpack_real));

    fftpack_real *refin  = (fftpack_real*)malloc(Nbytes);

    fftpack_real *refinr = (fftpack_real*)malloc(2 * Nbytes);



    printf("==================\nreal orgin data:\n");

    for (int k = 0; k < Nfloat; k++) {

       refin[k] = k*1.0f;

       printf("%d %f \n", k, refin[k]);

    }

    rffti(N, wrk);

    rfftf(N, refin, wrk);



    printf("==================\nfft:\n");

    {

       refinr[0] = refin[0];

       refinr[1] = 0;

       refinr[Nfloat + 1] = 0;

       for (int i = 2; i <= Nfloat; i++)

       {

           refinr[i] = refin[i - 1];

       }

       for (int i = Nfloat + 2; i <= 2 * Nfloat - 1; i++)

       {

           if (i % 2)

              refinr[i] = -refinr[2 * Nfloat - i + 2];

           else

              refinr[i] = refinr[2 * Nfloat - i];

       }

    }





    for (int i = 0; i < 2 * Nfloat; i += 2)

       printf("%d  %f   %f\n", i / 2, refinr[i], refinr[i + 1]);

    printf("======================\nifft:\n");

    rfftb(N, refin, wrk);

    for (int i = 0; i < Nfloat; i++)

       printf("%d  %f \n", i / 2, refin[i] / N);



    free(wrk);

    free(refin);

    free(refinr);

}

3、分析

  1. 与matlab结果比对一致,运算速度还可以。
  2. 支持double和float。
  3. 使用简单。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值