我試圖瞭解如何使用STFT的vDSP函數。所以我使用蘋果expamles的FFT代碼,我可以得到前1024幀的FFT,但我怎麼能得到接下來的1024 - 2047幀的FFT等等,直到文件結尾..(在這種情況下,我想象文件的大小是int f = 10000)。如何使用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);
謝謝!如何將nOver2添加到A.realp和A.imagp。你可以在代碼中顯示這個嗎? :-) – andrey 2012-07-13 19:39:49
'A.realp + = nOver2; A.imagp + = nOver2;' – 2012-07-13 19:40:46
非常感謝! – andrey 2012-07-13 20:00:04