1

我正在尝试使用 Apple 的 vDSP 在录制的音频文件上实现 FFT 计算(假设它是单声道 PCM)。

我在这里进行了研究,发现以下主题非常有用:

例如,我们为 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 个样本的帧(~ 12800 / 1024 = 13 帧),然后分别对每个帧执行 FFT,然后以某种方式将 13 个 FFT 结果平均化为结果频谱?如果假设正确,那么如何进行平均?

我真的很感激任何帮助。

4

2 回答 2

1

您不想对光谱进行平均,除非您有统计上的平稳信号。如果它是像语音或音乐这样的时变数据,那么您实际上拥有一个 3D 数据集:时间与频率与幅度,您可以将其绘制为频谱图瀑布图

另请注意,通常的做法是重叠连续的窗口,以在时间轴上获得更高的分辨率,因此您的第一个块可能是样本 0..1023,然后具有 50% 重叠的第二个块将是 512..1535,等等。

于 2013-11-07T09:59:03.963 回答
0

另一方面,如果您的信号静止的,并且混合了一定量的噪声,那么对多个 FFT 的幅度结果进行矢量平均将为您提供 Welch 方法,这可能会提高所得平均幅度谱的信噪比。

同样,如果信号是静止的,则使用偏移窗口的 F​​FT 箱之间的相位差可以与相位声码器算法一起使用,以细化频谱频率估计。如果信号在很短的时间间隔内是静止的,那么人们可能只想对适合这些间隔内的窗口执行此操作,可能是通过减少窗口偏移(增加重叠)。

因此,这取决于信号以及您希望从 FFT 中获得什么信息。

于 2013-11-07T20:57:42.163 回答