Sto tentando di misurare la differenza tra due suoni utilizzando un nodo dell'analizzatore e getByteFrequencyData(). Ho pensato che sommando la differenza in ogni scomparto di frequenza potrei trovare un singolo numero per rappresentare quanto diversi fossero i due suoni. Quindi sarei in grado di cambiare i suoni e misurare nuovamente i numeri per vedere se il nuovo suono fosse più o meno diverso da prima.Come si misura la differenza tra due suoni utilizzando l'API Web Audio?
getByteFrequencyData() comprende completamente la rappresentazione di un suono o è necessario includere altre parti di dati per qualificare il suono?
Ecco il codice che sto utilizzando:
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;
})();
È necessario considerare cosa significa per te che i suoni siano diversi. Certamente 'getByteFrequencyData' rappresenta il suono in qualche modo, ma non so se cattura ciò che vuoi. Pensa se hai un suono. Ora riduci l'ampiezza di un fattore 2. I suoni sono gli stessi? Dovrebbero essere considerati gli stessi suoni? È necessario definire cosa significhi essere lo "stesso" prima che tu possa trovare un algoritmo da dirti. –
Immagino che i suoni siano gli stessi che suonerebbero allo stesso modo di un orecchio umano. Quindi l'ampiezza sarebbe una parte dell'equazione. Sui nodi dell'analizzatore esiste anche getByteTimeDomainData() la cui descrizione è "l'attuale dominio temporale o forma d'onda" che comprenderebbe l'ampiezza? – zorqy
Sì, includerebbe informazioni sull'ampiezza. Ma probabilmente vorrai usare 'getFloatTimeDomainData' invece di' getByteTimeDomainData'. –