Cześć!
Dziś walczę z nowym dla mnie cudeńkiem w JS dla przeglądarek:
https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode
Potrzebuję zwiększyć rozdzielczość widma nie zmniejszając częstotliwości jego odświeżania.
var audioContext = new AudioContext();
var webaudio_tooling_obj = function () {
console.log("audio is starting up ...");
var audioInput = null,
microphone_stream = null,
script_processor_fft_node = null,
analyserNode = null;
if (!navigator.getUserMedia)
navigator.getUserMedia =
navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
if (navigator.getUserMedia){
navigator.getUserMedia(
{audio:true},
function(stream) {
start_microphone(stream);
},
function(e) {
alert('Error capturing audio.');
}
);
} else {
alert('getUserMedia not supported in this browser.');
}
function start_microphone(stream){
microphone_stream = audioContext.createMediaStreamSource(stream);
analyserNode = audioContext.createAnalyser();
analyserNode.smoothingTimeConstant = 0;
analyserNode.fftSize = 2048;
microphone_stream.connect(analyserNode);
script_processor_fft_node = audioContext.createScriptProcessor(2048, 1, 1);
script_processor_fft_node.connect(audioContext.destination);
analyserNode.connect(script_processor_fft_node);
script_processor_fft_node.onaudioprocess = function() {
var array = new Uint8Array(analyserNode.frequencyBinCount);
analyserNode.getByteFrequencyData(array);
// draw the spectrogram
if (microphone_stream.playbackState == microphone_stream.PLAYING_STATE) {
draw(array); // canvas - show!
}
};
}
}();
Powyższy kod zbiera dane z mikrofonu i w zmiennej array mamy widmo, niestety dla mnie ma zbyt małą rozdzielczość.
Potrzebowałbym sygnał z mikrofonu przemnożyć przez okno hanna
a następnie dopisać trochę zer
(żeby zrobić z 2048 próbek, np. 16384) i po tych operacjach wrzucić na FFT
.
Muszę użyć jak najwięcej natywnych funkcji, żeby miało szansę to działać.
Dopiero wgłębiam się w te api i ciężko mi coś poskładać.
Może ktoś już coś podobnego zrobił?
Żeby temat nie był bez konkretnego pytania( :] ): jak przemnożyć przez okno hanna i dodać zera?
P.S. (przemyślenia 1s przed wrzuceniem tematu)
Mogę dane z mikrofonu wrzucić do tablicy, pomnożyć, dodać zera i wrzucić na FFT, lecz taka pętla lecąca po elementach i mnożąca zbyt obciąży przeglądarkę :(
Chyba że zrobić FIRa (chyba widziałem w Web Api) w postaci okna i jakoś dokleić zera.