从.m4a数据过滤频率

时间:2017-12-03 22:50:19

标签: ios swift audio accelerate-framework avaudiofile

我试图分析声音文件(.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)}

修改

录音实际上是早些时候从设备的麦克风录制的。在录制阶段应用滤镜可能更容易吗?

1 个答案:

答案 0 :(得分:2)

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