我试着理解如何使用vDSP函数进行短时傅立叶变换。所以我使用苹果的expamles中的FFT代码,我可以得到前1024帧的FFT,但是我如何才能获得下一个1024 - 2047帧的FFT,依此类推,直到文件结束。(在本例中,我假设文件大小为int f= 10000)。
//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);发布于 2012-07-13 22:35:45
如果您只是想要对接下来的1024个元素进行快速傅立叶变换,那么将nOver2添加到A.realp和A.imagp中,然后执行另一个vDSP_fft_zripD和另一个vDSP_ztocD。您可能还想推进obtainedReal,否则新的结果将覆盖旧的结果。
请注意,更改A.realp和A.imagp会丢失起始地址,因此除非在更改A.realp和A.imagp之前重新计算起始地址或将其保存到其他位置,否则将无法释放此内存。
此外,10,000不是1024的整数倍,因此最后一部分不会有1024个元素,因此您需要找出一个替代方案,例如获取更多数据或用零填充数据。
您为A.realp和A.imagp分配的内存太多。它们中的每一个都接收缓冲区中一半的元素,所以每个都只需要一半的内存。
即使是这么大的内存也不需要。您可以使用vDSP_ctozD将1024个元素移动到A.realp和A.imagp中(每个元素512个),然后执行快速傅立叶变换,然后使用vDSP_ztocD将数据移动到obtainedReal,然后使用vDSP_ctozD将1024个新元素移动到A.realp和A.imagp中与以前使用的相同空间中的下一个组。
https://stackoverflow.com/questions/11466915
复制相似问题