Ich stellte eine ähnliche Frage wie zuvor, aber es hat mein Problem nicht gelöst und wurde schlecht erklärt. Diesmal habe ich Illustrationen gemacht, um hoffentlich besser zu erklären.Get logarithmic byteFrequencyData von Audio
Ich habe einen einfachen Frequenzspektrumanalysator für meinen Audiospieler. Die Frequenzen in einem Array gespeichert sind, die auf jeder requestAnimationFrame
aktualisiert wird, sieht das Array wie folgt:
fbc_array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(fbc_array);
Read more about getByteFrequencyData here.
So funktioniert das gut aber ich würde die Frequenzen wie gleichmäßig über das Spektrum beabstandet sind. Gerade jetzt ist es die Anzeige lineare Frequenzen:
Wie Sie sehen können, der dominierenden Frequenzbereich ist hier die Höhen (High-End) und der meisten dominiertem Frequenzbereich ist der Bassbereich (Low-End). Ich möchte, dass meine Analysator mit gleichmäßig verteilten Frequenzbereiche wie folgt dargestellt:
Hier können Sie die Frequenzen gleichmäßig im Abstand über den Analysator zu sehen. Ist das möglich?
Der Code, den ich für die Erzeugung der Analysator wie folgt aussieht:
// 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;
}
}
Beachten Sie, dass ich 8 bar am Überspringen (siehe canmultiplier
am oberen Rand) in der for-Schleife (Wenn ich nicht tun, die andere Hälfte des Analysators wird außerhalb der Leinwand gerendert, weil es zu groß ist.) Ich weiß nicht, ob dies auch die inkonsistenten Frequenzbereiche verursachen könnte.
Darf ich fragen, warum der erste und letzte Index keine Nummer ist? –
Es ist eine einfache Grenze, die ich weggelassen habe, um den Code klarer zu machen. –
Okay, lass mich das wirklich schnell versuchen. Wie kann ich sagen, dass der letzte und erste Index des Arrays ignoriert wird? –