xorg1990
New member
Hallöchen, bin lange nicht mehr Online gewesen.
Und zwar bin ich gerade dabei einen Frequenzmischer zu Programmieren.
In der Physik ist es so, dass sich zwei Sinusse gegeneinander aufheben
z.B. Mischt man ein 1200Khz Signal mit einem 500hz Signal kommen 700Hz und 1700Hz wider raus.
In meinem Versuch kommen aber viele Träger raus. Wieso??

Im Bild sieht man das von ca. 18:46:50 bis ca.18:47:20 die VFO Frequenz zu hören ist (strich bei 500Hz),
kommt dann das 1200Hz Sinus dazu ist das Ergebnis Müll.
Da ich keinen Fehler im Algorithmus finden konnte habe ich einfach einen einzelnen Oszillator gestartet und siehe da ein 500Hz OSC macht alle 500 Hz einen Träger,
also 500, 1000, 1500 usw.

Das Reduzieren der Lautstärke bringt nix die Samples sind ja trotzdem da.
Darauf hin habe ich versucht ein Sinus auf Mathematischen Weg zu erzeugen nur bekomme ich das nicht so genau hin (der Frequenzgang ist nicht so genau).
Beispiel:
Ist das etwa ein Bug mit dem Oszillator?
mfg xorg1990
Ach so das Programm zum Analysieren nennt sich Spectrum Lab, ist kostenlos:icon7:
Und zwar bin ich gerade dabei einen Frequenzmischer zu Programmieren.
In der Physik ist es so, dass sich zwei Sinusse gegeneinander aufheben
z.B. Mischt man ein 1200Khz Signal mit einem 500hz Signal kommen 700Hz und 1700Hz wider raus.
In meinem Versuch kommen aber viele Träger raus. Wieso??
Code:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
<title>Mixer with WebAudio API</title>
</head>
<body>
<div id="ausgabe3"></div>
<script type="text/javascript">
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var OscData = new Float32Array(32768);
var LfoData = new Float32Array(32768);
/*
12000Hz mischen mit 500 Hz = 700Hz und 1700Hz
*/
function mix(ev){
var bufferLength = ev.outputBuffer.length;
var output = ev.outputBuffer.getChannelData(0);
for(var i=0; i<bufferLength;i++){
32768<=i&&(i-=32768);
//Mache Oszillator signal leiser
var sampleVFO = LfoData[i]/100;
var sampleOSC = OscData[i]/100;
var mixed = sampleVFO + sampleOSC;
mixed/=sampleVFO; //VFO Träger ausflöschen
//beseitige clipping Fehler
if (mixed > 1.0) mixed = 1.0;
if (mixed < -1.0) mixed = -1.0;
document.getElementById("ausgabe3").innerHTML=(mixed);
output[i] = mixed;
}
}
function OscGetData(ev){
var bufferLength = ev.inputBuffer.length;
var input = ev.inputBuffer.getChannelData(0);
for(var i=0;i<bufferLength;i++){
OscData[i]=input[i];
32768<=i&&(i-=32768);
}
}
function VfoGetData(ev){
var bufferLength = ev.inputBuffer.length;
var input = ev.inputBuffer.getChannelData(0);
for(var i=0;i<bufferLength;i++){
LfoData[i]=input[i];
32768<=i&&(i-=32768);
}
}
var Mixer = context.createScriptProcessor(16384, 0, 1);
var oscGetData = context.createScriptProcessor(16384, 1, 1);
var vfoGetData = context.createScriptProcessor(16384, 1, 1);
Mixer.onaudioprocess = mix;
oscGetData.onaudioprocess = OscGetData;
vfoGetData.onaudioprocess = VfoGetData;
//soll ein Soundkartensignal darstellen
var oscillator = context.createOscillator();
oscillator.frequency.value = 1200;
oscillator.type = 0;
oscillator.connect(oscGetData);
// Varibler Oszillator
var VFO = context.createOscillator();
VFO.frequency.value = 500;
VFO.type = 0;
VFO.connect(vfoGetData);
vfoGetData.connect(context.destination);
oscGetData.connect(context.destination);
Mixer.connect(context.destination);
//Das "Soundkartensignal" soll verzögert kommen
oscillator.start(5);
VFO.start(0);
</script>
</body>
</html>

Im Bild sieht man das von ca. 18:46:50 bis ca.18:47:20 die VFO Frequenz zu hören ist (strich bei 500Hz),
kommt dann das 1200Hz Sinus dazu ist das Ergebnis Müll.
Da ich keinen Fehler im Algorithmus finden konnte habe ich einfach einen einzelnen Oszillator gestartet und siehe da ein 500Hz OSC macht alle 500 Hz einen Träger,
also 500, 1000, 1500 usw.

Code:
<!DOCTYPE html >
<meta charset="UTF-8">
<title>Test</title>
<script type="text/javascript">
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
oscillator = context.createOscillator(),
oscillator.type = 0;
gainNode = context.createGainNode();
oscillator.frequency.value = 500;
oscillator.connect(gainNode);
gainNode.connect(context.destination);
gainNode.gain.value = 1;
oscillator.start(0);
</script>
Das Reduzieren der Lautstärke bringt nix die Samples sind ja trotzdem da.
Darauf hin habe ich versucht ein Sinus auf Mathematischen Weg zu erzeugen nur bekomme ich das nicht so genau hin (der Frequenzgang ist nicht so genau).
Beispiel:
Code:
var sourceRate = 44100;
var a = new Float32Array(100000);
for (var i = 0; i < 50000; i++) {
a[i] = Math.sin(Math.PI * 2 / sourceRate * i * 500) / 4;
}
Ist das etwa ein Bug mit dem Oszillator?
mfg xorg1990
Ach so das Programm zum Analysieren nennt sich Spectrum Lab, ist kostenlos:icon7:
Zuletzt bearbeitet: