0
#include <stdio.h>
#include <Windows.h>
#include <string.h>
#include <stdlib.h>
#include "fftw3.h"


int main(void)
{
    FILE *fp;

    int rozmiar_pliku;
    char standard[5] = {0};
    char format[5] = {0};
    int samplerate;

    int k,i;

    fftw_complex in[128];
    fftw_complex out[128];
    fftw_plan p;


    fp = fopen("Kalimba.wav","rb" );

    //printf("%d\n",fp);

    if (fp)
    {
        fread(standard,1,4,fp);
        printf("%s\n",standard);
        printf("RIFF\n");
        if (!strcmp(standard,"RIFF" ))
        {

            fread(&rozmiar_pliku,4,1,fp);

            printf("size: %d\n", rozmiar_pliku);
        }

        fread(format,1,4,fp);

        printf("format: %s\n",format);

        fseek(fp,24,SEEK_SET);

        fread(&samplerate,1,4,fp);

        printf("sample rate: %d\n",samplerate);


        fseek(fp,44,SEEK_SET);


        for(i=0;i<128;++i)
        {
            in[i][0]=getc(fp);
            in[i][1]=in[i][0];

        }


/*
        p = fftw_plan_dft_1d(128, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

        fftw_execute(p);


        for(int j=0;j<128;++j)
            printf("%lf+i*%lf",out[j][0],out[j][1]);

        fftw_destroy_plan(p);
        fftw_free(in);
        fftw_free(out);
*/
    }

    return 0;
}

我正在尝试使用 FFTW3 读取波形文件并执行 FFT。如果我取消注释已注释的部分,则屏幕上不会显示任何内容。如果我留下评论:

RIFF
RIFF
size: 61392422
format: WAVE
sample rate: 44100

如果未注释,则不会出现任何内容。我不知道为什么会这样。任何使用 fftw3 都会导致这种情况。

4

2 回答 2

0

in并且out是静态声明的数组。尝试传递 &in[0] 和 &out[0] 以匹配fftw_plan_dft_1d.

于 2013-02-17T16:42:08.267 回答
0

正如文档中建议的那样,您应该声明inout使用fftw_malloc.

您可以以任何您喜欢的方式分配它们,但我们建议使用 fftw_malloc

然后,您需要in在创建计划后进行初始化。

您必须在初始化 input 之前创建计划,因为 FFTW_MEASURE 会覆盖输入/输出数组。(从技术上讲,FFTW_ESTIMATE 不会触及您的阵列,但您应该始终首先创建计划以确保。)

其他一些修改的结果是

#include <stdio.h>
#include <stdlib.h>
#include "fftw3.h"

int main(void)
{
  FILE *fp;

  int rozmiar_pliku;
  char standard[5] = {0};
  char format[5] = {0};
  int samplerate;

  int i;

  fftw_complex *in, *out;
  fftw_plan p;

  fp = fopen("audioFile1.wav","rb" );
  if (fp)
  {
    fread(standard,1,4,fp);
    printf("%s\n",standard);
    printf("RIFF\n");
    if (!strcmp(standard,"RIFF" ))
    {
      fread(&rozmiar_pliku,4,1,fp);
      printf("size: %d\n", rozmiar_pliku);
    }
    fread(format,1,4,fp);
    printf("format: %s\n",format);
    fseek(fp,24,SEEK_SET);
    fread(&samplerate,1,4,fp);
    printf("sample rate: %d\n",samplerate);
    fseek(fp,44,SEEK_SET);

    // Allocate in and out buffers using fftw_alloc
    in  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 128);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * 128);

    // Create plan before initializing in
    p = fftw_plan_dft_1d(128, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

    // Initialize in after creating plan
    for(i=0;i<128;++i)
    {
      in[i][0]=getc(fp);
      in[i][1]=in[i][0];
    }

    fftw_execute(p);

    for(int j=0;j<128;++j)
      printf("%lf+i*%lf\n",out[j][0],out[j][1]);

    fftw_destroy_plan(p);
    fftw_free(in); fftw_free(out);
  }

  return 0;
}
于 2018-12-20T13:17:28.683 回答