我正在开发一个需要对2D阵列进行傅里叶变换的项目。
然而,我远不是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];
}
}
答案 0 :(得分: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返回的数据以不寻常的格式打包,您需要参考this documentation获取相关信息。