ios - 从 .m4a 数据中过滤频率

标签 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)}

编辑

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

最佳答案

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

关于ios - 从 .m4a 数据中过滤频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47624197/

相关文章:

ios - 如何防止在 GCD 中释放对象?

ios - AVQueuePlayer 需要很多时间来播放第一首歌曲

ios - 如何将现有的 podfile 设置为兼容 CocoaPods 版本 0.39.x 和 1.0.0?

macos - swift 错误 "Immutable value only has mutating members"

swift - 找出 uibutton 内标题的颜色

audio - 如何在Inno Setup(返回+下一步+取消)中单击按钮时自定义单击声音?

python - 使用python在音频文件中的特定点插入WAV

ios - 如何使用 AirDrop 发送和接收自定义数据

ios - 选中时 TabView 崩溃

ios - Swift - 有一个音频重复,但它在间隔播放?