-->

加快框架VDSP,FFT取景(Accelerate framework vDSP, FFT fram

2019-10-18 22:57发布

我试图执行FFT计算,使用苹果的VDSP,在录制的音频文件(假设它是一个单声道PCM)。

我已经在这里做了一个研究,我发现以下主题非常有用:

  • 使用苹果FFT和加速框架
  • 使用帧之间的相位变化从FFT单元中提取精确的频率
  • 有扩展音频文件服务读取音频(ExtAudioFileRead)

例如,我们配置FFT与frame_size N = 1024个样本,log2n = 10:

m_setupReal = vDSP_create_fftsetup(LOG_2N, FFT_RADIX2);

// allocate space for a hamming window
m_hammingWindow = (float *) malloc(sizeof(float) * N);

// generate the window values and store them in the hamming window buffer
vDSP_hamm_window(m_hammingWindow, N, vDSP_HANN_NORM);

某处的代码:

vDSP_vmul(dataFrame, 1, m_hammingWindow, 1, dataFrame, 1, N);

vDSP_ctoz((COMPLEX *)dataFrame, 2, &(m_splitComplex), 1, nOver2);

// Do real->complex forward FFT
vDSP_fft_zrip(m_setupReal, &(m_splitComplex), 1, LOG_2N, kFFTDirection_Forward);

什么我错过了现在,在我的FFT使用的理解,是如何得到一个大的音频文件的整个光谱,让我们假设总共12800个样本。


问:我需要原始数据分裂成多个帧大小为1024个样本(〜1024分之12800= 13帧),然后分别然后,以某种方式对每个帧进行FFT,平均13点的FFT结果到结果频谱? 如果这是正确的假设,那么如何执行平均?

我真的很感谢所有帮助。

Answer 1:

你不想平均光谱,除非你有一个统计平稳信号。 如果这件事情随时间变化的,如语音或音乐,那么你有效地拥有3D数据集:时间与频率与幅度,您可以绘制作为频谱或瀑布图 。

另请注意,这是常见的做法是重叠的连续窗口,在时间轴上获得更多的分辨率,因此你的第一个块可能是样品0..1023,然后用50%重叠第二块是512..1535等。



Answer 2:

在另一方面,如果信号静止的,并与噪音的一定量混合,然后矢量平均多个FFT的幅值结果会给你韦尔奇的方法,该方法可以改善信号到所得到的平均幅度谱的信噪比。

此外,再次如果信号是静止的,则使用的FFT区间之间相位的差异偏移窗口可以与相位声码器的算法被用于细化谱频率的估计。 如果信号是静止的时间间隔很短,那么人们可能会想只对符合这些区间内,可能是通过降低窗偏移量(增加重叠)窗口做到这一点。

因此,它取决于信号,并从该FFT的哪些信息。



文章来源: Accelerate framework vDSP, FFT framing