2013-05-07 5 views
1

2 차원 배열의 푸리에 변환이 필요한 프로젝트에서 작업 중입니다.iPhone Accelerate Framework 2 차원 배열을 변환하는 FFT

그러나 FFT 또는 특히 vDSP 전문가는 아닙니다.

나는 here, here 또는 here의 예제를 보았지만 그것들은 1D 어레이 용이거나 이해할 수 없다.

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]; 
    } 
} 

답변

3

VDSP를 사용하려면, 당신은 실제 두 차원 배열을 사용해야합니다

은 내가 trasform하고자하는 것은 다음과 같이 내가 구축이이 배열입니다. 표시하는 코드는 배열에 대한 포인터의 배열을 만듭니다.이 배열은 2 차원 배열이 아닙니다. vDSP에서는 배열의 열이 일정한 간격을두고 있어야 함을 요구합니다.

실수 - 복소수 FFT를 수행하려고합니다. 여러 가지 이유로 실제 입력 데이터를 짝수 열 인덱스가있는 요소와 홀수 열 인덱스가있는 요소에 대해 두 개의 배열로 다시 포맷해야합니다. 이것은 vDSP_ctoz 호출이 연결된 데모 코드에서 수행하는 작업이지만 vDSP_ctozD를 배정 밀도로 사용합니다. 이중 정밀도가 필요하지 않은 경우 float을 사용하십시오. FFT 루틴 및 기타 대량 작업에서 훨씬 빠릅니다.

vDSP로 FFT를 수행하기 전에 vDSP_create_fftsetupD를 호출하여 설정 개체를 가져와야합니다 데모 코드에 나와 있습니다. FFT를 수행하려면 vDSP_fft2d_zripD를 호출합니다. 설치 개체는 vDPS_destroy_fftsetupD를 호출하여 해제됩니다.

작성 및 삭제 호출은 비용이 많이 소요되므로 거의 수행하지 않아야합니다. 프로그램 초기에 설정을 작성하고 FFT 호출과 함께 반복적으로 사용하여 사용해야합니다.

vDSP_fft2d_zripD에서 반환하는 데이터는 비정상적인 형식으로되어 있으므로 이에 대한 자세한 내용은 this documentation을 참조해야합니다.

+0

@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]'에서 사용할 수 있기 때문입니다. –

+0

사실, 제 문제는 적어도 vDSP 샘플에서 2d 어레이를 사용하는 방식이 일반적인 배열 [x] [y]가 아니라 대신 1d 어레이 인 것 같습니다 : https : // developer (신호 * (r * C + c) * 스트라이드) = 체크섬을 확인하십시오. /apple.com/library/mac/ # samplecode/vDSPExamples/Listings/DemonstrateFFT2D_c.html # // apple_ref/doc/uid/DTS10004300-DemonstrateFFT2D_c-DontLinkElementID_7 = "부분) – dwbrito

+1

@dwbrito :이 경우에는 하나의 보폭을 사용하고 무시할 수 있습니다. 그런 다음 인덱싱은'Signal [r * C + c]'입니다. 이것은'S [r] [c]'와 같습니다. 'S'는 cast (float (*) [C]) 신호와 같이 2 차원으로 변환 된 1 차원 배열입니다. 이 변환은 Apple 컴파일러를 사용하는 Apple 시스템에서 안전합니다. 또는 1 차원 배열을 유지하면서 그림과 같이 인덱스 산술을 명시 적으로 사용할 수 있습니다. (스트라이드는 일부 요소 만 사용하여 행렬 또는 다운 샘플링 단일 행을 가로 지르는 목적을 가지고 있습니다. 대부분 실제 배열에 대해 하나의 스트라이드를 사용해야합니다.) –