Как повысить частоту дискретизации аудиоданных PCM в IOS swift? - PullRequest
0 голосов
/ 03 августа 2020

Я использую 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 

}

Любая поддержка или руководство приветствуются.

...