• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Frequenzmischer macht Probleme

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??

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>
capt1405041647.jpg
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.
capt1405041648.jpg
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?:confused:

mfg xorg1990

Ach so das Programm zum Analysieren nennt sich Spectrum Lab, ist kostenlos:icon7:
 
Zuletzt bearbeitet:
Hallöchen, bin lange nicht mehr Online gewesen.
Schön, mal wieder von dir zu hören.

In der Physik ist es so, dass sich zwei Sinusse gegeneinander aufheben
Äh... nö... zwei Sinuse heben sich "in der Physik" nicht immer auf. Zum einen müssen die Frequenzen übereinstimmen und zum anderen muss dazu die Phase um Pi verschoben sein.

In meinem Versuch kommen aber viele Träger raus. Wieso??
Dein Algorithmus ist falsch.

Wenn du zwei Töne mischen willst, musst du die einfach nur addieren und darfst nicht durch sampeVFO teilen (warum willst du das überhaupt machen?).
Code:
		var sampleVFO =	LfoData[i]/2;
		var sampleOSC = OscData[i]/2;
		var mixed = sampleVFO + sampleOSC;
		//mixed/=sampleVFO; //VFO Träger ausflöschen
- so klingt's sauber. Spektrum hab' ich mir jetzt nicht angesehen...


PS:
z.B. Mischt man ein 1200Khz Signal mit einem 500hz Signal kommen 700Hz und 1700Hz wider raus.
Du bekommst im Frequenzspektrum auch nur Peaks bei 500 Hz und 1200 Hz, wenn du die beiden Frequenzen mischst. Deine Rechnung mit 700 und 1700 Hz verstehe ich beim Mischen nicht wirklich... oder redest du von Modulieren? Dann darfst du die beiden Sinuse aber nicht addieren, sondern musst sie multiplizieren (AM - FM ist etwas komplizierter; da kannst du den Träger nicht unabhängig vom Signal erzeugen).

siehe da ein 500Hz OSC macht alle 500 Hz einen Träger,
also 500, 1000, 1500 usw.
bei einem reinen 500 Hz Ton sollte wirklich nur ein Peak bei 500 Hz in der Fouriertransformierten sein... die Obertöne bekommt man nur, wenn man keinen perfekten Sinus hat.

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).

Generell sollte es funktionieren, wenn du die Sinus per Hand erzeugst. Mit ist da nicht klar, was du mit "Frequenzgang" meinst. Diese Rechnung sollte genau das sein, was die Oszillator-Node macht. Kannst du da mal den kompletten Code zeigen, was du da probiert hast?
 
Hi kkapsner, ä wo fange ich an.

kkapsner schrieb:
Äh... nö... zwei Sinuse heben sich "in der Physik" nicht immer auf. Zum einen müssen die Frequenzen übereinstimmen und zum anderen muss dazu die Phase um Pi verschoben sein.
Ja haste recht ich hatte falsch ausgedrückt 2 Sinen(so ist’s richtig) derselben Frequenz heben sich auf. Eine muss natürlich um Pi 90° verschoben sein.

Ich will nach wie vor einen Direktmischer Programmieren und hätte nicht gedacht das man einfach nur sample1+sample2 rechnet und das wars
Dann muss wohl ein Tiefpass hinten rann

kkapsner schrieb:
Du bekommst im Frequenzspektrum auch nur Peaks bei 500 Hz und 1200 Hz, wenn du die beiden Frequenzen mischst.
Ja ich sehe die Träger der beiden Oszillatoren und die von 700Hz und 1700Hz auch, nur eben zu schwach.


kkapsner schrieb:
Deine Rechnung mit 700 und 1700 Hz verstehe ich beim Mischen nicht wirklich...
Dann hast du das Prinzip des Direktmischers nicht verstanden, bzw wird dir das keiner jemals erklärt haben.


kkapsner schrieb:
oder redest du von Modulieren?
Ne ne nix Modulieren


