首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用vDSP函数进行短时傅立叶变换?

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

Stack Overflow用户
提问于 2012-07-13 16:35:34
回答 1查看 1.3K关注 0票数 1

我试着理解如何使用vDSP函数进行短时傅立叶变换。所以我使用苹果的expamles中的FFT代码,我可以得到前1024帧的FFT,但是我如何才能获得下一个1024 - 2047帧的FFT,依此类推,直到文件结束。(在本例中,我假设文件大小为int f= 10000)。

代码语言:javascript
复制
//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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中与以前使用的相同空间中的下一个组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11466915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档