iPhone Accelerate Framework FFT для преобразования двумерного массива

Я работаю над проектом, который требует преобразования Фурье 2D-массива.

Тем не менее, я далёк от того, чтобы быть экспертом как в FFT, так и в частности в vDSP.

Я видел несколько примеров здесь, здесь или здесь, но они либо для одномерных массивов, либо я не совсем понимаю их.

То, что я хочу трансформировать, это массив, который я строю следующим образом:

 if (!_double2DArray) {
  _double2DArray = (double**) malloc([traces count]*sizeof(double*));
}

for (NSInteger i=0; i<[traces count]; i++) {
  Trace *trace = [traces objectAtIndex:i];
  _double2DArray[i] = (double*) malloc(length*sizeof(double));

  NSMutableArray *traceAxis = [trace getTraceAxis:axis];
  for (NSInteger j=0; j<[[trace traceLength] integerValue]; j++) {
    _double2DArray[i][j] = [[traceAxis objectAtIndex:j] doubleValue];
  }
}

1 ответ

Решение

Чтобы использовать vDSP, вам нужно использовать реальные двумерные массивы. Код, который вы показываете, создает массив указателей на массивы, который не является двумерным массивом. (Он состоит из частей из отдельных распределений и может иметь нерегулярный интервал. VDSP требует, чтобы столбцы массивов располагались регулярно.)

Скорее всего, вы хотите выполнить БПФ от реального к сложному. По разным причинам это требует переформатирования реальных входных данных в два массива, один для элементов с четными индексами столбцов и один для элементов с нечетными индексами столбцов. Это то, что делает вызов vDSP_ctoz в демонстрационном коде, на который вы ссылаетесь, но вы бы использовали vDSP_ctozD для двойной точности. (Если вам не нужна двойная точность, используйте float, Это будет значительно быстрее в процедурах FFT и других объемных работах.)

Прежде чем выполнять FFT с vDSP, вы должны получить объект установки, вызвав vDSP_create_fftsetupD, как показано в демонстрационном коде. Чтобы выполнить БПФ, вы вызываете vDSP_fft2d_zripD. Объект установки освобождается путем вызова vDPS_destroy_fftsetupD.

Создание и уничтожение вызовов являются дорогостоящими и должны выполняться редко. Их следует использовать, создавая настройку на ранней стадии вашей программы и используя ее повторно с вызовами FFT.

Данные, возвращаемые vDSP_fft2d_zripD, упакованы в необычном формате, и вам нужно будет обратиться к этой документации для получения информации об этом.

Другие вопросы по тегам