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

[Web Audio API] Lautstärke schwankt, sound übersteuert, klingt blechern

xorg1990

New member
Hi, ich brauche für ein Amateurfunk Projekt eine Voice Verlangsamung zum Senden und zum Empfang eine Verschnellerung.

Das createBufferSource() Objekt kann die Playbackrate verändern.
Dazu erstelle ich im onaudioprocess event einen AudioBuffer
Der wird dann in das createBufferSource() Objekt gespeist, die wiederum ist mit der destination verbunden.

Problem:
Irwie hört sich der Ton blechern an, ab und zu mal karkst es, dann ist der Ton wider voll Laut und irgendwann wird es wieder blechern und leiser bis es wider knarkst usw.
Ich kann nicht finden woran das liegt.

Meine Meinung ist ich erzeuge zu schnell/zu oft BufferSource'es. Das knarksen verbinde ich damit das irwo der Ausgabepuffer überläuft und Zurückgesetzt wird eine art flush(). Dann ist der Ton wider voll da.
html5 - How to release buffers in Web Audio Api? - Stack Overflow

Ich habe mir drauf hin 2 Arrays erstellt wo ich die BufferSource'es reinpacke.
Dann, nach einer gewissen Pufferung mit den Abspielen beginne. Ein Array für den ungespielten Puffer und eins für den gespielten. Ist der Puffer komplette gespielt wird onended aufgerufen und der Puffer gelöscht via .disconnect();