kkapsner schrieb:
(warum willst du das überhaupt machen?).
Ja das ist die entscheidende Frage xD. Wie du ja sicherlich noch weißt wollte ich PCM Daten via websocket streamen was nicht so richtig geklappt hatte. Nun das habe ich gelöst es ist so das die TCP Verbindung das Sinus zerhackt, was bedeutet: Wenn man mit einer Rate von 48000Hz beim Sever rauskommt, kommt beim beim Client mit einer rate 24000Hz an. Die web Audio api dudelt aber nun mit 48000Hz was ist da zu tun? Ja genau eine Interpolation oder auch Upsampling genannt.

Der Mischer ist sozusagen ein Bandbreitensparmaßname. Mein Empfänger rödelt bei 20Khz rum (Bandbreite 3Khz) was bedeutet, Samplingrate mindestens 44100Hz. Ich habe mir eben gedacht warum nicht das Signal von 20Khz auf 0bis3 KHz runternehmen, dann bräuchte ich nur eine Rate von 8khz bzw. 6Khz. (der Beitrag war ist eigentlich für NodeJS gedacht)


Das mit dem Handgemachten Sinus zeige ich morgen, ich habe ja Morgen auch noch was zu arbeiten.
In diesem Sinne xorg1990
 
2 Sinen(so ist’s richtig)
Der Duden sagt was anderes: Duden | Sinus | Rechtschreibung, Bedeutung, Definition, Herkunft - wobei ich's falsch geschrieben hab'... ;)

Ich will nach wie vor einen Direktmischer Programmieren und hätte nicht gedacht das man einfach nur sample1+sample2 rechnet und das wars
Dann muss wohl ein Tiefpass hinten rann
Ich hab' keine Ahnung, was ein Direktmischer genau macht. Bzw. welche Mathematik da dahinter steht. Ob da ein Tiefpass noch dran muss kann ich also nicht sagen.

Ja ich sehe die Träger der beiden Oszillatoren und die von 700Hz und 1700Hz auch, nur eben zu schwach.
Ich hab' das jetzt nicht mit JS getestet, aber wenn man die FFT einer Addition eines 500Hz und eines 1200Hz Sinus ansieht, sieht man nur zwei Peaks... wie man es erwartet...

Dann hast du das Prinzip des Direktmischers nicht verstanden, bzw wird dir das keiner jemals erklärt haben.
Wie schon gesagt - ich hab' keine Ahnung, was ein Direktmischer ist/macht. Aber mit Frequenzanalyse kenn' ich mich aus. Fourieranalyse ist eine lineare Operation und deswegen ist das Frequenzspektrum einer Addition das Gleiche wie die Addition der beiden Frequenzspektren. Nur beim Amplitudenmodulieren bekommt man die Differenz- und Summenfrequenz - dafür verschwinden die Originalfrequenzen (wenn man keine Minimalamplitude des Trägers hat)


Ne ne nix Modulieren
Wenn du das sagst...

Wie du ja sicherlich noch weißt wollte ich PCM Daten via websocket streamen was nicht so richtig geklappt hatte. Nun das habe ich gelöst es ist so das die TCP Verbindung das Sinus zerhackt, was bedeutet: Wenn man mit einer Rate von 48000Hz beim Sever rauskommt, kommt beim beim Client mit einer rate 24000Hz an.
Warum das TCP die Frequenz halbiert verstehe ich nicht - hast du dazu Literatur? Was ich mir vorstellen kann ist, dass die Daten nicht schnell genug bei dir ankommen, aber das ändert ja nicht an den Daten.

Der Mischer ist sozusagen ein Bandbreitensparmaßname. Mein Empfänger rödelt bei 20Khz rum (Bandbreite 3Khz) was bedeutet, Samplingrate mindestens 44100Hz.
Du hast also einen 20 kHz Träger mit einer Signalbreite von 3 kHz? Warum muss du dann mit 44100 Hz samplen? Nach der Trennung von Signal und Träger brauchst du nur noch ~6 kHz und die Trennung sollte eigentlich dein Empfänger machen...
Oder speist du einfach das Rohsignal aus deiner Antenne in NodeJS?

