xorg1990
New member
Hallo ich habe mal wieder ein mehr oder weniger kompliziertes Problemchen.
Ich komme bein rendern meines Spektranalysers nicht weiter. Und zwar stimmen die Anzeigen nicht überein ein, wenn ich ein 1000Hz Träger bringe komme ich in meinen Spektrum bei 1750Hz raus. Ich muss also irgendwas an der for Schleife machen, aber was keinen Plan.
Für die fft benutze ich die von audiolib.js
Die FFT Puffergröße ist 4096.
Die Samplerate ist 44100Hz.
Laut den Berechnung von dlyhf ist ein FFT Bin 10,76Hz wide.
44100/4096=10,76Hz FFT Bin Width.
Ich werde das Gefühl nicht los das ich irgendwas mit dem Wert machen muss um mein Problem zu lösen.
Die anzuzeigende Bandbreite ist in diesem Beispiel 15Khz, 0-15Khz.
Es sollen aber auch nur 100Hz Bandbreite möglich sein z.B 400-500Hz oder sogar noch kleiner 400.00Hz-400.10Hz, je nachdem was der User einstellt.
Der code wo das Rendern geschiet:
Ich denke doch das dieser Codeschnipsel reicht, das wesentliche passiert hier. Das ganze Prinzip stammt aus den smartjava Tutorial
Die Höhe das canvases bestimmt auch der User. Das kann 600px sein, kann aber auch 150px sein. Mir ist klar das man keine 15kHz auf ein 150px hohen canvas darstellen kann.
Noch ein Bildchen um sich das besser vorstellen zu können.

Die Frequenzskala ist im ein Separates canvas was über das "Main canvas" darübergelegt wird.
Mir ist beim schreiben noch was eingefallen:
Wenn ich ein Spektrum von 400-500hz darstellen möchte dann muss ja die Zählervariabele I nicht bei 0 anfangen sondern irgend wo höher. Dafür müsste man ja erst einmal herausfinden wo im FFT Array 400Hz anfangen.
Das Problem ist aber das die FFT Puffergröße nicht immer 4096 ist, sondern auch vom user eingestellt werden kann, aber immer um Faktor 2 Multipliziert.
Wenn ich den Kompletten Code liefern sol müsst ihr's nur sagen... ist halt nur ne Menge
Puh ganz schön viel stoff bin ja mal gespannt
VG Xorg1990
Ich komme bein rendern meines Spektranalysers nicht weiter. Und zwar stimmen die Anzeigen nicht überein ein, wenn ich ein 1000Hz Träger bringe komme ich in meinen Spektrum bei 1750Hz raus. Ich muss also irgendwas an der for Schleife machen, aber was keinen Plan.
Für die fft benutze ich die von audiolib.js
Die FFT Puffergröße ist 4096.
Die Samplerate ist 44100Hz.
Laut den Berechnung von dlyhf ist ein FFT Bin 10,76Hz wide.
44100/4096=10,76Hz FFT Bin Width.
Ich werde das Gefühl nicht los das ich irgendwas mit dem Wert machen muss um mein Problem zu lösen.
Die anzuzeigende Bandbreite ist in diesem Beispiel 15Khz, 0-15Khz.
Es sollen aber auch nur 100Hz Bandbreite möglich sein z.B 400-500Hz oder sogar noch kleiner 400.00Hz-400.10Hz, je nachdem was der User einstellt.
Der code wo das Rendern geschiet:
Code:
Window.prototype.drawSpectrogram = function(){
var FFT_Data = this.Analyser1.spectrum;
//var drawLength = FFT_Data.length < this.canvas_height ? this.canvas_height : FFT_Data.length;
this.tempCtx.drawImage(this.waterCanvas, 0, 0, this.waterCanvas.width, this.waterCanvas.height);
document.getElementById("ausgabe2a").innerHTML = "FFT value: "+ FFT_Data[4];
for (var i = 0; i < this.waterCanvas.height; i++) {
// draw each pixel with the specific color
var value = FFT_Data[i];
this.waterCanvasCtx.fillStyle = this.colors.getColor(value).hex();
document.getElementById("ausgabe3").innerHTML = this.colors.getColor(value).hex();
// draw the line at the right side of the canvas
this.waterCanvasCtx.fillRect(this.waterCanvas.width - 1, this.waterCanvas.height - i, 1, 1);
}
// set translate on the canvas
this.waterCanvasCtx.translate(-1, 0);
// draw the copied image
this.waterCanvasCtx.drawImage(this.tempCanvas, 0, 0, this.waterCanvas.width, this.waterCanvas.height, 0, 0, this.waterCanvas.width, this.waterCanvas.height);
// reset the transformation matrix
this.waterCanvasCtx.setTransform(1, 0, 0, 1, 0, 0);
//draw the water canvas on the main cnavas
this.canvas_ctx.drawImage(this.waterCanvas,0,0,this.waterCanvas.width, this.waterCanvas.height);
};
Die Höhe das canvases bestimmt auch der User. Das kann 600px sein, kann aber auch 150px sein. Mir ist klar das man keine 15kHz auf ein 150px hohen canvas darstellen kann.
Noch ein Bildchen um sich das besser vorstellen zu können.

Die Frequenzskala ist im ein Separates canvas was über das "Main canvas" darübergelegt wird.
Mir ist beim schreiben noch was eingefallen:
Wenn ich ein Spektrum von 400-500hz darstellen möchte dann muss ja die Zählervariabele I nicht bei 0 anfangen sondern irgend wo höher. Dafür müsste man ja erst einmal herausfinden wo im FFT Array 400Hz anfangen.
Das Problem ist aber das die FFT Puffergröße nicht immer 4096 ist, sondern auch vom user eingestellt werden kann, aber immer um Faktor 2 Multipliziert.
Wenn ich den Kompletten Code liefern sol müsst ihr's nur sagen... ist halt nur ne Menge
Puh ganz schön viel stoff bin ja mal gespannt

VG Xorg1990