2015-03-27 1 views
1

Я реализую алгоритм Goertzel в быстрой iOS. Я нашел код для подключения микрофона, но я не совсем уверен, как он работает.Быстрая обработка звука в реальном времени iOS с микрофоном

Для функции Герцеля Я написал функцию, где данные образец, который должен быть обеспечен

GoertzelAlgo(sampleRate:Float, targetFreq:Float, data:[Double]) -> Double 

Я хочу, чтобы вызвать эту функцию GoertzelAlgo для каждого образца, заполненный данными микрофона в режиме реального времени, но как делает installtapOnBus работы Я не совсем уверен? Я не уверен, что код внутри installTapOnBus даже выполняется.

let audioEngine = AVAudioEngine() 

    let inputNode = audioEngine.inputNode 
    let sampleCount = 2048 
    let bus = 0 
    var samplesAsDoubles = Array(count: Int(sampleCount), repeatedValue: CDouble()) 
    let frameLength = UInt32(sampleCount) // This seems to be ignored when passed into the AudioTap, therefore reassign within block. 
    inputNode.installTapOnBus(0, bufferSize:frameLength, format: inputNode.inputFormatForBus(bus), block: { (
     buffer: AVAudioPCMBuffer!, 
     audioTime : AVAudioTime!) in 

     // Change incomming buffer size 
     buffer.frameLength = UInt32(sampleCount) 

     // Populate array with incomming audio samples 
     for var i = 0; i < Int(buffer.frameLength); i++ 
     { 
      samplesAsDoubles[i] = Double(buffer.floatChannelData.memory[i]) 

     } 
     //Probably the Groeztel function needs to be called from somewhere here 
    }) 
+0

Вы начали, посмотрев документацию? Есть ли определенная его часть, о которой вы неясны? https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioNode_Class/index.html – clearlight

+0

Я просмотрел документацию и даже приведенные выше компиляции кода, но я не понимаю, как образцыAsDoubles будут заполняться каждый раз. Мне нужно вызвать функцию Groetzel, как только samplesAsDoubles полностью заполняется данными микрофона. Я новичок в разработке iOS –

+0

Что касается другой документации, которая содержит обзор и примеры использования? Такие, как ... https://developer.apple.com/library/ios/documentation/MusicAudio/Conceptual/CoreAudioOverview/CoreAudioEssentials/CoreAudioEssentials.html – clearlight

ответ

0

Одним общим решением является использование блокировки свободной FIFOs (или циклических буферов) для связи между 2 или 3 необходимых нитей (в режиме реального времени входа резьбы, анализ резьбы, а также частоту кадров дисплея резьбы). Ваш кран шины AVAudioEngine реализует только первый из этих двух или трех процессов.

Поместите данные, полученные в асинхронном входном блоке, в буфер FIFO или круговой буфер (не время делать больше), а затем проверьте, есть ли там какие-либо данные в другом потоке.

Вы не можете определить, выполняется ли даже запуск кода внутри installTapOnBus без проверки в буфере из другого потока, например, из обратного вызова таймера, выполняемого в главном цикле пользовательского интерфейса.