iPhone Accelerate Framework FFT 转换二维数组

Posted

技术标签:

【中文标题】iPhone Accelerate Framework FFT 转换二维数组【英文标题】:iPhone Accelerate Framework FFT to convert a two-dimensional array 【发布时间】:2013-05-07 22:19:59 【问题描述】:

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

但是,我远不是 FFT 或特别是 vDSP 方面的专家。

我见过一些例子 here、here 或 here,但它们要么用于一维数组,要么我不太理解。

我希望转换的是我构建的这个数组,如下所示:

 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 要求数组的列有规则的间距。)

您可能想要执行从实数到复数的 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 返回的数据以不寻常​​的格式打包,您需要参考this documentation 了解相关信息。

【讨论】:

@dwbrito:Objective-C 没有与 C 相同的正式规范,但据说它是 C 的超集,并且 C 支持变长数组已有一段时间了。例如,使用 Apple clang 4.0 编译以下代码时不会出错:void foo(int a, int b) float x[a][b]; float (*y)[a][b] = malloc(sizeof *y); float (*z)[b] = malloc(a * sizeof *z); 。您可能会发现第三种选择是最方便的,因为它比自动对象更适合大型数组(由于堆栈大小限制),并且可以使用简单的语法 z[i][j] 其实我的问题是,至少在 vDSP 样本中,他们使用二维数组的方式不是通常的数组[x][y],而是看起来是一维数组:developer.apple.com/library/mac/#samplecode/vDSPExamples/…(检查“信号[(r*C + c)*步幅] =部分) @dwbrito:在这种情况下,您可以使用 1 的步幅并忽略它。那么索引是Signal[r*C + c]。这相当于S[r][c],其中S 是转换为二维的一维数组,与转换(float (*)[C]) Signal 一样。这种转换在使用 Apple 编译器的 Apple 系统上是安全的。或者您可以如图所示显式使用索引算法,保持一维数组。 (Strides 的目的是通过仅使用它们的一些元素来遍历矩阵列或对单个元素进行下采样。大多数情况下,对于实际数组,您应该使用 1 的步幅。)

以上是关于iPhone Accelerate Framework FFT 转换二维数组的主要内容,如果未能解决你的问题,请参考以下文章

是否有计算 Accelerate Framework for iPhone 中点数组的线性回归的函数? [关闭]

<Accelerate/Accelerate.h> 在设备上构建时找不到

如何将 Accelerate Framework 与 Core Graphics 一起使用?

iphone上的加速框架

使用 Accelerate 进行并行编程 (Data.Array.Accelerate)

如何以编程方式检测音符和和弦(在 iPhone SDK 中)?