2017-11-01 77 views
0

マイクからのパワーレベルを表示するアプリケーションを作成するプロジェクトに取り組んでいます。私はAVAudioRecorderクラスに平均/ピーク電力を提供することを認識していますが、特定の帯域の電力レベルのみを記録できるようにしたいと考えています。 AudioUnitEQクラスを使用してバンドを設定し、AVAudioEngineにアタッチして録音を開始しました。現在、installTapメソッドを使用して、AVAudioPCMBufferを取得しています。これは、私が立ち往生した場所です。これを電力レベルに変換する方法はありますか?また、私のアプローチは完全に間違っているかもしれませんか?Swift AVAudioEngine AVAudioPCMBuffer to PowerLevel

答えて

0

このコードのようにavg/peekを取得できます。

engine.installTap(......) { buffer in 
    guard let data = buffer.floatChannelData?[0] else { 
     return 
    } 
    var dbData = [Float](repeating: 0.0, count: data.count) 
    var one: Float = 0.0 
    vDSP_vdbcon(&data, 1, &one, &dbData, 1, data.count, 1) 

    var avgLevel: Float = 0.0 
    var peakLevel: Float = 0.0 
    vDSP_rmsqv(dbData, 1, &avgLevel, vDSP_Length(buffer.frameLength)) 
    vDSP_maxmgv(dbData, 1, &peakLevel, vDSP_Length(buffer.frameLength)) 
} 
+0

私は現在、同様の設定をしていますが、私の問題は、返されるfloatChannelDataがFloatのUnsafeMutablePointerへのポインタだということです。 floatChannelDataにはメンバーが最初にないので、C APIの知識は非常に低く、guard letステートメントでエラーが発生します。もう少し詳しく教えていただけますか? –

+0

私の間違いです。サンプルコードのニーズは「最初」から「0」に変更する必要があります。私はサンプルコードを変更します。間違いを発見していただきありがとうございます。 :) – woosiki

関連する問題