2012-07-13 2 views
0

STFT에 vDSP 기능을 사용하는 방법을 이해하려고합니다. 그래서 애플의 expamles에서 FFT 코드를 사용하고 처음 1024 프레임의 FFT를 얻을 수 있지만 어떻게 파일의 끝까지 다음 1024 - 2047 프레임 정도의 FFT를 얻을 수 있습니까? (이 경우 필자는 파일 크기를 상상합니다. int f = 10000). 당신은 단순히 다음 1024 개 요소의 FFT를 원하는 경우짧은 시간 푸리에 변환을 위해 vDSP 기능을 사용하려면 어떻게합니까?

//vDSP variables 
DOUBLE_COMPLEX_SPLIT A; 
FFTSetupD setupReal; 
uint32_t log2n; 
uint32_t n, nOver2; 
int32_t stride; 
double *obtainedReal; 
double scale; 

log2n = N; 
n = 1 << log2n; 

stride = 1; 
nOver2 = n/2; 

int f = 10000; 

buffer = malloc(f *sizeof(double)); 
obtainedReal = malloc(f *sizeof(double)); 
A.realp = malloc(f *sizeof(double)); 
A.imagp = malloc(f *sizeof(double)); 

vDSP_ctozD((DOUBLE_COMPLEX*) buffer, 2, &A, 1, nOver2); 
setupReal = vDSP_create_fftsetupD(log2n, FFT_RADIX2); 

if (setupReal == NULL) { 
    NSLog(@"fft_setup failed to allocate enough memory for real FFT\n"); 
return 0 ; 
    } 

vDSP_fft_zripD(setupReal, &A, stride, log2n, FFT_FORWARD); 

scale = (double) 1.0/(2 * n); 

vDSP_vsmulD(A.realp, 1, &scale, A.realp, 1, nOver2); 
     vDSP_vsmulD(A.imagp, 1, &scale, A.imagp, 1, nOver2); 

vDSP_ztocD(&A, 1, (DOUBLE_COMPLEX *) obtainedReal, 2, nOver2); 

답변

1

, nOver2이 A.realp 및 A.imagp에, 다음 다른 vDSP_fft_zripD 다른 vDSP_ztocD을 수행하기 위해 추가 할 수 있습니다. 당신은 아마도 사전 진출을 원할 것입니다. 또한 새로운 결과가 이전 결과를 덮어 씁니다.

A.realp 및 A.imagp를 변경하면 시작 주소가 손실되므로 A.realp 및 A.imagp를 변경하기 전에 시작 주소를 다시 계산하거나 다른 곳에 저장하지 않으면이 메모리를 비울 수 없습니다.

또한 10,000은 1024의 배수가 아니므로 마지막 부분에는 1024 개의 요소가 없으므로 더 많은 데이터를 가져 오거나 데이터를 0으로 채우는 것과 같은 대안을 찾아야합니다.

A.realp 및 A.imagp에 너무 많은 메모리를 할당하고 있습니다. 각각은 버퍼에있는 원소의 절반을 받는다. 그래서 각각의 원소는 단지 절반의 메모리 만 필요로한다.

심지어 많은 메모리가 필요하지 않습니다. vDSP_ctozD를 사용하면 1024 개의 요소를 A.realp 및 A.imagp (각각 512 개)로 이동 한 다음 FFT를 수행 한 다음 vDSP_ztocD를 사용하여 데이터를 obtainReal로 이동 한 다음 vDSP_ctozD를 사용하여 다음 그룹으로 이동하여 1024 개의 새 이전에 사용 된 A.realp와 A.imagp의 동일한 공간에 요소를 추가합니다.

+0

고맙습니다! A.Orp 및 A.imagp에 nOver2를 어떻게 추가 할 수 있습니까? 코드에서 이것을 보여 주실 수 있습니까? :-) – andrey

+0

'A.realp + = nOver2; A.imagp + = nOver2;' –

+0

대단히 고마워요! – andrey