gpt4 book ai didi

ios - iOS vDSP 的 FFT 不对称

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:58 25 4
gpt4 key购买 nike

我正在使用 Apple 的 vDSP API 来计算音频的 FFT。但是,根据我对实际输入的 FFT 的理解,我的结果(在 amp[] 中)不是围绕 N/2 对称的,而它们应该是对称的?

在下面的 frame 中是一个包含音频样本的 float 组 [128]。

        int numSamples = 128;
vDSP_Length log2n = log2f(numSamples);
FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
int nOver2 = numSamples/2;

COMPLEX_SPLIT A;
A.realp = (float *) malloc(nOver2*sizeof(float));
A.imagp = (float *) malloc(nOver2*sizeof(float));

vDSP_ctoz((COMPLEX*)frame, 2, &A, 1, nOver2);

//Perform FFT using fftSetup and A
//Results are returned in A
vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD);

//Convert COMPLEX_SPLIT A result to float array to be returned
float amp[numSamples];
amp[0] = A.realp[0]/(numSamples*2);
for(int i=1;i<numSamples;i++) {
amp[i]=A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i];
printf("%f ",amp[i]);
}

如果我将相同的 float 组放入在线 FFT 计算器中,我会得到一个对称的输出。我在上面做错了什么吗?

出于某种原因,amp[] 中的大多数值都在 0 到 1e-5 之间,但我也得到一个大约 1e23 的巨大值。我在这里没有做任何窗口,只是试图让基本的 FFT 开始工作。

我附上了两个 FFT 输出的图片,使用相同的数据。你可以看到它们在 64 位之前是相似的,尽管比例因子不是恒定的,所以我不确定它们有什么不同。然后超过64他们就完全不同了。

enter image description here

最佳答案

由于实数到复数 FFT 的数学输出是对称的,因此返回后半部分没有任何值(value)。在传递给 vDSP_fft_zrip 的数组中也没有空间。所以 vDSP_fft_zrip 只返回前半部分(特殊的 N/2 点除外,下面讨论)。通常不需要明确需要后半部分,如果需要,您可以从前半部分轻松计算。

vDSP_fft_zrip 的输出在用于前向(实数到复数)转换时具有 H0 输出(纯实数;其虚部为零) A.realp[0]。 HN/2 输出(也是纯实数)存储在 A.imagp[0] 中。对于 0 < i < N/2,其余值 Hi 通常存储在 A.realp[i]A.imagp[i].

对此进行解释的文档是 here ,在“真实 FFT 的数据打包”部分。

关于ios - iOS vDSP 的 FFT 不对称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com