- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试从 AVAudioPCMBuffer
生成频谱图在 swift 。我在 AVAudioMixerNode
上安装了水龙头并接收带有音频缓冲区的回调。我想将缓冲区中的信号转换为 [Float:Float]
字典,其中键代表频率,值代表相应频率上的音频幅度。
我尝试使用 Apple 的 Accelerate 框架,但我得到的结果似乎很可疑。我确定这只是我转换信号的方式。
我看了this blog post除其他外,供引用。
这是我的:
self.audioEngine.mainMixerNode.installTapOnBus(0, bufferSize: 1024, format: nil, block: { buffer, when in
let bufferSize: Int = Int(buffer.frameLength)
// Set up the transform
let log2n = UInt(round(log2(Double(bufferSize))))
let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))
// Create the complex split value to hold the output of the transform
var realp = [Float](count: bufferSize/2, repeatedValue: 0)
var imagp = [Float](count: bufferSize/2, repeatedValue: 0)
var output = DSPSplitComplex(realp: &realp, imagp: &imagp)
// Now I need to convert the signal from the buffer to complex value, this is what I'm struggling to grasp.
// The complexValue should be UnsafePointer<DSPComplex>. How do I generate it from the buffer's floatChannelData?
vDSP_ctoz(complexValue, 2, &output, 1, UInt(bufferSize / 2))
// Do the fast Fournier forward transform
vDSP_fft_zrip(fftSetup, &output, 1, log2n, Int32(FFT_FORWARD))
// Convert the complex output to magnitude
var fft = [Float](count:Int(bufferSize / 2), repeatedValue:0.0)
vDSP_zvmags(&output, 1, &fft, 1, vDSP_length(bufferSize / 2))
// Release the setup
vDSP_destroy_fftsetup(fftsetup)
// TODO: Convert fft to [Float:Float] dictionary of frequency vs magnitude. How?
})
buffer.floatChannelData
至 UnsafePointer<DSPComplex>
传递给 vDSP_ctoz
功能?有没有不同/更好的方法来做到这一点甚至可能绕过 vDSP_ctoz
?fft
中的索引阵列到以赫兹为单位的频率?感谢大家的建议。我最终按照接受的答案中的建议填充了复杂数组。当我绘制这些值并在音叉上播放 440 Hz 的音调时,它会准确地记录在应有的位置。
这是填充数组的代码:
var channelSamples: [[DSPComplex]] = []
for var i=0; i<channelCount; ++i {
channelSamples.append([])
let firstSample = buffer.format.interleaved ? i : i*bufferSize
for var j=firstSample; j<bufferSize; j+=buffer.stride*2 {
channelSamples[i].append(DSPComplex(real: buffer.floatChannelData.memory[j], imag: buffer.floatChannelData.memory[j+buffer.stride]))
}
}
channelSamples
然后数组为每个 channel 保存单独的样本数组。
为了计算震级,我使用了这个:
var spectrum = [Float]()
for var i=0; i<bufferSize/2; ++i {
let imag = out.imagp[i]
let real = out.realp[i]
let magnitude = sqrt(pow(real,2)+pow(imag,2))
spectrum.append(magnitude)
}
最佳答案
关于ios - AVAudioPCMBuffer 的频谱图在 Swift 中使用 Accelerate 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32891012/
我正在尝试将确定的 AVAudioPCMBuffer(44.1khz、1ch、float32、未交错)转换为另一个 AVAudioPCMBuffer(16khz、1ch、int16、未交错)使用AVA
以下代码适用于我所有设备(iPhone、Apple Watch、模拟器)上持续时间较短的音频文件: let file = try! AVAudioFile(用于阅读:url!) let format
我正在使用 installTap(onBus:bufferSize:format) 使用 AVEngine 录制音频。这会生成我积累的 AVAudioPCMBuffers。当我完成录音时,我想将它们连
我已经实现了 installTap 方法,它为我提供了音频缓冲区浮点示例。我已经通过我的 C++ DSP 库过滤了它们。我想将此缓冲区“发送”到耳机/扬声器。我从示例中再次执行了 AVAudioPCM
我正在为 iOS 应用创建这个简单的录音机和编辑器界面: 音频被记录到用于创建波形的 float 组中。录制后,我将 float 数据复制到 AVAudioPCMBuffer 中,以便与 AVAudi
我对信号处理几乎一无所知,目前我正在尝试在 Swift 中实现一个函数,当 sound pressure level 增加时触发一个事件。 (例如,当人尖叫时)。 我正在使用这样的回调进入 AVAud
是否可以将缓冲区中的数据提取为数组?我已将音频文件保存到缓冲区中,现在想提取数据。代码是: import UIKit import AVFoundation //importing audio let
我正在从麦克风录制音频并将该音频流式传输到另一台设备。目前,即使用户没有说话,此音频也会通过流发送。但我注意到很多流媒体服务在检测到来自麦克风的噪音很小时实际上并没有发送你的麦克风输入。 所以我想问,
我正在尝试在 Swift 中以编程方式填充 AVAudioPCMBuffer 以构建节拍器。这是我尝试构建的第一个真正的应用程序,所以它也是我的第一个音频应用程序。现在我正在尝试使用不同的框架和方法来
我无法使用 AVAudioPCMBuffer 播放声音(尽管我可以使用 AVAudioFile 播放)。我收到了这个错误。 错误:AVAudioBuffer.mm:169: -[AVAudioPCMB
我目前正在尝试转换 AVAudioPCMBuffer 中的音频样本至NSData - 我已经查看了关于此的已接受答案SO Post还有这个code from GitHub但似乎有一些AVFAudio
与 iOS 10 一起,Apple 发布了一个识别语音的新框架。可以通过附加 AVAudioPCMBuffers 或为 m4a 提供 URL 将数据传递到此框架。目前,语音识别使用前者进行工作,但这只
我们正在开发一个记录和保留麦克风输入的应用程序。 AVAudioRecorder 的使用不是一个选项,因为需要实时音频处理。 AVAudioEngine 之所以被使用是因为它提供了对输入音频的低级访问
我有这个代码: func loadSoundfont(_ pitch : String) { let path: String = Bundle.main.path(forResource:
我一直在致力于一个项目,以创建一个显示麦克风功率级别的应用程序。我知道 AVAudioRecorder 类提供平均/峰值功率,但我希望只能记录某些频段的功率级别。我使用 AudioUnitEQ 类来设
我正在尝试从 PCMBuffer 播放音频。当我运行下面的代码时,由于某种原因,没有音频播放。我没有收到任何错误。 let engine = AVAudioEngine() let player =
我在 swift 中有一个数据对象,它是一个 Int16 对象数组。出于某种原因,使用“.pcmFormatInt16”对我的 AVAudioPCMBuffer 格式不起作用并且没有产生声音或内存错误
我正在尝试从 AVCaptureAudioDataOutputSampleBufferDelegate 的 captureOutput 返回的 CMSampleBuffer 中读取频率值。 我的想法是
我正在尝试获取 AVAudioPCMBuffer 的时间长度,但我似乎做不到。我尝试执行以下操作: func getLength(buffer: AVAudioPCMBuffer) -> TimeIn
我遇到了 AVAudioConverter 的问题.我正在尝试转换 AVAudioPCMBuffers至 AAC . 这是我用于转换的函数,取自“What's new in Core Audio” s
我是一名优秀的程序员,十分优秀!