8

ここに私の問題があります:

  1. オーディオ データをリアルタイムで分析して、信号の振幅を調べる必要があります。
  2. ピーク検出の遅延が大きすぎるため、AudioQueue メータリング機能を使用できません
  3. 私はaurioTouchの例を研究しました.....しかし...

PCM コード化バッファがオシロスコープ ビューに表示される波形に変換される方法がわかりません。振幅を分析したいのは、まさにこの波動です。

バッファを分析するときの私のコールバックでは、NSLog(@"%d") を使用すると、バッファには 0 と -1 しかありません。これはPCMなので当然だと思います。

0 / -1 ストリームを波形に変換する魔法が発生する aurioTouch の場所を見つけることができません :-((

また、波形をメモリに保存したら、振幅を分析し、この読み取り値を dB に変換する方法を教えてください。

私は周波数に興味がなく、他の方法があることを願っているので、FFT を使用したくありません。

乾杯

マット

4

2 に答える 2

10

メモリに波形のチャンクがあれば、振幅値を dB 単位で計算するのはかなり簡単です (ただし、0 dB の参照振幅を決定する必要があります)。通常、VU メーターに表示される短期的なマグニチュードが必要な場合は、波形の瞬時値を修正し (これには abs を使用できます)、これらの修正値を単純なローパス フィルターに渡す必要があります。約 100 ミリ秒の時定数を持ちます。値を dB に変換するには、次のようにします。

amplitude_dB = 20 * log10(amplitude) + calibration_dB;

ここで、振幅は整流およびフィルタリングされた振幅であり、calibration_dB は、特定のアプリケーションに関係なく、0 dB の正しい振幅を提供するためのオフセットです (たとえば、dB re フルスケール、または校正された dBV または dBm 値)。

シンプルだが効果的なローパス フィルターは、次のように実装できます。これは、単極 IIR (再帰) フィルターになります。各出力は、前の出力値と現在の入力値に依存します。このローパス フィルタの時定数またはカットオフ周波数を効果的に決定する定数係数アルファがあります。

y = alpha * x + (1.0 - alpha) * y_old;
y_old = y;
  • x = 現在の入力値
  • y = 新しい出力値
  • y_old = 前の出力値
  • alpha = フィルタの応答を決定する定数 - 小さな正の数 - 0.001 から始めて実験してみてください
于 2010-01-30T15:07:13.937 に答える
1

AurioTouch は、注目すべき適切な例です。残念ながら、コードはひどいものです。RemoteIO オーディオ ユニットの操作の背後にある概念を理解するためにのみ使用してください。

波形の実際の描画は、PCM データが利用可能になったときに CoreAudio によって呼び出される renderProc コールバックで行われます。aurioTouchAppDelegate.mm:197... の PerformThru() を見てください...さらに下の 237 行目

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);

...実際の PCM データにアクセスする場所です。これは、信号のピーク/平均パワーを取得するために分析する必要があるデータです。

于 2010-01-30T10:31:16.613 に答える