Ich habe mir eben gedacht warum nicht das Signal von 20Khz auf 0bis3 KHz runternehmen, dann bräuchte ich nur eine Rate von 8khz bzw. 6Khz. (der Beitrag war ist eigentlich für NodeJS gedacht)
Klingt nach einer guten Idee die Samplingrate zu reduzieren.
 
Hi kkapsner, ich glaube ich muss da mal etwas weiter ausholen.
Es ist so ich Empfange ein Signal bei 475kHz mit einer Bandbreite von 4kHz(Um ehrlich zu sein ich weiß vor schreck gar nicht wie groß die Bandbreite ist, ändert aber an der Mathematik nichts).
Jetzt muss ich mir überlegen wie bekomme ich die 475Khz auf einen Bereich den die Soundkarte kennt.
Bei einer guter Soundkarte mit einer Rate von 192khz kann man empfangen: 0 bis 96Khz.
96Khz darum weil, das Abtasttheorem besagt, dass ein auf f[max] bandbegrenztes Signal mit einer Frequenz von mindestens 2* f_\[max] abgetastet werden muss.
Um nun in den Soundkartenbereich zu kommen muss man eben das machen was ich in Software machen will, man Mischt zwei Signale mit einander. In meinem Fall mischt man 475(RF Frequenz) mit 491Khz(Oszillator Frequenz) raus kommt 16Khz, Bandbreite war 4Khz als sind es am ende 15 und 17 Khz.
Das ist das was mein oder jeder Empfänger macht. Die obere Grenzfrequenz ist 17kHz laut Nyquist muss die Samplerate doppelt so groß also 34Khz, diese gibt es nicht also bleiben nur 44100Hz als alternative.

Wie schon erwähnt ist mein Ziel die TCP Bandbreite zu minimen, also wieder mischen, diesmal in Software von 17Khz auf 1 bis 4 kHz was zu Folge hat das ich nur noch eine Rate von 8Khz habe.


kkapsner schrieb:
Ich hab' keine Ahnung, was ein Direktmischer genau macht. Bzw. welche Mathematik da dahinter steht. Ob da ein Tiefpass noch dran muss kann ich also nicht sagen.
Das ist das Problem ich weiß nicht was ich rechnen soll. Wenn ich eine Mischer brauch kauf ich einen bei Reichelt-Elektronik. Alles was ich mal gefunden habe ist f1+f2 das war bei Wikipedia.

kkapsner schrieb:
Ich hab' das jetzt nicht mit JS getestet, aber wenn man die FFT einer Addition eines 500Hz und eines 1200Hz Sinus ansieht, sieht man nur zwei Peaks... wie man es erwartet...
Flasch capt1405062009.jpg Man sieht einen Peak bei 700Hz und bei 1700Hz und viele andere was nicht sein darf/sollte und die der Oszillatoren was ja auch korrekt ist.
Bei einer OSC Frequenz von 200Hz kommt das bei raus:capt1405062014.jpg Peak bei 1000 und bei 1400Hz. Die vielen andern Peaks sind weg da weniger Oberwellen vom Web Audio Oszillator.

kkapsner schrieb:
Warum das TCP die Frequenz halbiert verstehe ich nicht - hast du dazu Literatur?
Nicht die Frequenz die Samplerate( aber hast du sicher gemeint). Ja keine Ahnung ich hab’s getestet mit einer Rate von 16Khz bei Float32 Samples. Das sollte ein Lokales Netzwerk mit 1Gbit/s schaffen.
Am ende kam immer die habe Rate zu stande:confused: Wenn du magst schick ich dir das Nodejs Skript und das Client Skript.
Laut hören und sagen ist das aber normal. Streamt man mp3 oder ogg kommt das nicht vor.

kkapsner schrieb:
Oder speist du einfach das Rohsignal aus deiner Antenne in NodeJS?
Ich denke doch das ich das oben gut genug erklärt habe. Am Ende ist es so Empfänger->Soundkarte->Nodejs(mit Resampling und so zeugs)->Stream to Client.

Die alles entscheidende frage ist: Wie bekomme ich den VFO Peak weg gerechnet?
Die die Oberwellen vom Oszillator interessieren mich weniger da, Nodjs keine Web Audio api hat.

SO sollte genug sein
Xorg1990
 
