フーリエ変換からスペクトルを取得しました。次のように見えます:
ちょうど近くを警察が通過していました
色は強度を表します。
X 軸は時間です。
Y 軸は周波数で、0 が上になります。
口笛や警察のサイレンは 1 つの痕跡しか残していませんが、他の多くの音には多くの高調波周波数が含まれているようです。
エレキギターをマイクに直接差し込む(標準チューニング)
本当に悪いことは、あなたが見ることができるように、大きな強度がないということです - ほぼ等しい2-3の周波数があります.
最も重要なピークを強調するピーク検出アルゴリズムを作成しました。
function findPeaks(data, look_range, minimal_val) {
if(look_range==null)
look_range = 10;
if(minimal_val == null)
minimal_val = 20;
//Array of peaks
var peaks = [];
//Currently the max value (that might or might not end up in peaks array)
var max_value = 0;
var max_value_pos = 0;
//How many values did we check without changing the max value
var smaller_values = 0;
//Tmp variable for performance
var val;
var lastval=Math.round(data.averageValues(0,4));
//console.log(lastval);
for(var i=0, l=data.length; i<l; i++) {
//Remember the value for performance and readibility
val = data[i];
//If last max value is larger then the current one, proceed and remember
if(max_value>val) {
//iterate the ammount of values that are smaller than our champion
smaller_values++;
//If there has been enough smaller values we take this one for confirmed peak
if(smaller_values > look_range) {
//Remember peak
peaks.push(max_value_pos);
//Reset other variables
max_value = 0;
max_value_pos = 0;
smaller_values = 0;
}
}
//Only take values when the difference is positive (next value is larger)
//Also aonly take values that are larger than minimum thresold
else if(val>lastval && val>minimal_val) {
//Remeber this as our new champion
max_value = val;
max_value_pos = i;
smaller_values = 0;
//console.log("Max value: ", max_value);
}
//Remember this value for next iteration
lastval = val;
}
//Sort peaks so that the largest one is first
peaks.sort(function(a, b) {return -data[a]+data[b];});
//if(peaks.length>0)
// console.log(peaks);
//Return array
return peaks;
}
アイデアは、データを調べて、 thresold より大きい値を覚えているということですminimal_val
。次のlook_range
値が選択した値よりも小さい場合は、ピークと見なされます。このアルゴリズムはあまりスマートではありませんが、実装は非常に簡単です。
ただし、私が予想したように、文字列の主要な周波数がどれであるかはわかりません。
赤い点は最も強いピークを強調しています
これが実際にどのように機能するか (または機能しないか) を確認するための jsFiddleを次に示します。