5

私は iPad 用のアプリに取り組んでおり、再生中のビデオからオーディオを分析したいと考えています。MTAudioProcessingTap を使用すると、これはすべてうまくいきます。現在、左右のチャンネルの音量をテスト/測定するためのテストコードがあります。これはすべてうまくいっています:

void process(MTAudioProcessingTapRef tap, CMItemCount numberFrames,
         MTAudioProcessingTapFlags flags, AudioBufferList *bufferListInOut,
         CMItemCount *numberFramesOut, MTAudioProcessingTapFlags *flagsOut)
{
    OSStatus err = MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut,
                                                  flagsOut, NULL, numberFramesOut);

    if (err)
        NSLog(@"Error from GetSourceAudio: %ld", err);

    float leftVolume, rightVolume;

    for (CMItemCount i = 0; i < bufferListInOut->mNumberBuffers; i++)
    {
        AudioBuffer *pBuffer = &bufferListInOut->mBuffers[i];
        int cSamples = numberFrames * pBuffer->mNumberChannels;

        float *pData = (float *)pBuffer->mData;

        float rms = 0.0f;

        for (int j = 0; j < cSamples; j++)
        {
            rms += pData[j] * pData[j];

        }

        if (cSamples > 0)
        {
            rms = sqrtf(rms / cSamples);
        }

        if (0 == i)
        {
            leftVolume = rms;
        }

        if (1 == i || (0 == i && 1 == bufferListInOut->mNumberBuffers))
        {
            rightVolume = rms;
        }
    }

    NSLog(@"Left / Right Volume: %f / %f", leftVolume, rightVolume);
}

しかし、このアプリの目的のために、0-80Hz の範囲の RMS (「強度」) を測定したいだけです (例として)。したがって、ローパスフィルターが必要です。

私は長い間グーグルをしてきましたが、私の問題は、明確な投稿、チュートリアル、または明らかな解決策が見つからないことです。私のように聞こえるほとんどすべての問題は、その下にランダムなコードがあり、コメントが不足しているか、コメントがないため、すべてのマジックナンバーがそこで何をしているのか、そしてそれらが何を意味するのかを理解できません..

誰かがここで私を正しい方向に押してくれますか? 私の場合、コードを理解たいだけでなく、実際のサンプルを実行するだけではないことに注意してください。

ありがとう

4

1 に答える 1

17

実際の例を実行できれば、幸運です。:-)

信号処理は複雑で奥が深い分野です。理論的にやるとなるとややこしくなるし、実際にやろうと思うとむずかしい。

ローパスフィルターが欲しい。さまざまな長所と短所を持つ多くのオプションがあります。

何が起こっているのかを理解したいときに対処する必要がある最も基本的な概念は次のとおりです。

周波数ドメインと時間ドメイン:周波数ドメインは、たとえば 0..80Hz のような周波数間隔について話すときです。時間領域は、通常の時間、またはたとえば、サンプリング バッファーにある個々のサンプル値です。上記のコードは、時間領域で RMS を計算します。

基本的なルール: 周波数領域と時間領域は完全に等価です。

どちらのドメインでも多くの操作を実行して、同じ結果を得ることができます。周波数ドメインと時間ドメインをいつでも切り替えることができます。一部の操作は特定のドメインでは単純であるため、最初に目的のドメインに切り替え、単純な操作を実行してから、(必要に応じて) 元のドメインに戻すと便利なことがよくあります。

周波数領域と時間領域の切り替えは、FT (フーリエ変換)を使用して行われます。プログラムでは、2 の累乗数のサンプルとFFTアルゴリズム (高速フーリエ変換)を含む特殊なケースのバッファーをよく使用します。

もう 1 つの興味深い特性は、畳み込み定理です。FT は、1 つのドメインでの関数の乗算と、別のドメインでの関数の畳み込みとの間で変換します。

では、これはローパス フィルターとどのような関係があるのでしょうか?

提案されたローパスフィルター0-80Hzは、周波数領域の矩形関数です。それを周波数領域の入力に乗算します。これは、80Hz 未満のすべての周波数部分を通過させ、その他すべてをゼロに設定することを意味します。

これで、周波数ドメインですべてを実行できるようになりました。これは簡単ですが、効率的な理由から、前後の FFT を回避するために時間ドメインで実行する必要があります。(あなたの場合、今と同じように周波数領域でも計算できるエネルギーが必要です(二乗和)。)

時間領域でローパス フィルターを実行するには、FT 乗算 FT の代わりに、FT (四角関数) を使用して畳み込みを行うこともできます。FT (方形関数) は理想的なローパス フィルターです: sinc() 関数。

sinc(x) := sin(pi*x) / pi*x

この sinc(x) は、矩形関数のインパルス応答です。この具体的なインパルス応答は無限であり、実用的ではありません。これは、無限の数の値で入力の畳み込みを計算する必要があることを意味します。

必要なのは、有限インパルス応答( FIR ) を持つフィルターです。これにより、フィルターにエラーが発生します。具体的には、同じ重みで 80Hz 未満のすべての周波数が表示されるわけではなく、エネルギーに 80Hz を超える周波数もいくつか表示されます。

この妥協は避けられません。

ところで:エラーなしで完全な矩形関数を適用できるFFTアプローチを使用する場合、FFTを実行する前に入力信号をウィンドウ処理するときに間接的にこのエラーに悩まされます。(ウィンドウ処理とは、FFT を実行するために入力の一部 (ウィンドウ) を切り取ることを意味します。) これは、出力に同じ悪影響を及ぼし、フィルタリング関数と結果と同じ妥協を必要とします。

おそらく、ローパス フィルターとして何らかの種類の FIR フィルターが必要になるでしょう。また、他のコードで見られる奇妙な数値は、そのような FIR フィルターの係数である可能性が最も高いでしょう。

問題は、フィルターで「エラー」を定義する方法に妥協が大きく依存するため、「最適な」妥協がないことです。一部の人々は、82 Hzを超える周波数部分をどうしても避けなければならないため(あなたの例では)、非常に急なフィルターエッジが必要です。これは通常、80Hz 境界付近で大きなアーティファクトを引き起こしますが、これを受け入れる必要があります。他の人々は、80Hz 境界付近のアーティファクトを減らすために、たとえば 120Hz までの周波数から来るいくらかのエネルギーで問題がなく、120Hz を超えると 10% 未満にとどまります (よりソフトなローパス フィルター)。

トピック全体がここで非常によくカバーされています: https://ccrma.stanford.edu/~jos/sasp/FIR_Digital_Filter_Design.html

または、最初から始めたい場合: https://ccrma.stanford.edu/~jos/sasp/sasp.html

また、ウィキペディアの FIR フィルターと sinc のページも参照してください。

上記は、独自のフィルターを設計および実装するには不十分であることは認めます。ただし、開始するための十分な背景と指針が得られるはずです。

そして、時々奇妙な数学にうんざりしないでください。

アイデア: フィルターの効果を視覚化する 1 つの方法は、フィルターを適用した後に FFT を実行し、スペクトルを調べることです。RMS 値だけを見て、フィルターが正常に機能しているかどうかを判断するのは非常に困難です。iPad には、これを行うのに十分な処理能力があります。

(信号処理用のhttp://dsp.stackexchange.comもあることがわかりました。)

于 2013-03-27T15:52:59.377 に答える