1

我正在做一个需要二维数组傅里叶变换的项目。

但是,我远不是 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];
  }
}
4

1 回答 1

3

要使用 vDSP,您需要使用实际的二维数组。您显示的代码创建了一个指向数组的指针数组,它不是二维数组。(它由来自不同分配的片段组成,并且可能有不规则的间距。vDSP 要求数组的列有规则的间距。)

您可能想要执行从实数到复数的 FFT。由于各种原因,这需要将实际输入数据重新格式化为两个数组,一个用于具有偶数列索引的元素,一个用于具有奇数列索引的元素。这就是您链接到的演示代码中的 vDSP_ctoz 调用所做的,但您可以使用 vDSP_ctozD 来实现双精度。(如果您不需要双精度,请使用float。在 FFT 例程和其他大容量工作中会大大加快速度。)

在使用 vDSP 执行 FFT 之前,您必须通过调用 vDSP_create_fftsetupD 获取设置对象,如演示代码中所示。要执行 FFT,请调用 vDSP_fft2d_zripD。通过调用 vDPS_destroy_fftsetupD 释放设置对象。

create 和 destroy 调用很昂贵,应该很少执行。应该通过在程序早期创建设置并在 FFT 调用中反复使用它们来使用它们。

vDSP_fft2d_zripD 返回的数据以不寻常​​的格式打包,您需要参考此文档以获取有关信息。

于 2013-05-08T19:05:46.880 回答