2

我正在尝试分析声音文件(.m4a)以获取随时间变化的幅度并制作图表。我在网上找到了一些效果很好的代码(如下)。但是,我想另外过滤掉所有不在目标频率范围内的声音。例如,我只想绘制 1900-2100 Hz 之间的声音。我怎样才能做到这一点?

    var processingBuffer = [Float](repeating: 0.0, count: Int(readFile.arrayFloatValues.count))
    let sampleCount = vDSP_Length(readFile.arrayFloatValues.count)

    vDSP_vabs(readFile.arrayFloatValues, 1, &processingBuffer, 1, sampleCount);

    let samplesPerPixel = 1
    let filter = [Float](repeating: 1.0 / Float(samplesPerPixel), count: Int(samplesPerPixel))
    let downSampledLength = Int(readFile.arrayFloatValues.count / samplesPerPixel)
    var downSampledData = [Float](repeating:0.0, count:downSampledLength)

    vDSP_desamp(processingBuffer,
                vDSP_Stride(samplesPerPixel),
                filter, &downSampledData,
                vDSP_Length(downSampledLength),
                vDSP_Length(samplesPerPixel))

    readFile.points = downSampledData.map{CGFloat($0)}

编辑

录音实际上是在更早的时间从设备的麦克风录制的。在录制阶段应用过滤器是否更容易?

4

1 回答 1

2

一种可能的方法是将离散傅立叶变换应用于采样文件。傅立叶变换将音频数据从时域传输到频域。一旦您在频域中拥有该数据,您就可以简单地“切掉”您不希望拥有的频率,并对您减少的数据进行傅里叶逆变换,以便您再次在时域中拥有它并继续你提到的代码。看看https://github.com/christopherhelf/Swift-FFT-Example,它提供了如何处理快速傅里叶变换 (FFT) 的示例代码。希望这能给你一个方向。

于 2017-12-03T23:04:04.887 回答