オーディオ ストリームを指定して、ドアがバタンと閉まるタイミングを見つけます (音圧レベルの計算?)

ソース オーディオ ファイルのスクリーンショットを見ると、サウンド レベルの変化を検出する簡単な方法の 1 つは、サンプルの数値積分を行って、特定の時間における波の「エネルギー」を見つけることです。

大まかなアルゴリズムは次のようになります:

<オール>
  • サンプルをセクションに分けます
  • 各セクションのエネルギーを計算
  • 前のウィンドウと現在のウィンドウの間のエネルギーの比率を取る
  • 比率があるしきい値を超えた場合、突然の大きな騒音があったと判断します。
  • 疑似コード

    samples = load_audio_samples()     // Array containing audio samples
    WINDOW_SIZE = 1000                 // Sample window of 1000 samples (example)
    
    for (i = 0; i < samples.length; i += WINDOW_SIZE):
        // Perform a numerical integration of the current window using simple
        // addition of current sample to a sum.
        for (j = 0; j < WINDOW_SIZE; j++):
            energy += samples[i+j]
    
        // Take ratio of energies of last window and current window, and see
        // if there is a big difference in the energies. If so, there is a
        // sudden loud noise.
        if (energy / last_energy > THRESHOLD):
            sudden_sound_detected()
    
        last_energy = energy
        energy = 0;
    

    これを試していないという免責事項を追加する必要があります。

    この方法は、最初にすべてのサンプルを記録しなくても実行できるはずです。ある程度の長さのバッファがある限り (WINDOW_SIZE この例では、数値積分を実行して、音のセクションのエネルギーを計算できます。ただし、これは、WINDOW_SIZE の長さに応じて、処理に遅延が生じることを意味します。 .サウンドのセクションの適切な長さを決定することも、別の問題です。

    セクションに分割する方法

    最初のオーディオ ファイルでは、ドアが閉まる音の長さは 0.25 秒であるように見えます。したがって、数値積分に使用されるウィンドウは、おそらくその半分、または 10 分の 1 程度である必要があります。ウィンドウが無音部分とノイズ部分に重なっていても、無音と突然の音に気付くことができます。

    たとえば、統合ウィンドウが 0.5 秒で、最初のウィンドウが 0.25 秒の無音と 0.25 秒のドア閉鎖をカバーし、2 番目のウィンドウが 0.25 秒のドア閉鎖と 0.25 秒の無音をカバーしていた場合、音の 2 つのセクションには同じレベルのノイズがあるため、音の検出はトリガーされません。ウィンドウを短くすることで、この問題がいくらか軽減されると思います。

    ただし、ウィンドウが短すぎると、音の立ち上がりが 1 つのウィンドウに収まりきらず、隣接するセクション間のエネルギーの差がほとんどないように見え、音を聞き逃す可能性があります。

    WINDOW_SIZE だと思います と THRESHOLD 両方とも、検出される音に対して経験的に決定する必要があります。

    このアルゴリズムがメモリに保持する必要があるサンプルの数を決定するために、たとえば WINDOW_SIZE ドアが閉まる音の1/10、約0.025秒です。 4 kHz のサンプリング レートでは、100 サンプルです。それはメモリ要件のあまり多くないようです。 200 バイトの 16 ビット サンプルを使用します。

    メリット/デメリット

    この方法の利点は、ソース オーディオが整数として入力される場合、単純な整数演算で処理を実行できることです。問題は、既に述べたように、統合されるセクションのサイズによっては、リアルタイム処理に遅延が生じることです。

    このアプローチには、いくつかの問題点が考えられます:

    <オール>
  • バックグラウンド ノイズが大きすぎると、バックグラウンド ノイズとドアが閉まるエネルギーの違いを簡単に区別できず、ドアが閉まったことを検出できない可能性があります。
  • 拍手などの突然の騒音は、ドアが閉まっていると見なすことができます。
  • おそらく、フーリエ解析を使用してドアが閉まる周波数特性を分析しようとするなど、他の回答の提案を組み合わせると、より多くの処理が必要になりますが、エラーが発生しにくくなります。

    この問題を解決する方法を見つけるには、おそらくいくつかの実験が必要になるでしょう.


    車のドア クローズ スイッチをタップする必要があります。これを音声分析で行うのは、過剰設計です。

    さまざまな信号処理アプローチについて多くの提案がありますが、実際には、検出理論について学習するまでに、組み込み信号処理ボードを構築し、選択したチップの処理アーキテクチャを学び、アルゴリズムを試し、デバッグし、調整します。あなたがそれを使用したい車のために(そして他のすべての車のために再調整して再デバッグする)、あなたは車内のリードスイッチを粘着テープで貼り付け、磁石をドアにホットグルーで貼り付けたいと思うでしょう.

    dsp の専門家にとって解決するのが興味深い問題ではないというわけではありませんが、この質問の仕方からすると、サウンド処理があなたが取りたいルートではないことは明らかです。それを正しく機能させるのは悪夢のようです。

    また、クラッパーは、しきい値検出器に入力される単なるハイパス フィルターです。 (さらに、2 回の拍手が十分に速く行われるようにするためのタイマー)


    レーダーの世界には、この問題に関する多くの関連文献があります (検出理論と呼ばれます)。

    「セル平均CFAR」(一定の誤警報率)検出を見たことがあるかもしれません。ウィキペディアにはここに少しあります。あなたのアイデアはこれと非常によく似ており、うまくいくはずです! :)

    頑張ってください!