2017-11-04 1 views
3

Ich baue eine App, die Mikrofoneingang verwendet, um Geräusche zu erkennen und Ereignisse auszulösen. Ich basierte meinen Code auf AKAmplitudeTap, aber als ich ihn ausführte, stellte ich fest, dass ich nur Beispieldaten für Intervalle mit fehlenden Abschnitten erhielt.AudioKit Tippen überspringt über Zeitintervalle

Der Hahn-Code sieht wie folgt aus (mit den Eingeweiden herausgerissen und einfach zu verfolgen, wie viele Proben verarbeitet worden wäre):

open class MyTap { 
// internal let bufferSize: UInt32 = 1_024 // 8-9 kSamples/sec 
    internal let bufferSize: UInt32 = 4096 // 39.6 kSamples/sec 
// internal let bufferSize: UInt32 = 16536 // 43.3 kSamples/sec 

public init(_ input: AKNode?) { 
    input?.avAudioNode.installTap(onBus: 0, bufferSize: bufferSize, format: nil) { buffer, _ in 

     sampleCount += self.bufferSize 

    } 
} 

ich initialisieren den Hahn mit:

func afterLoad() { 
    assert(!loaded) 
    AKSettings.audioInputEnabled = true 
    do { 
     try AKSettings.setSession(category: .playAndRecord, with: .allowBluetoothA2DP) 
    } catch { 
     print("Could not set session category.") 
    } 
    mic = AKMicrophone() 
    myTap = MyTap(mic) // seriously, can it be that easy? 

    loaded = true 
} 

Der ursprüngliche Abgriff-Code war Samples in einen Puffer zu erfassen, aber ich sah, dass große Teile der Zeit mit einer Puffergröße von 1024 fehlten. Ich vermutete, dass die Verarbeitungszeit für den Beispielpuffer übermäßig sein könnte, also ...

Ich vereinfachte den Code, um einfach zu verfolgen, wie viele Samples an den Tap übergeben wurden. In einem anderen Teil des Codes drucke ich einfach sampleCount/elapsedTime aus und, wie in den Kommentaren nach 'pufferSize' erwähnt, erhalte ich unterschiedliche Mengen an Samples pro Sekunde.

Die Abtastrate konvergiert bei 43.1 KSamples/s mit einem 16K Puffer und sammelt nur etwa 20% der Proben mit einem 1K Puffer. Ich würde es vorziehen, die kleine Puffergröße zu verwenden, um eine nahezu Echtzeit-Antwort auf erkannte Geräusche zu erhalten. Während ich dies schreibe, läuft die 4K-Pufferversion und hat sich bei 39678 Samples/Sek. Stabilisiert.

Fehle ich etwas? Kann ein Tap mit einer kleinen Puffergröße tatsächlich 44,1 KHz Sample-Daten erfassen?

+1

Sehr interessante, nachdenkliche Analyse und Frage, wird sich das genau ansehen müssen, da ich nicht denke, dass es eine einfache Antwort ist und da etwas falsch sein könnte, also danke, dass du es angesprochen hast. –

+0

Danke für die schnelle Antwort ... AudioKit ist erstaunlich. Ich vermutete, dass sich etwas im Rest meines APs schlecht verhielt, also schrieb ich einen sehr abgespeckten Testcode, der einfach ein Mikrofon erzeugte, den Tap hinzufügte und dann AudioKit startete. Gleiche Ergebnisse. : ( – Jay

+0

) Ein weiterer Punkt der Daten ... Ich habe den MicrophoneAnalysis-Beispielcode gehackt, um MyTap auf dem Mikrofon einzufügen. Dies verursachte einen sofortigen Absturz. Das Entfernen von AKFrequencyTracker aus der Kette löste den Fehler, aber das Problem fehlender Samples ist immer noch vorhanden. .. ein 1K Puffer erhält ca. 10K Samples pro Sekunde – Jay

Antwort

1

Problem gelöst ... erfordert der Hahn diese Codezeile

buffer.frameLength = self.bufferSize 

... und plötzlich alle Proben erscheinen. Ich habe offensichtlich ein bisschen zu viel Code aus dem Code entfernt, den ich offensichtlich nicht verstanden habe.