Zadałem pytanie podobne do tego wcześniej, ale nie rozwiązało to mojego problemu i zostało źle wyjaśnione. Tym razem zrobiłem ilustracje, które mam nadzieję wyjaśnią lepiej.Uzyskaj logarytmiczny bajtFrequencyData z Audio
Mam prosty analizator widma częstotliwości dla mojego odtwarzacza audio. Częstotliwości są przechowywane w tablicy, która jest aktualizowana po każdej requestAnimationFrame
tablica wygląda następująco:
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
Read more about getByteFrequencyData here.
Tak to działa dobrze, jednak chciałbym częstotliwości mają być równomiernie rozmieszczone w całym spektrum. Teraz jest wyświetlanie częstotliwości liniowej:
Jak widać, zakres częstotliwości wyróżniającym jest tutaj tonów (high end), a najbardziej zdominowany zakres częstotliwości jest zakres basów (low end). Chcę, aby mój analizator przedstawiane z równomiernie rozłożonych zakresach częstotliwości tak:
Tu zobaczysz częstotliwości równomiernie rozmieszczonych na analizatorze. czy to możliwe?
Kod I wykorzystywane do generowania analizator wygląda następująco:
// These variables are dynamically changed, ignore them.
var canbars = 737
var canmultiplier = 8
var canspace = 1
// The analyser
var canvas, ctx, source, context, analyser, fbc_array, bars, bar_x,
bar_width, bar_height;
function audioAnalyserFrame() {
'use strict';
var i;
canvas.width = $('analyser-').width();
canvas.height = $('analyser-').height();
ctx.imageSmoothingEnabled = false;
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear the canvas
ctx.fillStyle = "white"; // Color of the bars
bars = canbars;
for (i = 0; i < bars; i += canmultiplier) {
bar_x = i * canspace;
bar_width = 2;
bar_height = -3 - (fbc_array[i]/2);
ctx.fillRect(bar_x, canvas.height, bar_width, bar_height);
}
window.requestAnimationFrame(audioAnalyserFrame);
}
function audioAnalyserInitialize() {
'use strict';
var analyserElement = document.getElementById('analyzer');
if (analyserElement !== null && audioViewIsCurrent() === true) {
if (analyserInitialized === false) {
context = new AudioContext();
source = context.createMediaElementSource(audioSource);
} else {
analyser.disconnect();
}
analyser = context.createAnalyser();
canvas = analyserElement;
ctx = canvas.getContext('2d');
source.connect(analyser);
analyser.connect(context.destination);
if (analyserInitialized === false) {
audioAnalyserFrame();
}
analyserInitialized = true;
analyser.smoothingTimeConstant = 0.7;
}
}
zwrócić uwagę, że ja pomijam 8 barów (patrz canmultiplier
u góry) w pętli for (Jeśli nie zrobisz, druga połowa analizatora jest renderowana poza obszarem roboczym, ponieważ jest zbyt duża.) Nie wiem, czy to też może powodować niespójne zakresy częstotliwości.
Czy mogę zapytać, dlaczego pierwszy i ostatni indeks nie jest liczbą? –
To prosta kontrola granic, którą pominąłam, aby uczynić kod jaśniejszym. –
Dobra, pozwól mi spróbować tego naprawdę szybko. Jak mam to powiedzieć, aby zignorować ostatni i pierwszy indeks tablicy? –