我正在尝试使用Apple的vDSP在录制的音频文件上实现FFT计算(让我们假设它是单声道PCM)。
我在这里做了一项研究,我发现以下主题非常有用:
例如,我们使用frame_size配置FFT 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结果生成频谱?如果这是正确的假设,那么如何进行平均?
我真的很感激任何帮助。
答案 0 :(得分:1)
除非您有统计上固定的信号,否则您不希望平均光谱。如果它是时间变化的,如语音或音乐,那么你有效地拥有一个3D数据集:时间与频率和幅度,你可以绘制为spectrogram或waterfall plot。
另请注意,通常的做法是重叠连续的窗口,以便在时间轴上获得更高的分辨率,因此第一个块可能是样本0..1023,然后第二个块重叠50%将是512..1535等等。
答案 1 :(得分:0)
另一方面,如果您的信号 静止,并且混有一些噪声,那么矢量平均多个FFT的幅度结果将为您提供Welch的方法,这可能会改善信号到得到的平均幅度谱的噪声比。
此外,如果信号是静止的,那么使用偏移窗口的FFT区间之间的相位差可以与相位声码器算法一起使用以改进频谱频率估计。如果信号在很短的时间间隔内是静止的,那么可能只想对那些适合这些间隔的窗口执行此操作,可能是通过减少窗口偏移(增加重叠)。
因此,它取决于信号,以及您希望从FFT中获得哪些信息。