I asked a question similar to this earlier, but it did not solve my problem and was poorly explained. This time I made illustrations to hopefully explain better.
I have a simple frequency spectrum analyzer for my audio player. Frequencies are stored in an array, which is updated on each requestAnimationFrame , the array looks like this:
fbc_array = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(fbc_array);
Read more about getByteFrequencyData here.
So it works great, but I would like the frequencies to be evenly distributed throughout the spectrum. Right now it displays linear frequencies:

As you can see, the dominant frequency range here is Treble (High end), and the most dominated frequency range is the low frequency range. I want my analyzer to represent evenly distributed frequency ranges as follows:

Here you see frequencies evenly distributed over the analyzer. Is it possible?
The code that I used to generate the analyzer looks like this:
// 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; } }
Note that I skip 8 bars (see canmultiplier at the top) in the for loop (if I donโt do this, the other half of the analyzer is pulled out of the canvas because it is too big.) I donโt know if this could be the cause of inconsistent ranges frequencies.