【问题标题】:Accelerate framework vDSP, FFT framing加速框架 vDSP、FFT 成帧
【发布时间】:2013-11-18 21:13:45
【问题描述】:

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

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

例如,我们配置 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 平均结果生成频谱?如果假设正确,那么如何进行平均?

非常感谢任何帮助。

【问题讨论】:

    标签: signal-processing fft core-audio accelerate-framework vdsp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 2012-12-16
        • 2017-09-03
        相关资源
        最近更新 更多