xorg1990
New member
Hi, ich habe ein kompliziertes Problem mit meiner WebAnwendung.
Seit dem ich die DSP Fensterfunktion eingeführt habe schient JS nur noch Gülle zu berechnen.
Es treten 2 Probleme auf (ich nagel das jetzt mal am Hann Window Fest).
Wenn ich das Hann Fenster so schreibe:
Dann ist der Sinus der aus den boxen ertönt kein sinus mehr. Ich schiebe einen 1500 Hz sinus zu Soundkarte rein, das bedeutet das man auch eine 1500 Sinus hören sollte, allerdings hört das sich komisch an(so eine art zirpen). gerendert wird zwar was bei 1500 Hz aber das ist kein Sinus, ein sinus wäre in gerader strich, ich sehe dar nur matsch.
Test Link Achtung Ton Leiser drehen!!!
Schreibe ich das Fenster so:
Dann ertönt auch ein Sinus aus den Boxen. Allerdings wird dann ein Träger bei 50 Hz gerendert mit Starken Oberwellen hä????? wo kommt das her??
Selbst wenn ich den sampleBuffer lösche wird was gerendert
Das Bild sagt mehr als 1000 Worte:

Wenn man sich einloggt Realtime Grabber Login Einfach auf den Pfeil klicken, dann wider zurück zur Hauptseite wechseln und in der Tabelle auf 0 - 22,5 kHz klicken. Kann man im Reiter FFT Settings die Windows durchgehen, beim Rechteck-Fenster klingt der Ton auch wider normal bei allen anderen Fenstern nicht.
Überfordere ich js? wen ja wie lösen?
Das komplette Fenster Object
this.performWindow wird durch den Web audio ScriptProcessor ausgelöst. Das könnte das zirpen verursachen. Vielleicht wird der blockiert für ein paar µs.
Folgende Gegenmaßnahmen habe ich unternommen:
- Berechnung über das DataView Object
- FensterFunktion im WebWorker berechnen,
- Statt TypedArray Normale Arrays
Alles erfolglos.
PS: Das ganze läuft über das Raspberry Pi und es ist auch noch nicht alles fertig, bei weitem noch nicht. Wichtig ist herauszufinden was bei den Fensterfunktionen schief läuft
@tsseh auch dich würde ich bitten den test link anzuklicken. weil es ist unmöglich hier den ganzen Quellcode zu posten.
Seit dem ich die DSP Fensterfunktion eingeführt habe schient JS nur noch Gülle zu berechnen.
Es treten 2 Probleme auf (ich nagel das jetzt mal am Hann Window Fest).
Wenn ich das Hann Fenster so schreibe:
Code:
wf.prototype.windowHann = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 0.5-0.5 * Math.cos(this.Pi2 * i / (l - 1));// nicht 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
}
this.windowCallback(sampleBuffer);
};
Test Link Achtung Ton Leiser drehen!!!
Schreibe ich das Fenster so:
Code:
wf.prototype.windowHann = function(sampleBuffer){
var l = sampleBuffer.length;
var windowedBuffer = new Float32Array(l);
for(var i=0; i<l;i++){
windowedBuffer[i] = sampleBuffer[i] * 0.5-0.5 * Math.cos(this.Pi2 * i / (l - 1));// nicht 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
}
this.windowCallback(windowedBuffer);
};
Selbst wenn ich den sampleBuffer lösche wird was gerendert
Code:
for(var i=0; i<l;i++){
sampleBuffer[i] = 0;
windowedBuffer[i] = sampleBuffer[i] * 0.5-0.5 * Math.cos(this.Pi2 * i / (l - 1));// nicht 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
}