Wenn einer weiß wie man das Problem löst wäre cool.
die BufferSource lässt sich leider nicht mit dem ScriptProcessor verbinden:(


Code:
var ring = [];
var garbageBuffer = [];

processor.onaudioprocess = function(e) {
 var input = e.inputBuffer.getChannelData(0);
 var output = e.outputBuffer.getChannelData(0);
 var total = 0,
  rms = 0,
  decibel = 0;
 var outputBuffer = offlineCtx.createBuffer(1, input.length, Fs);
 var source = offlineCtx.createBufferSource()
 for (var i = 0; i < input.length; i++) {
  total += Math.abs(input[i]);
  if (record === true) {
   if (j < audioRecordBuffer.length) {
    audioRecordBuffer[j++] = input[i];
   } else {
    document.getElementById("aufnahme")
     .innerHTML = "record beendet buffer voll";
   }
  } else {
   outputBuffer.getChannelData(0)[i] = input[i];
  }
  output[i] = 0; //mute ScriptProcessor output
 }
 source.buffer = outputBuffer
 ring.push(source);

 if (ring.length > 10) { // make sure we put at least 10 chunks in the buffer before starting
  playtrougth();
 }
 rms = Math.sqrt(total / (input.length / 2));
 decibel = 20 * (Math.log(rms) / Math.log(10));

 document.getElementById("ausgabe").innerHTML = Math.round(decibel * 100) / 100 + " dB";
}


function RxGrabageCollection() {
 if (garbageBuffer.length > 0) {
  var buf = garbageBuffer.shift();
  buf.disconnect();
 }
}


function playtrougth() {
 var audio = ring.shift();
 audio.playbackRate.value = outRate;
 audio.connect(offlineCtx.destination);
 garbageBuffer.push(audio);
 audio.onended = RxGrabageCollection;
 if (nextTime == 0) {
  nextTime = offlineCtx.currentTime + 0.10; /// add 100ms latency to work well across systems - tune this if you like
 }
 audio.start(nextTime);
 nextTime += audio.buffer.duration;
 console.log(garbageBuffer.length)
}
Irwo in diesen drei funktion steckt das korpus delikti.

ich hab das hier mal gehostet:
OfflineAudioRecoder_test
Die Slider und Button sind erst mal egal.
Funktioniert leider nur noch im FF, Chrome unterstüzt nur noch https bei getUserMedia
 
Zuletzt bearbeitet von einem Moderator:
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

Hi, ich brauche für ein Amateurfunk Projekt eine Voice Verlangsamung zum Senden und zum Empfang eine Verschnellerung.
dann musst du irgendwann warten

ich sehe nicht, wo auf den 2.-10. puffer weitergeschaltet wird.

Code:
if (ring.length > 10) { // make sure we put at least 10 chunks in the buffer before starting
  playtrougth();
 }
wenn du an der stelle schneller den ring füllst als abspielst, laufen mehrere playtrougth() gleichzeitig, keine ahnung was dann passiert, jedenfalls nichts gescheites.

wozu soll das nextTime = offlineCtx.currentTime + 0.10; gut sein?

- - - Aktualisiert - - -

du bekomst ein verlangsammtes Signal, der einfachheit halber sagen wir mal 20 samples / s
deine funktion wird alle 2 samples aufgerufen
dann hast du in ring bei aufruf
1: sample 0 bis 1
2: die aus 1 + sample 2 bis 3
3: die aus aufruf 1 & 2 + sample 4 bis 5
4: die aus aufruf 1,2,3 + sample 6 bis 7
5: die aus aufruf 1 bis 4 + sample 8 bis 9
6: die aus aufruf 1 bis 5 + sample 10 bis 11
7: die aus aufruf 1 bis 6 + sample 12 bis 13
8: die aus aufruf 1 bis 7 + sample 14 bis 15
9: die aus aufruf 1 bis 8 + sample 16 bis 17
10: die aus aufruf 1 bis 9 + sample 18 bis 19
=> hier rufst du playtrougth() auf und spielst sample 0 bis 1 mit 40 samples / s ab, in ring sind jetzt noch 9 einträge der samples 2 bis 19
nach 0,05 sek ist playtrougth() fertig
nach 0,1 sek ist der nächste puffer im onaudioprocess mit sample 20 bis 21 packt diesen in ring, dort sind wieder 10 einträge und nach 0,05 sekunden pause wird playtrougth() wieder aufgerufen und spielt sample 2 bis 3 ...
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

tsseh schrieb:
dann musst du irgendwann warten
Und das ist dass Kernproblem, wenn ich 10min puffere dann höre ich 10 min die stimme in Normaler Geschwindigkeit und dann hakt es ab weil der Puffer schnell leer ist als Daten nachkommen.
Da wollte ich mir mit einem squelch Filter aushelfen.

Aber es wird sowieso alles anders komme gleich darauf zu sprechen.

tsseh schrieb:
wenn du an der stelle schneller den ring füllst als abspielst, laufen mehrere playtrougth() gleichzeitig, keine ahnung was dann passiert, jedenfalls nichts gescheites.
Wenn mehrere Puffer gleichzeig gespielt werden hört man Mehrers gleichzeitig. Die createBufferSource() Objekte müssen natürlich mit der Destination verbunden sein. Deswegen darf sich aber die Lautstärke nicht verändern.


tsseh schrieb:
du bekomst ein verlangsammtes Signal, der einfachheit halber sagen wir mal 20 samples / s
deine funktion wird alle 2 samples aufgerufen
dann hast du in ring bei aufruf
Ähm nee im ring sind keine samples das ist ein normales JS Array wo ich die createBufferSource()'es reinpacke sind im "Ring" 10 createBufferSource() drinnen, beginne ich mit dem Playback.

tsseh schrieb:
wozu soll das nextTime = offlineCtx.currentTime + 0.10; gut sein?
Eine abspiel Verzögerung. Eigentlich x*pi*Ofenrohr=Ruß.;)

nach 0,05 sek ist playtrougth() fertig
nach 0,1 sek ist der nächste puffer im onaudioprocess mit sample 20 bis 21 packt diesen in ring, dort sind wieder 10 einträge und nach 0,05 sekunden pause wird playtrougth() wieder aufgerufen und spielt sample 2 bis 3 ...
?? onaudioprocess ist der event handler vom ScriptProcessor , der kommt je nach Samplerate und framebuffer length alle 8192/44100 = 0.1857....sec.

Das mit den Ringpuffer hat mir nicht gefallen habe darauf noch mal alles umgeworfen:

Code:
var lastPlayedAt = -1;
var bufferSourceOut;
//..... many lines later 