Es ist so ich Empfange ein Signal bei 475kHz mit einer Bandbreite von 4kHz(Um ehrlich zu sein ich weiß vor schreck gar nicht wie groß die Bandbreite ist, ändert aber an der Mathematik nichts).
Jetzt muss ich mir überlegen wie bekomme ich die 475Khz auf einen Bereich den die Soundkarte kennt.
Wie genau schaut dein Signal aus? Wie ist der Träger moduliert? Was heißt genau 4kHz Bandbreite? Ist das Signal symmetrisch um den Träger oder nicht? Da hast du zu wenig weit ausgeholt...

Aber wenn du bei 475kHz empfängst, sollte dein Empfänger eigentlich nur die Bandbreite von 4kHz zurückgeben... so wie bei einem Radio ja auch.
Bei einer guter Soundkarte mit einer Rate von 192khz kann man empfangen: 0 bis 96Khz.
96Khz darum weil, das Abtasttheorem besagt, dass ein auf f[max] bandbegrenztes Signal mit einer Frequenz von mindestens 2* f_\[max] abgetastet werden muss.
Das war jetzt zu weit ausgeholt. ;) Ich kenne die Nyquist-Frequenz.

Um nun in den Soundkartenbereich zu kommen muss man eben das machen was ich in Software machen will, man Mischt zwei Signale mit einander. In meinem Fall mischt man 475(RF Frequenz) mit 491Khz(Oszillator Frequenz) raus kommt 16Khz, Bandbreite war 4Khz als sind es am ende 15 und 17 Khz.
Warum "mischst" du mit 491 kHz? Was ist an dieser Frequenz so besonders? Wenn das Signal nicht symmetrisch um den Träger ist, kannst du auch gleich mit 475 kHz "mischen" und bekommst sofort dein 0 bis 4 kHz Signal raus.

Und warum ergibt eine neue Trägerfrequenz von 16 kHz mit 4 kHz Bandbreite 15-17 kHz? Das sollte 12 - 20 kHz sein...
Wie schon erwähnt ist mein Ziel die TCP Bandbreite zu minimen, also wieder mischen, diesmal in Software von 17Khz auf 1 bis 4 kHz was zu Folge hat das ich nur noch eine Rate von 8Khz habe.
Das sollte eigentlich schon dein Empfänger machen...

Das ist das Problem ich weiß nicht was ich rechnen soll. Wenn ich eine Mischer brauch kauf ich einen bei Reichelt-Elektronik. Alles was ich mal gefunden habe ist f1+f2 das war bei Wikipedia.
In welchem Artikel? Zeig' mir mal den Link. Aber f1+f2 klingt stark nach AM... hier ist der multiplikative Mischer auf jeden Fall klassisches AM.


Flasch Anhang anzeigen 4232 Man sieht einen Peak bei 700Hz und bei 1700Hz und viele andere was nicht sein darf/sollte und die der Oszillatoren was ja auch korrekt ist.
Bei einer OSC Frequenz von 200Hz kommt das bei raus:Anhang anzeigen 4233 Peak bei 1000 und bei 1400Hz. Die vielen andern Peaks sind weg da weniger Oberwellen vom Web Audio Oszillator.
Was deine Soundkarte bzw. die Web Audio API da macht, ist mir ziemlich egal. Mathematisch kommen bei einer idealen Wellenüberlagerung da im FFT nur die Originalfrequenzen vor.
Anscheinden hast du da irgendwo eine nichtlineare Verzerrung drin, die dann die Mischfrequenzen erzeugt...

Aber das ist müßig, da wir zuerst klären müssen, die die 4kHz Signalbandbreite auf den Träger aufmoduliert ist.

Nicht die Frequenz die Samplerate( aber hast du sicher gemeint). Ja keine Ahnung ich hab’s getestet mit einer Rate von 16Khz bei Float32 Samples. Das sollte ein Lokales Netzwerk mit 1Gbit/s schaffen.
Am ende kam immer die habe Rate zu stande:confused: Wenn du magst schick ich dir das Nodejs Skript und das Client Skript.
Ja, tu das mal. Sehr seltsam.

