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

StackOverflow https://stackoverflow.com/questions/499795

質問

拍手検出器と似ています (「拍手! ぱちぱち クラップオフ! ぱちぱち 拍手、拍手、クラッパー! ぱちぱち ") ドアが閉まったときを検出する必要があります。これは車両内で行われるため、部屋や家庭のドアよりも簡単です。

聞く: http://ubasics.com/so/van_driver_door_closed.wav

見て:
image of waveform shows steady line, then sudden disruption, settling down to steady line

16 ビット 4khz でサンプリングしているため、サンプルの大量の処理や保存は避けたいと考えています。

audacity や他の波形ツールで見ると非常に特徴的で、窓や他のドアが開いている場合でも、車内の音圧の増加によりほとんどの場合クリップされます。

聞く: http://ubasics.com/so/van_driverdoorclose_slidingdoorsopen_windowsopen_engineon.wav

見て:
alt text

4kHz、8ビットで読み取りを行い、「定常状態」を追跡する比較的単純なアルゴリズムがあると思います。アルゴリズムが騒音レベルの大幅な増加を検出すると、そのスポットをマークします。

  • どう思いますか?
  • このイベントをどのように検出しますか?
  • 役立つ音圧レベル計算のコード例はありますか?
  • サンプリング頻度を低くしても (1kHz またはそれ以上遅くても) 問題なくできるでしょうか?

アップデート: Octave (オープンソースの数値解析 - Matlab に似たもの) を試して、二乗平均平方根から必要なものが得られるかどうかを確認します (結果は SPL に非常に似たものになります)。

アップデート2: RMS を計算すると、単純な場合にドアが閉まったことが簡単にわかります。
alt text alt text
ここで、難しいケース (ラジオがオン、熱/空気がオンなど) に注目する必要があります。CFAR は非常に興味深いようです。適応アルゴリズムを使用する必要があることはわかっていますが、CFAR は確かにその要件に適合します。

-アダム

役に立ちましたか?

解決

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

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

  1. サンプルをセクションに分割する
  2. 各セクションのエネルギーを計算する
  3. 前のウィンドウと現在のウィンドウの間のエネルギーの比率を取得します。
  4. この比率があるしきい値を超えた場合、突然大きな音が発生したと判断します。

疑似コード

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 です。それはそれほど多くのメモリ要件ではないようです。16 ビット サンプルを使用すると、200 バイトになります。

メリット・デメリット

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

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

  1. 暗騒音が大きすぎると、暗騒音とドアが閉まるエネルギーの差が区別しにくくなり、ドアが閉まるのを検知できない場合があります。
  2. カタカタなどの突然の騒音は、ドアが閉まるとみなされる可能性があります。

おそらく、フーリエ解析を使用してドアが閉じる周波数シグネチャを分析しようとするなど、他の回答の提案を組み合わせると、より多くの処理が必要になりますが、エラーが発生しにくくなります。

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

他のヒント

あなたは車の中でドア閉スイッチにタップする必要があります。 音解析が過剰性能さでこれをやろうとしています。

異なる信号処理に関する提案がたくさんあります あなたが検出について学ぶ時間で、本当に取るに近づきますが、 理論、埋め込まれた信号処理ボードを構築するには、処理を学びます あなたが選んだチップのためのアーキテクチャ、それをデバッグ、アルゴリズムを試み、その後、 あなたは(上でそれを使用して、再チューンと再デバッグしたい車のための曲を 他のすべての車)のために、あなたはちょうどstickeyがリードをテープ希望されます 車の中に切り替えると、ドアにマグネットをhotgluedます。

これは、DSPの専門家のために解決することは興味深い問題ではないということはありません、 しかし、あなたがこの質問をしている途中から、その音は明らかです 処理は、あなたが取るするルートではありません。それはちょうど、このような悪夢になります 作るためにそれが正しく動作します。

また、クラッパがしきい値検出器に供給されるだけハイパスフィルタです。 (一緒に十分に迅速に確認してください2回の拍手を作るためにプラスタイマー)

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

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

グッドラック!

まずはスペクトルを見ることから始めます。あなたが提供した 2 つの音声ファイルに対してこれを実行しましたが、使用できる類似点があるようです。たとえば、この 2 つの主な違いは約 40 ~ 50Hz のようです。私の.02.

アップデート

これを投稿した後、別のアイデアが思いつきました。可能であれば、デバイスに加速度センサーを追加します。それから 振動信号と音響信号を相関させる. 。これは、車両のドアを横切る検出に役立つはずです。たとえばステレオとは異なり、サウンドは振動によって駆動されるため、相関性が十分にあるはずだと考えています。フロントガラスマウント(吸盤)を使ってエンジン回転数を検出できる装置を持っていたので、感度はあるのかもしれません。(これがうまくいくとは約束しません!)

alt text
(ソース: チャールズクック.com)

%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001

%% Van driver door
data = wavread('van_driver_door_closing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');

%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq'  2*abs(Y(1:NFFT/2))];

plot(spectral(:,1),spectral(:,2))

オーディオ信号の明確なスパイクを見つけるプロセスは次のように呼ばれます。 トランジェント検出. 。のようなアプリケーション ソニーの酸 そして アブルトンライブ トランジェント検出を使用して音楽内のビートを検出し、ビート マッチングを実行します。

上の波形に見られる明確なスパイクはトランジェントと呼ばれ、これを検出するための優れたアルゴリズムがいくつかあります。紙 エネルギー問題における過渡現象の検出と分類 では、これを行う 3 つの方法について説明します。

Iは、周波数と振幅は、車両から車両に大きく変化するであろうことが想像します。それは大きなSUV対シビックでサンプルを採取されるだろうかを決定するための最良の方法。おそらくあなたは、ユーザーが振幅と周波数の署名を取得するには、「学習」モードでドアを閉めるかもしれません。そして、あなたは時に使用モードで比較するためにそれを使用できます。

また、関連付けられていないバックグラウンドノイズを除去するためにフーリエ解析を使用して検討することもできドアに近います。

たぶん、あなたは、開閉扉をマークすべき空気圧の重要な瞬間の上昇を検出するようにしてください。あなたは、この波形と音のレベルの分析とそれをペアにすることができ、これらのすべてはあなたに良い結果を与えるかもしれない。

頻度の少ないサンプリングの問題では、キャプチャすることができ、最高のサウンド周波数はサンプリングレートの半分です。車のドアの音は1000Hzをで最強だった場合このように、(例えば)その後、2000Hzの下のサンプリング・レートは、完全にその音を失うことになる。

非常に単純なノイズゲートは、おそらくあなたの状況にうまく行うだろう。単に振幅が所定の閾値以上である(バックグラウンドノイズとトリガを避けるために)最初のサンプルを待ちます。あなたは、ノイズの異なるタイプを区別する必要がある場合にのみ、このより複雑取得する必要があります(例えば拍手対クローズドア)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top