processor.onaudioprocess = function(e) {
				var input = e.inputBuffer.getChannelData(0);
				var output = e.outputBuffer.getChannelData(0);
				var total = 0, rms = 0, decibel = 0;
				var outputBuffer = offlineCtx.createBuffer(1, input.length, Fs);
				for(var i = 0; i < input.length; i++) {
					total += Math.abs(input[i]);
					if(record === true) {
						if(j < audioRecordBuffer.length) {
							audioRecordBuffer[j++] = input[i];
						} else {
							document.getElementById("aufnahme")	.innerHTML = "record beendet buffer voll";
						}
					} else {
						outputBuffer.getChannelData(0)[i] = input[i];
					}
					output[i] = 0; //mute ScriptProcessor output
				}
				 playtrougth(outputBuffer)
				rms = Math.sqrt(total / (input.length / 2));
				decibel = 20 * (Math.log(rms) / Math.log(10));
				document.getElementById("ausgabe").innerHTML = Math.round(decibel * 100) / 100 + " dB";
			}


			function RxGrabageCollection() {
							bufferSourceOut.disconnect();
							bufferSourceOut = null;
			}


			function playtrougth(audio) {
					bufferSourceOut = offlineCtx.createBufferSource();
					bufferSourceOut.buffer = audio;
					bufferSourceOut.gain = 1;
					bufferSourceOut.playbackRate.value = outRate;
					bufferSourceOutonended = RxGrabageCollection;
					bufferSourceOut.connect(gainNode);
				 lastPlayedAt = Math.max(lastPlayedAt + audio.length / Fs, offlineCtx.currentTime + 0.05);
   				bufferSourceOut.start(lastPlayedAt);
			}
Jetzt klingt der Ton so als wenn man durch eine zuhe Nase redet, das knarzen hat sich ganz aufgelöst.
nur die Lautstärke explodiert förmlich und dann ist es mal wider normal usw. FF ist ganz besonders schlimm.

Und jetzt zum Thema warum sich alles ändert:
Es geht nicht darum den Ton zu verlangsamen sondern
Zitat e-Mail:
Ich : Jetzt die Frage ist das Pitch-shift erwünscht oder geht das auch ohne?
A: es muss die sendefrequenz im bereich zwischen 400 und 900 Hz liegen ca.
Dann ist die Kernsache eine ganz andere, gut das ich nochmal gefragt habe. Da muss man die Bandbreite der Stimme dezimieren.
Mit einem Pitch-shift sollte das gehen.
In erster Linie denke ich an einen Phasen-Vocoder aber der Aufwand.:(

ähm die Funktion sollte playthrough heisen das ergibt sinn nicht playtrougth das sehe ich jetzt 2 Uhr nachts xD
 
Zuletzt bearbeitet:
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

Und das ist dass Kernproblem, wenn ich 10min puffere dann höre ich 10 min die stimme in Normaler Geschwindigkeit und dann hakt es ab weil der Puffer schnell leer ist als Daten nachkommen.
Da wollte ich mir mit einem squelch Filter aushelfen.
das ist nun mal so, da kann man sich auch nicht aushelfen

Wenn mehrere Puffer gleichzeig gespielt werden hört man Mehrers gleichzeitig. Die createBufferSource() Objekte müssen natürlich mit der Destination verbunden sein. Deswegen darf sich aber die Lautstärke nicht verändern.
ja, das ist aber nicht gewollt, dass sample x und sample x + n gleichzeitig zu höhren sind, das ergibt tonsalat

Ähm nee im ring sind keine samples das ist ein normales JS Array wo ich die createBufferSource()'es reinpacke sind im "Ring" 10 createBufferSource() drinnen, beginne ich mit dem Playback.
doch, im buffer sind mit createBufferSource erzeugte AudioBufferSourceNodes, und wie das Buffer schon vermuten lässt steckt dahinter ein AudioBuffer welcher samples enthält

Eine abspiel Verzögerung. Eigentlich x*pi*Ofenrohr=Ruß.;)
ja, aber eigentlich sinnlos