Ich denke doch das ich das oben gut genug erklärt habe. Am Ende ist es so Empfänger->Soundkarte->Nodejs(mit Resampling und so zeugs)->Stream to Client.
Warum gehst du eigentlich den Weg über die Soundkarte und nutzt nicht gleich ein Software Defined Radio? Die Hardware scheint da auch nicht mehr so teuer zu sein.
 
Also es ist so: Die Hardware existiert und soll auch nicht verändert werden.
Die 491kHz sind zufällig gewählt weil es den passenden Schwingquarz (der das Herz des Oszillators ist) günstig gibt.
(Die tatsächliche Quarzfrequenz ist aus Stabilitätsgründen viel höher weil sie dann geteilt werden kann und somit die Stabilitätsprobleme auch geteilt werden.)
Das zum Empfang gewünschte Frequenzband von 473 bis 477kHz ( hatte mich gestern verrechnet ) wird dann damit gemischt und umgesetzt in den Soundkartenbereich von 14 bis 18 kHz.
Was dort moduliert ist oder an Signalen vorhanden ist oder nicht soll erstmal völlig Wurscht sein.
Ein Signal oder auch nur Rauschen ist immer da.
Da nun das Signal maximal 18kHz hoch liegt würde das eine Samplerate von 18x2 ist 36kHz erfordern, die nächste passende wäre dann 44100Hz.
Das ist mir zu hoch.
Daher will ich das Band runtermischen auf 1-5kHz. Ich habe dann den gleichen Signalinhalt nur brauch ich nur eine Sampelrate von 5x2 ist 10kHz.

Soweit zu Hard und Software.

kkapsner schrieb:
In welchem Artikel? Zeig' mir mal den Link. Aber f1+f2 klingt stark nach AM... hier ist der multiplikative Mischer auf jeden Fall klassisches AM.
Ob multiplikative Mischer oder additiver Mischer ist egal, es gibt beides und alles läuft auf's selbe heraus. Für meinen zweck reicht die additive mischung.
Vergiss das mit der Modulation.

kkapsner schrieb:
Was deine Soundkarte bzw. die Web Audio API da macht, ist mir ziemlich egal.
Na na na, egal ist das nicht, es ist so das ein Oszillator, wenn man ihn baut (aus Schwingkreisen usw) eben Oberwellen erzeugt. Die Entwickler der Web Audio API haben es eben zu gut gemeint


kkapsner schrieb:
In welchem Artikel? Zeig' mir mal den Link. Aber f1+f2 klingt stark nach AM... hier ist der multiplikative Mischer auf jeden Fall klassisches AM.
Ob multiplikative Mischer oder additiver Mischer ist egal, es gibt beides und alles läuft auf's selbe heraus. Für meinen zweck reicht die additive mischung.
Vergiss das mit der Modulation.

kkapsner schrieb:
Was deine Soundkarte bzw. die Web Audio API da macht, ist mir ziemlich egal.
Na na na, egal ist das nicht, es ist so das ein Oszillator, wenn man ihn baut (aus Schwingkreisen usw) eben Oberwellen erzeugt. Die Entwickler der Web Audio API haben es eben zu gut gemeint

kkapsner schrieb:
Warum gehst du eigentlich den Weg über die Soundkarte und nutzt nicht gleich ein Software Defined Radio?
Wie komme ich von einen sdr Empfänger nach Nodejs? Am Ende ist die Tcp Bandbreite noch größer da, ein sdr eine Samplerate von 102400000 Samples/s hat.

Das TCP Script sende ich dir am Freitag per PN.

Zu den "Handgecodeten Sinus" komme ich auch noch mal zurück muss mir erst ein Oszilloskop besorgen.

Mfg Xorg1990
 