Wenn man sich einloggt Realtime Grabber Login Einfach auf den Pfeil klicken, dann wider zurück zur Hauptseite wechseln und in der Tabelle auf 0 - 22,5 kHz klicken. Kann man im Reiter FFT Settings die Windows durchgehen, beim Rechteck-Fenster klingt der Ton auch wider normal bei allen anderen Fenstern nicht.
Überfordere ich js? wen ja wie lösen?
Das komplette Fenster Object
Code:
function wf(defaultWindow, alpha){
this.alpha = alpha;
this.Pi2 = Math.PI*2;
this.init(defaultWindow);
}
wf.prototype.init = function(type){
switch(type){
case "Hamming":
this.performWindow = this.windowHamming ;
break;
case "Hann":
this.performWindow = this.windowHann;
break;
case "Bartlett":
this.performWindow = this.windowBartlett;
break;
case "BartlettHann":
this.performWindow = this.windowBartlettHann;
break;
case "Blackman":
this.performWindow = this.windowBlackman;
this.alpha = this.alpha || 0.16;
break;
case "Cosine":
this.performWindow = this.windowCosine;
break;
case "Gauss":
this.performWindow = this.windowGauss;
this.alpha = this.alpha || 0.25;
break;
case "Triangular":
this.performWindow = this.windowTriangular;
break;
case "Lanczos":
this.performWindow = this.windowLanczos;
break;
case "Rectangular":
this.performWindow = this.bypassWindow;
break;
}
};
wf.prototype.windowCallback = function(){};
wf.prototype.windowHann = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 0.5-0.5 * Math.cos(this.Pi2 * i / (l - 1));// nicht 0.5 * (1 - Math.cos(DSP.TWO_PI * index / (length - 1)));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowHamming = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 0.54 - 0.46 * Math.cos(this.Pi2 * i / (l - 1));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowBartlett = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 2 / (l - 1) * ((l - 1) / 2 - Math.abs(i - (l - 1) / 2));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowBartlettHann = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 0.62 - 0.48 * Math.abs(i / (l - 1) - 0.5) - 0.38 * Math.cos(this.Pi2 * i/ (l - 1));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowBlackman = function(sampleBuffer){
var l = sampleBuffer.length;
var a0 = (1 - this.alpha) / 2;
var a1 = 0.5;
var a2 = this.alpha / 2;
for(var i=0; i<l;i++){
sampleBuffer[i] *= a0 - a1 * Math.cos(this.Pi2 * i / (l - 1)) + a2 * Math.cos(4 * this.pi * i / (l - 1));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowCosine = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= Math.cos(Math.PI * i / (l - 1) - this.pi / 2);
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowGauss = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= Math.pow(Math.E, -0.5 * Math.pow((i - (l - 1) / 2) / (this.alpha * (l - 1) / 2), 2));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowTriangular = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
sampleBuffer[i] *= 2 / l * (l / 2 - Math.abs(i - (l - 1) / 2));
}
this.windowCallback(sampleBuffer);
};
wf.prototype.windowLanczos = function(sampleBuffer){
var l = sampleBuffer.length;
for(var i=0; i<l;i++){
var x = 2 * i / (l - 1) - 1;
sampleBuffer[i] *= Math.sin(Math.PI * x) / (Math.PI * x);
}
this.windowCallback(sampleBuffer);
};
wf.prototype.bypassWindow = function(sampleBuffer){
this.windowCallback(sampleBuffer);
};
wf.prototype.setWindowFunc = function(windowFunc){
if(typeof windowFunc === 'string') {
this.init(windowFunc);
}else{
console.log("WindowFunction isn't a string");
}
};
Folgende Gegenmaßnahmen habe ich unternommen:
- Berechnung über das DataView Object
- FensterFunktion im WebWorker berechnen,
- Statt TypedArray Normale Arrays
Alles erfolglos.
PS: Das ganze läuft über das Raspberry Pi und es ist auch noch nicht alles fertig, bei weitem noch nicht. Wichtig ist herauszufinden was bei den Fensterfunktionen schief läuft
@tsseh auch dich würde ich bitten den test link anzuklicken. weil es ist unmöglich hier den ganzen Quellcode zu posten.