?? onaudioprocess ist der event handler vom ScriptProcessor , der kommt je nach Samplerate und framebuffer length alle 8192/44100 = 0.1857....sec.
in meinem beispiel alle 0,1 s weil ich eine andere Samplerate und framebuffer length gewählt habe

Das mit den Ringpuffer hat mir nicht gefallen habe darauf noch mal alles umgeworfen
das was du wolltest geht aber nur mit puffer, eine zeitlang puffern dann abspielen und gleichzeitig weiterpuffern, ist der puffer vollständig abgespielt warten und wieder eine zeitlang puffern ...

Jetzt klingt der Ton so als wenn man durch eine zuhe Nase redet, das knarzen hat sich ganz aufgelöst.
nur die Lautstärke explodiert förmlich und dann ist es mal wider normal usw. FF ist ganz besonders schlimm.
ist das ne frage? noch relevant? ein problem?
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

tsseh schrieb:
da kann man sich auch nicht aushelfen
Doch über einen squelch.

tsseh schrieb:
das was du wolltest geht aber nur mit puffer, eine zeitlang puffern dann abspielen und gleichzeitig weiterpuffern, ist der puffer vollständig abgespielt warten und wieder eine zeitlang puffern ...
Oder nur dann Puffern wenn wenn tatsächlich gesprochen wird. Wären wir wider beim squelch.

tsseh schrieb:
ist das ne frage? noch relevant? ein problem?
Frage ja, Weil sich das singal im Prozess verändert, es es nicht darf, warum?

noch relevant:
nicht wirklich, weil das Problem darin besteht die Stimmt auf ein Spektum von 400Hz bis 900 Hz zu bringen. Bandbreite 500Hz, stimme ~12kHz
A: es muss die sendefrequenz im bereich zwischen 400 und 900 Hz liegen ca.

Nun ist mein Problem das ich nicht weiß ob man mit einem Pitch-shift das überhaupt realisieren kann?
 
Doch über einen squelch.
alles klar, ein squelch, das kleine niedliche haustier von dieter?
laut wiki
Eine Rauschsperre (englisch: Squelch) wird in Kommunikations-Empfangsgeräten benutzt, um Störgeräusche, insbesondere Rauschen während Sendepausen auszublenden
also hat das schon mal nichts mit einer lösung zu tun. wenn du langsammer sendest als abspielst, hast du pausen.
entweder wenige lange durch puffern wie das idR. gelöst wird, oder viele viele kurze, was man nicht macht, da es abgehackt klingt

Oder nur dann Puffern wenn wenn tatsächlich gesprochen wird. Wären wir wider beim squelch.
wenn du das machst, könnte das die lösung sein, unter der vorraussetzung, daß deine redezeit zum verhältniss der verlangsamung passt. ums puffern kommst du nicht drum rum


Frage ja, Weil sich das singal im Prozess verändert, es es nicht darf, warum?
hab nur grob drübergesehen, du pufferst schon mal nicht

nicht wirklich, weil das Problem darin besteht die Stimmt auf ein Spektum von 400Hz bis 900 Hz zu bringen. Bandbreite 500Hz, stimme ~12kHz
A: es muss die sendefrequenz im bereich zwischen 400 und 900 Hz liegen ca.
dann ist ja gut, aber das fällt wieder in die kategorie, du wirfst einen brocken hin den kein mensch nachvollziehen geschweige denn verstehen kann

Nun ist mein Problem das ich nicht weiß ob man mit einem Pitch-shift das überhaupt realisieren kann?
was realisieren? und wer ist pitch und warum schifft der da hin?

- - - Aktualisiert - - -

