0

私は約サイズの音声信号を持っています7000000 x 1。MATLABの m ファイルを使用してpeakfinder、特定のしきい値を超えるオーディオ ファイル内のすべてのピークの位置を見つけました。1000000 x 1現在、最大量のピークを含むフレーム サイズを見つけようとしています。私はこれを行う方法について完全に迷っており、どんな助けも大歓迎です。ありがとうございました!

4

1 に答える 1

1

さて、ピーク ファインダー関数が行っているのは、2 次導関数を取得し、結果の値が負になる場所を探すことだけです。これは極大値を示します。したがって、極大値を見つけるために非常によく似たことができます。

これらのインデックスを取得したら、位置の論理表現を含む配列をウィンドウ化し、そこにあるピークの数を数えることができます。

以下のコードは、私が言っていることを実行します。ウィンドウを横切って検出されたピークの数をカウントし、カウントのベクトルを返します。これにより、最大値を見つけることができ、開始インデックスが得られます。

clc; close all; clear all;
A = randi(10,[1,100])
plot(A)
hold on
C = diff(diff(A))
indices = find(C < 0)+1;
scatter(indices,A(indices),'r')
temp = zeros(size(A));
temp(indices) = 1;
window = ones(1,5);
results = conv(temp,window,'same');
max(results)

これはもちろんペットの例です.Aはあなたの行列で、windowはあなたが調べたい範囲の長さの行列です.あなたの場合は1000000です.

編集

以下のコメントで Try Hard が指摘しているように、この方法はノイズの影響をかなり受けやすいため、最初にできることは、微分を行う前に、次のように信号に対して平滑化フィルターを実行することです。

filt = (1/filtLength) * ones(1,filtLength);
A = conv(A,filt,'same')

これは単純な平均化フィルタで、ノイズの一部を滑らかにするのに役立ちます

于 2013-07-22T16:32:15.793 に答える