作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试分析一个声音文件 (.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/
我是一名优秀的程序员,十分优秀!