hab nur grob drübergesehen, du pufferst schon mal nicht
soweit ich das sehe(ich bleibe mal bei meinem beispiel) passiert jetzt folgendes:
nach 0,1 s wird onaudioprocess aufgerufen steckt die samples 0 und 1 in den puffer und ruft playtrougth auf welche die beiden samples in 0,5 s abspielt,
weitere 0,5 s später wird das ganze wiederholt mit sample 2 und 3
usw. usf.
hinzu kommt jetzt noch
Code:
lastPlayedAt = Math.max(lastPlayedAt + audio.length / Fs, offlineCtx.currentTime + 0.05);
bufferSourceOut.start(lastPlayedAt);
offlineCtx.currentTime + 0.05 ignorier ich mal
bleibt
lastPlayedAt = lastPlayedAt + audio.length / Fs
Fs ist soweit ich das sehe audio.length
bleibt
lastPlayedAt = lastPlayedAt + 1
wodurch du beginnend mit 1 beim 1. aufruf von playtrougth mit jedem aufruf 1 ms später startest
du hattest 44100 samples pro s und einen puffer von 8192 samples damit wird onaudioprocess ca. 5 mal pro s aufgerufen(bei mir 10 mal das macht es schlimmer, deswegen jetzt mal mit deinen werten)
damit hast du nach 1 h 18 s verzögerung zw. dem aufruf von playtrougth und dem abspielen des signals
hat das einen grund?
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

tsseh schrieb:
alles klar, ein squelch, das kleine niedliche haustier von dieter?
Nee ein Alpaka von Hagen. Wenn Du nicht weißt was ein squelch ist musst du Fragen.
Oder google anwerfen. Wenn Du Fachbegriffe von die lässst muss ich auch Googlen.

tsseh schrieb:
dann ist ja gut, aber das fällt wieder in die kategorie, du wirfst einen brocken hin den kein mensch nachvollziehen geschweige denn verstehen kann
Brocken... Der ist doch im Harz oder?

Was gibt es da nicht zu verstehe, Die menschliche stimme hat eine Bandbreite von ~12kHz
Zum senden habe ich aber nur ein 500Hz breites Band, da muss alles durch. Die Minimalste Bandbreite Für Sprechfunk ist 2Khz alls darunter versteht man nix mehr. Einseitenbandmodulation auch SSB genannt
http://www.dl9hcg.a36.de/loesungenE/TE101.pdf
https://en.wikipedia.org/wiki/Single-sideband_modulation

Der Für uns Zugesicherter bereich auf 630Meter(Mittelwelle) hat eine Bandbreite von 472-475Khz = 7kHz BW.
Von de Bandbreite gehen weg CW, DIGIMODE[2700HZ], "Alle Sendearten außer FM", DIGIMODE[500HZ] und ein par Baken.

UNd in den Teil "Alle Sendearten außer FM" da muss die Stimme rein und der Teil hat nur eine Banbreite von 500Hz.

tsseh schrieb:
was realisieren? und wer ist pitch und warum schifft der da hin?
Das oben genannte.
Ich kann mir beim besten nicht vorstellen das Du nicht weiß was pitch-shift ist!!
https://en.wikipedia.org/wiki/Pitch_shift

Ob man damit die Bandbriete dezimieren kann mag ich zu bezweifeln.

tsseh schrieb:
10 mal das macht es schlimmer, deswegen jetzt mal mit deinen werten)
damit hast du nach 1 h 18 s verzögerung zw. dem aufruf von playtrougth und dem abspielen des signals
hat das einen grund?
nö, kein tiefen Grund hab das nur schon öfters gesehen und habe es einfach mal probiert.
https://github.com/google/radioreceiver/blob/master/extension/audio.js#L58
https://github.com/grkblood13/web-a...js/binjs-pcm/public/webaudio_binjs_cli.js#L35

Das Problem der Lautstärke liegt aber wo andres nicht an der Programmierung.
Wenn ich in den Line_In ein Lied von einem MP3 Player einführe wird das immer leiser, pasire ich das ist es für 1sec wider voll da und wird dann wider leiser. Irwo ist da ein Auto gain controll aktiv.
 
Zuletzt bearbeitet:
Ich kann mir beim besten nicht vorstellen das Du nicht weiß was pitch-shift ist!!
doch, echt jetz!

