Iphone 如何使用vDSP函数进行短时傅里叶变换?
我试图了解如何为STFT使用vDSP函数。所以我使用苹果expamles的FFT代码,我可以得到前1024帧的FFT,但是我怎么能得到接下来1024-2047帧的FFT,以此类推,直到文件结束。。(在本例中,我假设文件的大小为int f=10000)Iphone 如何使用vDSP函数进行短时傅里叶变换?,iphone,fft,vdsp,Iphone,Fft,Vdsp,我试图了解如何为STFT使用vDSP函数。所以我使用苹果expamles的FFT代码,我可以得到前1024帧的FFT,但是我怎么能得到接下来1024-2047帧的FFT,以此类推,直到文件结束。。(在本例中,我假设文件的大小为int f=10000) //vDSP变量 双_复合_分裂A; FFT设置实体; uint32_t log2n; uint32,11月2日; int32_t stride; 双*获得真实; 双尺度; log2n=N; n=1如果只需要对接下来的1024个元素进行FFT,请将
//vDSP变量
双_复合_分裂A;
FFT设置实体;
uint32_t log2n;
uint32,11月2日;
int32_t stride;
双*获得真实;
双尺度;
log2n=N;
n=1如果只需要对接下来的1024个元素进行FFT,请将nOver2添加到A.realp和A.imagp,然后执行另一个vDSP_FFT_zripD和另一个vDSP_ztocD。您可能也希望提前获得Real,否则新结果将覆盖旧结果
请注意,更改A.realp和A.imagp会丢失起始地址,因此除非在更改A.realp和A.imagp之前重新计算起始地址或将其保存在其他位置,否则无法释放此内存
此外,10000不是1024的整数倍,因此最后一部分将没有1024个元素,因此您需要找出一个替代方案,例如获取更多数据或用零填充数据
为A.realp和A.imagp分配的内存太多。它们中的每一个都接收缓冲区中一半的元素,所以它们只需要一半的内存
即使是这么多的内存也不需要。您可以使用vDSP_ctozD将1024个元素移动到A.realp和A.imagp中(每个512个),然后执行FFT,然后使用vDSP_ztocD将数据移动到AcquiredReal,然后通过使用vDSP_ctozD将1024个新元素移动到之前使用的A.realp和A.imagp中的相同空间,继续移动到下一个组。如果只需要对接下来的1024个元素进行FFT,请将nOver2添加到A.realp和A.imagp,然后执行另一个vDSP_FFT_zripD和另一个vDSP_ztocD。您可能也希望提前获得Real,否则新结果将覆盖旧结果
请注意,更改A.realp和A.imagp会丢失起始地址,因此除非在更改A.realp和A.imagp之前重新计算起始地址或将其保存在其他位置,否则无法释放此内存
此外,10000不是1024的整数倍,因此最后一部分将没有1024个元素,因此您需要找出一个替代方案,例如获取更多数据或用零填充数据
为A.realp和A.imagp分配的内存太多。它们中的每一个都接收缓冲区中一半的元素,所以它们只需要一半的内存
即使是这么多的内存也不需要。您可以使用vDSP_ctozD将1024个元素移动到A.realp和A.imagp中(每个512个),然后执行FFT,然后使用vDSP_ztocD将数据移动到获取的real,然后使用vDSP_ctozD将1024个新元素移动到以前使用过的A.realp和A.imagp中的相同空间中,从而移动到下一组。谢谢!如何将nOver2添加到A.realp和A.imagp。你能用代码显示这个吗?:-)<代码>A.realp+=nOver2;A.imagp+=nOver2代码>谢谢!如何将nOver2添加到A.realp和A.imagp。你能用代码显示这个吗?:-)<代码>A.realp+=nOver2;A.imagp+=nOver2代码>
//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);