以内に一連のパターンを見つけます5つのポップを探しています(ビジュアライゼーションの下部を参照)。私はストリームを読み込み(ブロックされたブロックのRMS値を取得しています(this questionに似ています)。私の問題は、私は単一のイベントではなく、いくつかの特徴を持っているが、私が望むようなブール値ではない一連のイベント(ポップ)を探しているということです。これら5つのポップを検出する最も簡単で(そしてパフォーマンスの高い)方法は何ですか?(これはPythonでであり、そしてコードは素晴らしいことだが、私は、アルゴリズムで主に興味があります。)</p> <p>私は、オーディオストリームを監視しています(PyAudio)データストリーム
RMS機能は私にこのような流れを与える:
0.000580998485254, 0.00045098391298, 0.00751436443973, 0.002733730043, 0.00160775708652, 0.000847808804511
私はあなたのために(同様のストリーム)を丸める場合、それはもう少し便利になります。
0.001, 0.001, 0.018, 0.007, 0.003, 0.001, 0.001
あなたはポップを見ることができますアイテム3の中でおそらくそれがアイテム4の中で落ち着き、おそらくテールエンドがアイテム5の分数の間にあったとします。
私の素朴なアプローチは、次のことです。 a)ポップの定義:ブロックのRMSが.002を超えています。少なくとも2ブロック、4ブロック以下。無音で始まり、無音で終わる。
さらに、私は無声音を定義するように誘惑されています(あまり大きな音ではないがかなり静かなブロックは無視しますが、 'pop'をブーリアンと考えると意味が分かりません)。
b)次に、変数の束を追跡し、if文の束を持つ状態マシンを用意します。 Like:
while True:
is_pop = isRMSAmplitudeLoudEnoughToBeAPop(stream.read())
if is_pop:
if state == 'pop':
#continuation of a pop (or maybe this continuation means
#that it's too long to be a pop
if num_pop_blocks <= MAX_POP_RECORDS:
num_pop_blocks += 1
else:
# too long to be a pop
state = 'waiting'
num_sequential_pops = 0
else if state == 'silence':
#possible beginning of a pop
state = 'pop'
num_pop_blocks += 1
num_silence_blocks = 0
else:
#silence
if state = 'pop':
#we just transitioned from pop to silence
num_sequential_pops += 1
if num_sequential_pops == 5:
# we did it
state = 'waiting'
num_sequential_pops = 0
num_silence_blocks = 0
fivePopsCallback()
else if state = 'silence':
if num_silence_blocks >= MAX_SILENCE_BLOCKS:
#now we're just waiting
state = 'waiting'
num_silence_blocks = 0
num_sequential_pops = 0
このコードは完全ではなく(バグまたは2つの可能性もあります)、私の考え方を示しています。それは確かに私がしたいと思っている以上に複雑です、なぜ私は提案を求めている。
いずれにしても、私はまだポップの長さの状態を維持していますか?(SMAでも3秒間続くとポップではありません)また、ポップの長さを測定するには、フレームが開始されてからフレーム数を追跡する必要があります。現在、ポップまたは非ポップ状態になっている場合は、過去のポップ数も?あるいは、私が見ていない方法で、SMAがそれを解決するだろうか? –
データとその変換の見解がなければ、さらに進むことは難しいです。それが私だったら、興味深い現象がいくつか現れて、入力データのサンプルが得られます。データをグラフ化する関数を書く。異なるスムージング、ポップ検出アルゴリズムなどを適用する。新しいグラフ上で元の+平滑化+ポップ検出+行内検出を示します。それがあなたに合うまで調整してください。一度やり直したら、データの新しい大きなサンプルでそれを実行し、本格的に使用する前にそれが有効かどうかを確認してください:-) – Paddy3118
私の難しさは変形ではありませんでした。ユースケース)が、ポップの実際の検出、そして行の複数のポップの検出です。コードを投稿します。ご回答有難うございます。 –