Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何使用vDSP函数进行短时傅里叶变换?_Iphone_Fft_Vdsp - Fatal编程技术网

Iphone 如何使用vDSP函数进行短时傅里叶变换?

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,请将

我试图了解如何为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,请将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);