Die 491kHz sind zufällig gewählt weil es den passenden Schwingquarz (der das Herz des Oszillators ist) günstig gibt.
OK - das ergibt Sinn. Dann müssen wir damit arbeiten.
Was dort moduliert ist oder an Signalen vorhanden ist oder nicht soll erstmal völlig Wurscht sein.
Nein, ist es nicht. Denn diese Signale wollen wir doch extrahieren. Dazu müssen wir wissen, wie die auf den Träger (der jetzt bei 16kHz liegt) aufmoduliert sind, damit wir es demodulieren können.
Daher will ich das Band runtermischen auf 1-5kHz. Ich habe dann den gleichen Signalinhalt nur brauch ich nur eine Sampelrate von 5x2 ist 10kHz.
Jaja. Ist mir schon klar.

Ob multiplikative Mischer oder additiver Mischer ist egal, es gibt beides und alles läuft auf's selbe heraus. Für meinen zweck reicht die additive mischung.
Vergiss das mit der Modulation.
Wenn du in der Software frei wählen kannst, dann nimm doch den Multiplikativen. Der ist dann auch Ideal, du bekommst nur die gewünschte Ausgangsfrequenz und du brauchst keine Nichtlinearität.

Na na na, egal ist das nicht, es ist so das ein Oszillator, wenn man ihn baut (aus Schwingkreisen usw) eben Oberwellen erzeugt. Die Entwickler der Web Audio API haben es eben zu gut gemeint
Ja, schon klar, dass ein reelles System keinen perfekten Sinus hinbekommt. Aber du kannst in der Software ja das Ideal simulieren und die Mathematik sauber abbilden.

Wie komme ich von einen sdr Empfänger nach Nodejs?
Das weiß ich nicht, da ich damit noch nie etwa gemacht hab'.
Am Ende ist die Tcp Bandbreite noch größer da, ein sdr eine Samplerate von 102400000 Samples/s hat.
Du sollst ja nicht das Rohsignal über den Äther schicken. Das ganze Demodulieren macht dann die Software und du bekommst nur dein Signal (0-4kHz), das du dann gleich verschicken kannst.
 
Kann es sein das ich falsch gedacht habe mit meiner Mischung. Das was ich mische sind ja Samples und keine Sinusse.
Am ende habe ich ja ein Schlagzeug mit einer Gitarre gemixt und nicht zwei Sinus Schwingungen, sehe ich das richtig so?

kkapsner schrieb:
Nein, ist es nicht. Denn diese Signale wollen wir doch extrahieren. Dazu müssen wir wissen, wie die auf den Träger (der jetzt bei 16kHz liegt) aufmoduliert sind, damit wir es demodulieren können.
Wie schon erwähnt es wird nichts moduliert und auch nichts demoduliert, mein Empfänger empfängt ausschließlich Telegrafie Signale. Das hätte ich auch schon mal eher sagen sollen... ich weiß.:grin:

Am ende der kette wird ja auch nichts gehört sondern was gesehen und zwar ein FFT Spektrum.
Frag jetzt nicht warum ich das nicht in nodejs mache und die Frequenzedaten streame… ich habe mir schon was dabei gedacht.

kkapsner schrieb:
Ja, schon klar, dass ein reelles System keinen perfekten Sinus hinbekommt. Aber du kannst in der Software ja das Ideal simulieren und die Mathematik sauber abbilden.
Ja da stimmt auch wieder.

kkapsner schrieb:
Wenn du in der Software frei wählen kannst, dann nimm doch den Multiplikativen. Der ist dann auch Ideal, du bekommst nur die gewünschte Ausgangsfrequenz und du brauchst keine Nichtlinearität.
Ok das schaue ich mir genauer an.

kkapsner schrieb:
Du sollst ja nicht das Rohsignal über den Äther schicken. Das ganze Demodulieren macht dann die Software und du bekommst nur dein Signal
Und trotzdem geht das, der RTL-SDR von Osmocom sendet die Datenmenge über TCP aber nur am Lokalen Netzwerk. Fragt sich nur ist das I&Q schon demoduliert oder werden beide Kanäle gesendet?
....nächstes Thema