wollte gerade schreiben, dass ist dort aber was anderes, dann habe ich bei dir nochmal genauer hingesehen und da ist es auch anders als ich dachte, audio.length und Fs ist nicht das gleiche und damit nicht 1.
in dem beispiel wird damit immer der TIME_BUFFER der am anfang mal draufgeschlagen wurde(wozu auch immer das gut sein soll) kompensiert. sprich am anfang startet der erst nach TIME_BUFFER sekunden mit dem abspielen des 1. buffers, damit der 2. direkt am anschluss abgespielt werden musst du die startzeit des 1. buffers + abspieldauer des 1. buffers als startzeit des 2. buffers nehmen. usw.
bei dir ist fs aber ungleich outRate und deine abspieldauer der buffer damit nicht audio.length / Fs

und was ist das bitteschön für ein grund?
hab das nur schon öfters gesehen und habe es einfach mal probiert
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

tsseh schrieb:
Dann fehlen dir einfach die Grundlagen. Das man nicht weiß was ein squelch oder notch filter ist sehe ich ein. Aber Pitch und Equalizer, delay und Distortion....sollte man kennen wenn sich ein bisschen für Musik interessiert. Und wenn man es mal nicht weiß ist das auch nicht schlimm dafür gibt es google!
Das Google nicht weiß wie man ein Pitch-shifter Programmiert mag ich verstehen, weil um etwas Programmieren zu können muss man erst mall wissen um was geht es überhaupt.


tsseh schrieb:
(wozu auch immer das gut sein soll)
Du weiß es selber nicht. Habe mir selber schon oft die Frage gestellt, naja irgendwer hat sich schon was dabei gedacht :teapot:

tsseh schrieb:
bei dir ist fs aber ungleich outRate und deine abspieldauer der buffer damit nicht audio.length / Fs
FS ist die Samplerate. Das habe ich vergessen zu erwähnen.



tsseh schrieb:
und was ist das bitteschön für ein grund?
In der Verzweiflung kratzt man auch das Moß von den Bäumen.

Und warum ignorierst du das?
xorg1990 schrieb:
Was gibt es da nicht zu verstehe, Die menschliche stimme hat eine Bandbreite von ~12kHz
Zum senden habe ich aber nur ein 500Hz breites Band, da muss alles durch. Die Minimalste Bandbreite Für Sprechfunk ist 2Khz alls darunter versteht man nix mehr. Einseitenbandmodulation auch SSB genannt
http://www.dl9hcg.a36.de/loesungenE/TE101.pdf
https://en.wikipedia.org/wiki/Single...and_modulation

Der Für uns Zugesicherter bereich auf 630Meter(Mittelwelle) hat eine Bandbreite von 472-475Khz = 7kHz BW.
Von de Bandbreite gehen weg CW, DIGIMODE[2700HZ], "Alle Sendearten außer FM", DIGIMODE[500HZ] und ein par Baken.

UNd in den Teil "Alle Sendearten außer FM" da muss die Stimme rein und der Teil hat nur eine Banbreite von 500Hz.

An stat zu schreiben weiß ich nicht, ist nicht machbar, muss ein anders verfahren her etc.
Schreibst du nix.
 
Du weiß es selber nicht.
deswegen schreibe ich das ja. und wenn man das verwendet, sollte man wissen warum und nicht einfach IRGENDWAS hinschreiben.
der einzige grund der mir dazu einfällt ist der, daß mit jedem aufruf ein wenig laufzeit verlohren geht und diese wert als laufzeitreserve über die abspielzeit gedacht ist. allerdings ist diese auch irgendwann aufgebraucht und das ganze somit keine lösung.

Und warum ignorierst du das?
was soll ich dazu schreiben? das ist kein js problem!
die verschiebung sollte kein problem sein, die scalierung schon eher.
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

tsseh schrieb:
und wenn man das verwendet, sollte man wissen warum und nicht einfach IRGENDWAS hinschreiben.
kommt nicht wider vor.

tsseh schrieb:
was soll ich dazu schreiben? das ist kein js problem!
Doch das ist die Aufgabestellung.

