Próbuję zmierzyć różnicę między dwoma dźwiękami za pomocą węzła analizatora i getByteFrequencyData(). Pomyślałem, że podsumowując różnicę w każdym polu częstotliwości, wymyślę jedną liczbę, która będzie reprezentować, jak różne są te dwa dźwięki. Wtedy będę w stanie zmienić dźwięki i zmierzyć liczby ponownie, aby sprawdzić, czy nowy dźwięk był mniej lub bardziej inny niż wcześniej.Jak mierzyć różnicę między dwoma dźwiękami za pomocą interfejsu Web Audio API?
Czy funkcja getByteFrequencyData() w pełni obejmuje reprezentację dźwięku lub czy muszę uwzględnić inne fragmenty danych, aby zakwalifikować dźwięk?
Oto kod używam:
var Spectrogram = (function(){
function Spectrogram(ctx) {
this.analyser = ctx.createAnalyser();
this.analyser.fftSize = 2048;
this.sampleRate = 512;
this.scriptNode = ctx.createScriptProcessor(this.sampleRate, 1, 1);
this.scriptNode.onaudioprocess = this.process.bind(this);
this.analyser.connect(this.scriptNode);
this.startNode = this.analyser;
this.endNode = this.scriptNode;
this.data = [];
}
Spectrogram.prototype.process = function(e) {
var d = new Uint8Array(this.analyser.frequencyBinCount);
this.analyser.getByteFrequencyData(d);
this.data.push(d);
var inputBuffer = e.inputBuffer;
var outputBuffer = e.outputBuffer;
for(var channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
var inputData = inputBuffer.getChannelData(channel);
var outputData = outputBuffer.getChannelData(channel);
for(var sample = 0; sample < inputBuffer.length; sample++) {
outputData[sample] = inputData[sample];
}
}
};
Spectrogram.prototype.compare = function(other) {
var fitness = 0;
for(var i=0; i<this.data.length; i++) {
if(other.data[i]) {
for(var k=0; k<this.data[i].length; k++) {
fitness += Math.abs(this.data[i][k] - other.data[i][k]);
}
}
}
return fitness;
}
return Spectrogram;
})();
Musisz zastanowić się, co to dla Ciebie oznacza, aby dźwięki były inne. Z pewnością 'getByteFrequencyData' reprezentuje dźwięk w pewien sposób, ale nie wiem, czy przechwytuje to, co chcesz. Zastanów się, czy masz dźwięk. Teraz zmniejsz amplitudę o współczynnik 2. Czy dźwięki są takie same? Czy powinny być uważane za te same dźwięki? Musisz zdefiniować, co to znaczy być "tym samym", zanim będziesz mógł wymyślić algorytm, który ci powiem. –
Domyślam się, że dźwięki brzmią tak samo, jak w ludzkim uchu. Tak więc amplituda byłaby częścią równania. Na węzłach analizatora istnieje również getByteTimeDomainData(), który opis to "aktualna domena czasu lub kształt fali", która obejmowałaby amplitudę? – zorqy
Tak, zawiera informacje o amplitudzie. Ale prawdopodobnie chcesz użyć 'getFloatTimeDomainData' zamiast' getByteTimeDomainData'. –