Я использую AVAudioEngine для касания данных микрофона с частотой дискретизации 8k и хотел бы выполнить некоторую обработку сигнала с помощью буфера дискретизированного PCM (AVAudioPCMBuffer). Существуют ли какие-либо рамки, которые поддерживают повышающую дискретизацию звука (8k -> 16k) во время выполнения?
То есть в audioRecor:
let inputNode = audioEngine.inputNode
let inputFormat = inputNode.outputFormat(forBus: 0)
let recordingFormat = AVAudioFormat(commonFormat: .pcmFormatInt16,
sampleRate: 8000.0,
channels: 1,
interleaved: true)
let formatConverter = AVAudioConverter(from:inputFormat, to: recordingFormat!)
audioEngine.inputNode.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize),format: inputFormat) { (buffer, time) in self.conversionQueue.async {
let pcmBuffer = AVAudioPCMBuffer(pcmFormat: recordingFormat!, frameCapacity: AVAudioFrameCount(recordingFormat!.sampleRate * 2.0))
let inputBlock: AVAudioConverterInputBlock = {
inNumPackets, outStatus in outStatus.pointee = AVAudioConverterInputStatus.haveData
return buffer
}
formatConverter.convert(to: pcmBuffer!, error: &error, withInputFrom: inputBlock)
let channelData = pcmBuffer!.int16ChannelData {
let channelDataValue = channelData.pointee
let channelDataValueArray = stride(from: 0,
to: Int(pcmBuffer!.frameLength),
by: buffer.stride).map{ channelDataValue[$0] }
self.delegate?.didOutput(channelData: channelDataValueArray)
}
}}
audioEngine.prepare()
audioEngine.start()
и в didOutput
guard let handler = dataHandler else {
return
}
self.run(onBuffer: Array(channelData[0..<handler.sampleRate]))
self.run(onBuffer: Array(channelData[handler.sampleRate..<bufferSize]))
который в функции запуска
func run (onBuffer buffer: [Int16]) {
let floatBufferData = buffer.map { Float($0) / 32767.0 }
// here I would like to upsample the input floatBufferData to 16k
}
Любая поддержка или руководство приветствуются.