41

拍手検出器 (「拍手!拍手! 拍手! 拍手!拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手! 拍手!拍手! ドアが閉まるときを検出する必要があります。これは、部屋や家庭のドアよりも簡単な車の中にあります。

聞いてください: http://ubasics.com/so/van_driver_door_closing.wav

見て:
波形の画像は安定した線を示し、その後突然乱れ、安定した線に落ち着きます

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

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

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

見て:
代替テキスト

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

  • あなたの考えは何ですか?
  • このイベントをどのように検出しますか?
  • 役立つ音圧レベル計算のコード例はありますか?
  • サンプリングの頻度を下げて (1kHz またはそれより遅い?)

更新: Octave (オープン ソースの数値解析 - Matlab に似ています) で遊んで、二乗平均平方根が必要なものを提供するかどうかを確認します (その結果、SPL に非常に似た結果が得られます)。

更新 2: RMS を計算すると、単純なケースではドアが簡単に閉まることがわかります。 次に、難しいケース (ラジオがオン、熱/空気がオンなど) を確認する必要があります。CFAR は非常に興味深いものです。適応アルゴリズムを使用する必要があることはわかっていますが、CFAR は確かにその条件に適合しています。
代替テキスト 代替テキスト

-アダム

4

9 に答える 9

28

ソース オーディオ ファイルのスクリーンショットを見ると、サウンド レベルの変化を検出する簡単な方法の 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ます。サウンドのセクションの適切な長さを決定することは、もう 1 つの懸念事項です。

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

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

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

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

WINDOW_SIZETHRESHOLDはどちらも、検出される音に対して経験的に決定する必要があると思います。

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

利点/欠点

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

このアプローチには、私が考えることができる問題がいくつかあります。

  1. バックグラウンド ノイズが大きすぎると、バックグラウンド ノイズとドアが閉まるエネルギーの差がわかりにくくなり、ドアが閉まったことを検出できない場合があります。
  2. 拍手などの突然のノイズは、ドアが閉まっていると見なすことができます。

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

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

于 2009-02-01T02:54:46.297 に答える
7

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

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

幸運を!

于 2009-02-01T04:16:05.807 に答える
5

スペクトルを見ることから始めます。私はあなたが与えた2つのオーディオファイルでこれを行いました、そしてあなたが使うことができるいくつかの類似点があるようです。たとえば、2つの主な違いは約40〜50Hzのようです。私の.02。

アップデート

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

代替テキスト
(ソース:charlesrcook.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))
于 2009-02-01T04:05:34.470 に答える
4

オーディオ信号の明確なスパイクを検出するプロセスは、トランジェント検出と呼ばれます。Sony の AcidAbleton Liveなどのアプリケーションは、トランジェント検出を使用して音楽内のビートを検出し、ビート マッチングを行います。

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

于 2009-02-01T13:00:41.767 に答える
3

周波数と振幅も車両ごとに大きく異なると思います。それを判断する最善の方法は、シビックと大型 SUV でサンプルを取ることです。おそらく、ユーザーに「学習」モードでドアを閉めて、振幅と周波数のシグネチャを取得させることができます。次に、それを使用して、使用モードで比較できます。

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

于 2009-02-01T00:41:25.677 に答える
0

非常に単純なノイズゲートは、おそらくあなたの状況ではうまくいくでしょう。振幅が指定されたしきい値を超える最初のサンプルを待つだけです(バックグラウンドノイズによるトリガーを回避するため)。さまざまな種類のノイズ(ドアを閉めるときと手拍子など)を区別する必要がある場合にのみ、これよりも複雑にする必要があります。

于 2009-02-02T07:55:21.573 に答える
0

サンプリングの頻度が低いという問題では、キャプチャできる最高の音の周波数はサンプリング レートの半分です。したがって、車のドアの音が 1000Hz で最も強かった場合 (たとえば)、サンプリング レートが 2000Hz 未満の場合、その音は完全に失われます。

于 2009-02-02T02:35:59.593 に答える
0

おそらく、ドアが閉まっていることを示す空気圧の急激な上昇を検出する必要があります。この波形とサウンドレベルの分析と組み合わせると、より良い結果が得られる可能性があります。

于 2009-01-31T23:51:21.707 に答える