Хранить массив fftwf_plans? - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над программой SDR, и у меня есть очереди данных, поступающих от ключа RTL2832, другая очередь, ожидающая прохождения через FFTW (в другом потоке), другая очередь, ожидающая отображения в другом потоке.

Я использовал статический массив планов, но теперь я хочу переключиться на динамически распределенный.Как:

//fftwf_plan fftplan[NUMFFT];
fftwf_plan *fftplan; // dynamic version

Затем я делаю

fftplan = calloc(NUMFFT,sizeof(fftwf_plan));

И для заполнения массива я делаю:

fftplan[i] = fftwf_plan_dft_1d(fftsize,fftin[i],fftout[i],FFTW_FORWARD,FFTW_ESTIMATE);

Который теперь segfaults, когда он выполняется, и я 'я вроде не в курсе.Я понял часть FFT год назад или больше, я не в курсе этого.Работает со статическим массивом.Я плохо понимаю **, и теперь я пытаюсь заполнить динамический массив непрозрачными указателями.Я думаю, что это в основном вопрос C, а не FFT, но я не думаю, что смогу использовать ** здесь, так как он непрозрачный.

Мои данные находятся в 2d массивах, таких как

fftwf_complex *fftin[NUMFFT], *fftout[NUMFFT];

Итак, базовый демодем AM подобен

dpybuf[i] = sqrt(((fftout[lochead][i][0]) * (fftout[lochead][i][0])) + \
   ((fftout[lochead][i][1]) * (fftout[lochead][i][1])));

Может быть, мне не нужен отдельный план для каждого набора данных.lochead - это позиция в круговой очереди, i - отдельная точка, [0] или [1] в конце - действительная или мнимая часть.

-------------- edit------------

При выполнении SDR форма радиоволны оцифровываетсяделая 2 А / Ц преобразования на 90 градусов друг от друга.Они называются I и Q и рассматриваются как действительные и мнимые числа.Нет фактического квадратного корня из отрицательного числа.

ОК, еще немного кода, но все это пара тысяч строк в нескольких файлах.

fftwf_plan *fftplan; // dynamic version [global]
// I tried **fftplan above, it acts the same: compiles OK but segfaults

fftplan = calloc(NUMFFT,sizeof(fftwf_plan));
if (fftplan == NULL) {
  fprintf(stderr,"Failed to allocate fftplan[]\n");
  exit(1);
}

// fft init  (NUMFFT is set at 10, the # of batches in the queue.)
for (i=0;i<NUMFFT; i++) {
  fftin[i] = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) *  fftsize);
  if (fftin[i] == NULL) {
    printf("malloc() of space for fftin failed.\n");
    perror("malloc ");
    exit(1);
  }
  fftout[i] = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * fftsize);
  if (fftout[i] == NULL) {
    printf("malloc() of space for fftout failed.\n");
    perror("malloc ");
    fftwf_free(fftin);
    exit(1);
  } 
aplan = fftwf_plan_dft_1d(fftsize,fftin[i],fftout[i],FFTW_FORWARD,\
  FFTW_ESTIMATE);

printf("plan %i\n",i);  // announce progress
fflush(stdout);
    fftplan[i]  = aplan; // see where it segfaults [here, storing plan 0]

  }

fftwf - это одинарная точностьверсия FFTW с плавающей точкой.У меня только 8-битные сэмплы, поступающие от ключа, мне не нужны дубликаты.

fftsize - теперь мое разрешение экрана X, я пробегал здесь 4096 точек, сейчас 1024

...