Um noch mal zu halbierten Samplerate über TCP zurück zu kommen:
Es ist ja so das ich in Nodejs eine TCP Verbindung in eine Websocket Verbindung umsetze. Man könnte es TCP to Websocket Bridge nennen.
Zwischen durch Spawne ich noch eine Gstreame Pipeline. Gstreame nimmt mir schon mal ein haufen arbeit ab z.B.: ein Tschebyscheff Filter.
Von Gstreamer komme ich dann über den File descriptor zum Websocket. Das Websocket Socket habe ich via BinaryJs implementiert
und die Daten werden nicht „gesendet“ sprich es gibt kein onmessage Event sondern es wird über eine Pipe Methode gearbeitet.

Was ich damit sagen will ich hoffe du arbeitest mit Linux unter Windows ist das oben genannte ein ziemlicher aufwand. Oder es dir fällt jetzt schon ein warum die Rate sich unterwegs halbiert.

Außerdem muss man am ende sowieso interpolieren da die Web Audio API keine Default Samplerate hat, in Chorme(XP) ist es 48000Hz, Chrome(win7) sogar 192000Hz, FF 44100Hz.

Und wider ist es so spät:sleeping:
Xorg1990
 
Zuletzt bearbeitet von einem Moderator:
Hallo Korbinian, ich glaube ich habes‘s gelöst.

Kannst du dir bitte mal das Skript anschauen:
Code:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head>
    <title>Mixer with WebAudio API</title>
 </head>
<body>

<div id="ausgabe"></div>
<script type="text/javascript">

window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
var filter = context.createBiquadFilter();
var OscData = new Float32Array(32768);
var VfoData = new Float32Array(32768);

/*
8500Hz mischen mit 2500 Hz = 2500Hz und 14500Hz	
*/	
function mix(ev){
	var bufferLength = ev.outputBuffer.length;
	var output = ev.outputBuffer.getChannelData(0);
	for(var i=0;i<bufferLength;i++){
		//Mache Oszillator  singal leiser
		var sineVFO =	VfoData[i]/2;
		var sineOSC = OscData[i]/2;
		//--------------------------------------------------------
		//var CosineVFO = Math.cos(sineVFO-Math.PI/2);
		//var CosineOSC = Math.cos(sineOSC-Math.PI/2);
		//--------------------------------------------------------
		var CosineVFO = sineVFO/(Math.PI/2);
		var CosineOSC = sineOSC/(Math.PI/2);
		//--------------------------------------------------------
		var mixed = 0.5*CosineVFO*CosineOSC+sineVFO*sineOSC;
		//beseitige clipping Fehler
		if (mixed > 1.0) mixed = 1.0;
		if (mixed < -1.0)  mixed = -1.0;
		document.getElementById("ausgabe").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];
	
	}
}

function VfoGetData(ev){
	var bufferLength = ev.inputBuffer.length;
	var input = ev.inputBuffer.getChannelData(0);
	for(var i=0;i<bufferLength;i++){
	VfoData[i]=input[i];
	}
}



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 = 8500;
oscillator.type = 0;
oscillator.connect(oscGetData);

// Varibler Oszillator 
var VFO = context.createOscillator();
VFO.frequency.value = 6000;
VFO.type = 0;
VFO.connect(vfoGetData);


vfoGetData.connect(context.destination);
oscGetData.connect(context.destination);
Mixer.connect(filter);

filter.type = filter.LOWPASS;
filter.frequency.value = 3000;
filter.Q.value = 25;

filter.connect(context.destination);

oscillator.start(0);
VFO.start(0);


</script>

</body>
</html>

Das sollte eigentlich so korrekt sein.
Allerdings habe ich jetzt zwei Signale, dass Summe und Differensignal. Benötigen tue nur das Differenzsignal.
Den Filter will ich einsparen, es sollte jetzt aber kein Problem mehr sein das Summesignal wegzurechnen.

Das „Handgecodetete“ Sinus geht auch, man muss nur darauf achten das man genug Samples hat. In JavaScript ist das Array immer genau so groß wie die Samplerate ist new Float32Array(SampleRate).
Die Oberwellen Problematik von Web Audio Oszillator hat sich auch erledigt. Das kam einfach daher, dass die Soundkarte auf Anschlag war mit der Lautstärke.

PS: sowas will ich am Ende auch mal darstellen im Browser:kkapsner.jpg:cool:

MFG Denny, Xorg1990
 
Zurück
Oben