tsseh schrieb:
die verschiebung sollte kein problem sein, die scalierung schon eher.
Beides bescheiden, Verschiebung verlangt einen Hilbert-Transformator(Phasenschieber).
Skalierung, noch kein richtigen Plan.:(

Jedenfalls müssen wir nochmal zurück auf Anfang. Erst mal sollte Sendeseitig alles geklärt sein.
Fakten:
Das Sprachband geht von 300Hz bis 3000Hz bei jeden Handy/Telefon mehr wird nicht benötigt (Obertöne irrelevant)
Es soll auf die Frequenz von 400Hz bis 900Hz gebracht werden Bandbreite also 500Hz
Es würden auch 300-800Hz gehen aber nicht unter 300Hz. Die Bandbreite kann auch Weniger sein!
Über die 900Hz wäre jetzt auch kein Problem da bin ich flexibel 1000Hz ist zu viel.

Mit Audacity und SpectrumLab habe ich derweilen mit dem Pitch-shift experimentiert.
Mit eine Pitch shift schafft man es die 2700Hz Bandbreite auf 500Hz runter zudrücken.
Problem Fmin ist 100Hz nach dem Shift, da will ich nicht hin ich muss auf mindestens 300Hz.
D.H 100Hz Fmin und 600Hz Fmax
Um auf 300 Hz zu kommen muss man als mit LO: 200Hz (LO Lokaleroszillator) mischen
Es entstehen also 200+100 = 300Hz und 200+600=800HZ.
und die Spiegelfrequenz 200Hz-100Hz ist wider 100Hz alles mist.
Ergo in den Tiefen Frequenz brauchen wir nicht hantieren, das wird alles murks.

Idee, nach dem Pitch-shift erst mal auf 10kHz hoch mischen und dann auf die Gewünschten 300Hz wider Runter Mischen.

Das weäre die erste These,
die 2te Tehse:

Man selektiert sich das Sprachband via Bandpassfilter
mischt das mit 6,5khz würde also 6800Hz und 9500Hz ergeben.
Dann wird die Wiedergabegeschwindigkeit durch 10 geteilt. Macht auch wider 680 bis 950Hz. Was auch noch geht. Auch gestest mit Audacity.

Ich würde dann beim senden noch ein Startton hinfügen, Worauf bei Empfänger erst die Pufferung beginnt. Sonnst Puffert sich JS ins Nirvana.
Das verlangsamen hätte noch den vorteil das man bein Senden weitestgehend von Störungen befreit ist.
Asso, Live Gespräche finden nicht statt!!!

Das Problem was ich nun habe ist das sich beim Mischen das Seitenband(Spiegelfrequenz) nicht unterdrückt.
Bzw ist das abhäng von der frequenz 1500Hz mit 1000Hz LO freq., ist der Trägerder bei 2500Hz kommt völlig weg, aber mische 100Hz mit 1000Hz lo freq ist nix unterdrückt bei Träger sind da.

Das 2te Problem ist ich weiß nicht wie man die Seitenbänder wechselt. muss ich die variabel dbl_i und dbl_q tauschen? oder die Hilbert Koeffizienten anders berechen?

Die Hilbert Mathematik hole ich immer aus dem arrl handbook
Das kann ich dir schlecht rüberbeamen, dass mus auch gehen: http://www.diru-beze.de/modulationen/skripte/SuS_W0506/SSB_VSB_Modulation_WS0506.pdf

Code:
function Hilbert(VFO_Freq, Samplerate, upper) {
    this.upper = upper;
    this.FILTER_LEN = 100; //FIR Hilbert length 
    this.VFO_Sine = new audioLib.Oscillator(Samplerate, VFO_Freq);
    this.VFO_Cosine = new audioLib.Oscillator(Samplerate, VFO_Freq);
    this.VFO_Sine.waveShape = 'sine';
    this.VFO_Cosine.waveShape = 'cosine';
    this.queue_ptr = 0;
    this.iDelayIndex = 0;
    this.DelayQueue = new Float32Array(this.FILTER_LEN);
    this.BufferQueue = new Float32Array(this.FILTER_LEN);
    this.calcCoeff();
}

Hilbert.prototype.calcCoeff = function() {
    var HILBERT_ARRAY = new Float64Array(this.FILTER_LEN);
    for (var jj = 0; jj < this.FILTER_LEN / 2; jj++) {
        var coeff = jj & 1 ? 2.0 / ((this.FILTER_LEN / 2 - jj) * Math.PI) : 0.0; //<- Implementierung W Kiefer
        HILBERT_ARRAY[jj] = coeff;
        HILBERT_ARRAY[this.FILTER_LEN - jj] = -coeff;
    }
//Hanning window
for(var I=0;I<this.FILTER_LEN;I++){
    HILBERT_ARRAY[I]*=(0.5+0.5*Math.cos(2*Math.PI*(I-this.FILTER_LEN/2+1)/(this.FILTER_LEN)));//Korrektur von DH1AKF
}

    this.coeffs = HILBERT_ARRAY;
};

Hilbert.prototype.setUsbLSB = function(b){
        if("USB" ===  b){
            this.upper=true;
        }else{
            this.upper=false;
        }
}


Hilbert.prototype.setFreq = function(freq){
    this.VFO_Sine.frequency = freq;
    this.VFO_Cosine.frequency = freq;
}

Hilbert.prototype.pushSamples = function(BlockofSamples) {
	var len = BlockofSamples.length;
    var SamplesBuffer = new Float32Array(len);

   for(var j=0;j<len;j++){
        //generate the sine samples from audiolib.js
        this.VFO_Sine.generate();
        this.VFO_Cosine.generate();

        var Sine = this.VFO_Sine.getMix();
        var Cosine = this.VFO_Cosine.getMix();


        var dbl_i = BlockofSamples[j] * Sine; 
        var dbl_q = BlockofSamples[j] * Cosine;
        
        //Let the I-channel run through a delay line
        if (this.iDelayIndex >= this.FILTER_LEN / 2) this.iDelayIndex = 0;
        y = this.DelayQueue[this.iDelayIndex];
        this.DelayQueue[this.iDelayIndex++] = dbl_i; //<- DelayLine input
        dbl_i = y;

        //Ringbuffer pointer calculation
        this.queue_ptr = (this.queue_ptr + 1) % this.FILTER_LEN;
        this.BufferQueue[this.queue_ptr] = dbl_q; //<- Hilbert trafo input
        var n = this.queue_ptr;
        var out = 0.0;

        for (var i = 0; i < this.FILTER_LEN; i++) {
            out += this.coeffs[i] * this.BufferQueue[n]; // accumulate the Hilbert coeffs with the Q-Channel samples 
            n--;
            if (n < 0) n += this.FILTER_LEN;
        }

        dbl_q = out;
        var Sample = dbl_q + dbl_i;
        SamplesBuffer[j] = Sample;
    } //ende for
    return SamplesBuffer;
};
pushSamples wird durch den onaudioprocess aufgerufen
Die Oszillatoren kommen bei mir von audiolib
https://github.com/jussi-kalliokosk...63406db6ea529318/src/generators/oscillator.js
Weil der auch cosine kann
Code:
processor.onaudioprocess = function(e) {
var input = e.inputBuffer.getChannelData(0);
var output = e.outputBuffer.getChannelData(0
var mix = hilbert.pushSamples(input);
output.set(mix);

diesmal keine brocken!?
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

ich würde die berechnung ja im bildbereich durchführen, das ist ja gerade der vorteil
das problem bei der scalierung ist, daß du viele frequenzen zusammenfassen musst.
 
AW: [Web Audio API] Lautstärke schwangt, sound übersteuert, klingt blechern

ja, den frequenzbereich
dann könntest du einfach die frequenzen des originalfrequenzbereiches nehmen und entweder
* mehrere frequenzbereiche weiter zusammenfassen und in den entsprechenden bereich mappen oder
* die frequenzbereiche des originalfrequenzbereiches in mehrere des eingeschränkten frequenzbereiches aufteilen
 
Zurück
Oben