web-dev-qa-db-ja.com

オーディオストリームが与えられたら、ドアが閉まるタイミングを見つけます(音圧レベルの計算?)

拍手検出器とは異なります(「拍手!拍手拍手!拍手拍手拍手、拍手、拍手! clap clap ")ドアが閉まるタイミングを検出する必要があります。これは車内にあり、部屋や家庭のドアよりも簡単です。

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

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

16ビット4kHzでのサンプリングであり、サンプルの大量の処理や保存は避けたいと思います。

大胆さや他の波形ツールでそれを見ると、それは非常に特徴的であり、窓や他のドアが開いているときでも、ほとんどの場合、車両の音圧の増加のためにクリップします:

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

見てください:
alt text

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

  • あなたの考えは何ですか?
  • このイベントをどのように検出しますか?
  • 役立つ可能性のある音圧レベル計算のコード例はありますか?
  • より少ない頻度のサンプリング(1kHzまたはさらに遅い)で逃げることはできますか?

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

Update2:RMSを計算すると、単純なケースではドアが簡単に閉じることがわかります。
alt textalt text
ここで、難しいケース(ラジオオン、熱/空気オンハイなど)を確認する必要があります。 CFARは非常に面白そうです。適応アルゴリズムを使用する必要があることはわかっていますが、CFARは確かにその法案に適合しています。

-アダム

41
Adam Davis

ソースオーディオファイルのスクリーンショットを見ると、サウンドレベルの変化を検出する簡単な方法の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_SIZETHRESHOLDはどちらも、検出される音について経験的に決定する必要があると思います。

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

長所/短所

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

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

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

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

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

28
coobird

車のドアクローズスイッチをタップする必要があります。サウンド分析でこれを行おうとすると、過剰に設計されます。

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

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

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

8
James Caccese

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

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

幸運を!

7
Drew Hall

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

[〜#〜]更新[〜#〜]

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

alt text
(ソース: 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))
5
ccook

オーディオ信号の明確なスパイクを見つけるプロセスは、 過渡検出 と呼ばれます。 Sony's AcidAbleton Live のようなアプリケーションは、一時的な検出を使用して、ビートマッチングを行うために音楽のビートを見つけます。

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

4
Nick Haddad

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

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

3
Turnkey

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

0
barrowc

たぶん、ドアが閉まっていることを示すはずの気圧の大幅な瞬間的な上昇を検出しようとする必要があります。この波形とサウンドレベルの分析と組み合わせることができ、これらすべてがより良い結果をもたらす可能性があります。

0
Szundi

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

0
Mark Heath