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

Audio klingt komisch, Fensterfunktion gehen nicht

tsseh schrieb:
naja, die frage ist ja schon mal, was ist das für ein signal?
Ein Signal was von einer mini-wip(der antenne) durch einen Direktmischer in eine Soundkarte geleitet wird. Der Rest ist dann klar.
Schema des Mischers.
Grabberscheme.jpg


tsseh schrieb:
ist das überhaupt normiert?
Vom meiner Seite aus nicht.

tsseh schrieb:
was bedeutet das für dein ursprungssignal?
https://de.wikipedia.org/wiki/Bel_(Einheit)
wenn du rein nach definition gehst, ist dein db-wert = 10*log10(fft-amplitude) und deine fft-amplitude würde dem quadrat der echten amplitude entsprechen.(wobei deine amplitude bezogen auf eine referenz amplitude sind)
womit dann db-wert = 20*log10(echten amplitude)=10*log10(fft-amplitude)
das wird es aber nicht sein
gut, gilt also db-wert = 10*log10(echten amplitude) und echten amplitude = normierungsfaktor * fft-amplitude
Hm Bel nie gehört. Ist bestimmt wider so'ne Neuerfindung wie Gon und Grad, Lux zu Lumen. Schwachsinn.
Das Ursprungssignal bleibt bis zur FFT unverändert, mal abgesehen der Fensterfunktion.


Also kann ich auch schreiben: (log10 gibts erst seit ecma6.. gut man könnte auch den Polyfill nutzen)
20 * Math.log(FFT Value) * Math.LOG10E

warum jetzt -50? wenn du -120dB bis -10dB darstellen willst?
Ich habe zusätzlich zum Wasserfallspektrum einen Spektrum bar graph. Da werden die Db's angezeigt von -120 bis -10. Alles Was lauter ist als -10 schießt über canvas drüber raus.

Das Wasserfallspektrum sagt nicht aus wo das Quantisierungsrauschen( rounding noise ('grass'))der Soundkarte ist, eine Amplitude graph aber schon.
Hier im bild bei -200dB
FFT_window_FlatTop-196dB.png

In SL steht geschriben:
Amplitude Range and Spectrogram Options (tab 2)
Allows you to reduce the displayed amplitude range for the waterfall and spectrum graph. The default settings cover a large dynamic range (like -120 dB to 0 dB). If, for example, you are only interested in weak signals between -60 and -50 dB, adjust this range accordingly.
Note: Of course, you can adjust the waterfall colour palette with the 'contrast' and 'brightness' sliders, so everything below -60 dB will be black for example, and everything above -50 dB will be white; but reducing the displayed amplitude range here will also make the spectrum graph look better.

Bei den Sildern steht widerum:
Note: Instead of cranking up the "contrast" slider to the maximum (to dig weak signals out of the noise), you can also reduce the 'Displayed Amplitude Range' in the spectrum display configuration as explained here . For example, if the "interesting" signals are all in the range -60 dB to -50 dB, don't use an amplitude display range of -120 dB to 0 dB (instead, use -70 dB to -40 dB ).
Quellen:
Spectrum Lab Configuration Dialog
Spectrum Lab Main Window and Controls

Das heist also:
die wenn ich eine "Decibel Grid" darstelle von -120bis-10 und der peak geht bis -40db dann muss das stimmen.
Was dann auf den Wasserfall erscheint ist trivial, bzw. das macht der Kontrast und Helligkeitsregler.

ich sehe da keine "pseudo" träger, sondern ungenauigkeiten nahe 0
Wenn ich die FFt values in db umreche müssten ja die Ungenaugkeiten sogut wie weg sein richtig.
 
Ein Signal was von einer mini-wip(der antenne) durch einen Direktmischer in eine Soundkarte geleitet wird. Der Rest ist dann klar.
also ein reines audio signal?! und wie ist das definiert?

Vom meiner Seite aus nicht.
ich vermute: doch


Hm Bel nie gehört. Ist bestimmt wider so'ne Neuerfindung wie Gon und Grad, Lux zu Lumen. Schwachsinn.
db -> dezibel -> 10*bel

In SL steht geschriben:


Bei den Sildern steht widerum:

Quellen:
Spectrum Lab Configuration Dialog
Spectrum Lab Main Window and Controls

Das heist also:
die wenn ich eine "Decibel Grid" darstelle von -120bis-10 und der peak geht bis -40db dann muss das stimmen.
Was dann auf den Wasserfall erscheint ist trivial, bzw. das macht der Kontrast und Helligkeitsregler.
was auch immer du damit sagen willst

Wenn ich die FFt values in db umreche müssten ja die Ungenaugkeiten sogut wie weg sein richtig.
ne, die werden größer, dein faktor 10000000000 entspricht 100db verstärkung

- - - Aktualisiert - - -

oder anschaulicher, dein max von 0,03 bei 1500hz entspricht -15db und der rest um 10^-11 bis 10^-14 entspricht -110 bis -140 db
die werte rücken enger zusammen
 
tsseh schrieb:
und wie ist das definiert?
Was genau meist du die Auflösung. das wären 16bit.

tsseh schrieb:
ich vermute: doch
Aha und woran machst du das Fest?

tsseh schrieb:
ne, die werden größer, dein faktor 10000000000 entspricht 100db verstärkung
der Faktor ist ja hinfällig, war blos dazu da um die Ungenauigkeit darzustellen, wo ich dacht das ein ein Fehler in den Fenterfunktionen.

tsseh schrieb:
oder anschaulicher, dein max von 0,03 bei 1500hz entspricht -15db und der rest um 10^-11 bis 10^-14 entspricht -110 bis -140 db
In SL kann ich kein Ungenauigkeiten feststellen, dann hat Wolfgang die Weggerechnet aber wie? Oder gibt es in C keine?

Apropo Analyser, am 24. Oktopber sendet der SAQ Grimeton auf 17.2 kHz, Wenn du ein paar Meter Draht(Lambda Halbe) an deine Soundkarte Stöpselst kannst du den "höheren" mit SpektumLab kannst du ihn bestimmt Sichtbar machen wenn der Signal-Rauschabstand stimmt. Bei Erfolgreicher Visualisirung kannst du einen Screenshot machen und an eine Adresse senden die ich gerade nicht weiß und bekommt dafür eine Postkarte.
Der Abstimmvorgang beginnt um 09:30 UTC und die eigentliche Sendung um 10:00 UTC.
Oder du fährst gleich hin. Vor Ort ist die Station für Besucher in der Zeit von 10 bis 15 Uhr Lokalzeigt geöffnet, der Eintritt ist frei.
Dafür gibt ordentlich was zu sehen
https://www.youtube.com/watch?v=-S6gXmElHoI

Vielleicht interessiert dich ja Etwas Technik.
 
Was genau meist du die Auflösung. das wären 16bit.
die auflösung ist egal, ob das ewin normiertes signal ist

Aha und woran machst du das Fest?
irgendwo muss das ja definiert sein

der Faktor ist ja hinfällig, war blos dazu da um die Ungenauigkeit darzustellen, wo ich dacht das ein ein Fehler in den Fenterfunktionen.
ich denke du willst hineinzoomen? also in den amplitudenbereich

In SL kann ich kein Ungenauigkeiten feststellen, dann hat Wolfgang die Weggerechnet aber wie?
keine ahnung was sl ist und was wolfgang damit zu tun hat
Oder gibt es in C keine?
nein nochmal, das ist so festgelegt: IEEE 754

Apropo Analyser, am 24. Oktopber sendet der SAQ Grimeton auf 17.2 kHz,
geil, da warte ich schon jahre drauf
 
tsseh schrieb:
die auflösung ist egal, ob das ewin normiertes signal ist
der Line-in Eingang ist Normiert von 0 bis 1 Volt, falls du das meinst.


tsseh schrieb:
keine ahnung was sl ist und was wolfgang damit zu tun hat
SL = SpektrumLab, Wolfgang = WhoAmI (Der Programmier und Erfinder von SpektrumLab).


tsseh schrieb:
geil, da warte ich schon jahre drauf
Dein Sarkasmus ist doof, wenn dich sowas nicht Interessiert, dann Schreib: "Interessiert mich nicht".

kkapsner schrieb:
deci ist ein Zehntel -> 1/10 * bel
Dezibel kann ja auch vieles sein es gibt dBi, dBm usw. Wobei dBi schon wider Schwachsinn ist, weil einen echten Isotropstrahler gibt es nicht.. die Sonne wäre einer.
 
Hi, ich muss das ganze doch noch mal hochholen weil, funktioniert doch nicht so wie ich will:mad:

Ich habe mich dazu entschlossen die fft werde in dB umzuwandeln und diese werte möchte ich dann rendern aber wohin muss ich die Chroma limits setzen?
Die Umwandlung ist daher sinnvoll weil ich ja in den Amplitudenbereich hereinzukommen möchte, der User gibt die dB ein (z.B. -140 bis -70). Rechnet sich einfacher.


Das mit der Normirung habe ich immer noch nicht verstanden.
in #40 schribe tsseh
tsseh schrieb:
wir hatten ja bisher quasi ein normiertes. muss das normiert sein, weil die audio libs das so brauchen? ist das überhaupt normiert?
wir hatten ja bisher quasi ein normiertes.
- Warum wo... weil ich eine feste Amplitude gegeben habe.
muss das normiert sein, weil die audio libs das so brauchen?
- Von meiner Seite aus muss dann nicht normiert sein je mehr Verarbeitungsprozesse desto schlechter. Ob audiolib das so möchte kein Ahnung.

Bei den Helligkeit und Kontrast slidern handelt es sich um eine Geradengleichung mit Offset und Steigung. Das habe ich nachgefragt.
Wobei Offset meist ein Addition ist, wird dann wohl die Helligkeit sein und die Steigung der Kontrast.

Wenn ich jetzt kein normiertes Signal habe dann mache ich schon bei der Umwandlung der FFT werte in db die "Ungenauigkeiten" sichtbar was ich ja nicht möchte.
Also muss ich Zwangsläufig vor der FFT Normieren??

Audio lib bietet ein Limiter kann ich den auch zu Normierung nutzen?
https://github.com/jussi-kalliokoski/audiolib.js/blob/master/src/effects/limiter.js
Welche werte muss ich den da eintragen das alles irwi sinnvoll ist?

Was wäre dann der Faktor den ich auf die FFt Werte wider mult. muss?

Warum muss das alles so kompliziert sein?

- - - Aktualisiert - - -

Hi, ich muss das ganze doch noch mal hochholen weil, funktioniert doch nicht so wie ich will:mad:

Ich habe mich dazu entschlossen die fft werde in dB umzuwandeln und diese werte möchte ich dann rendern aber wohin muss ich die Chroma limits setzen?
Die Umwandlung ist daher sinnvoll weil ich ja in den Amplitudenbereich hereinzukommen möchte, der User gibt die dB ein (z.B. -140 bis -70). Rechnet sich einfacher.


Das mit der Normirung habe ich immer noch nicht verstanden.
in #40 schribe tsseh
tsseh schrieb:
wir hatten ja bisher quasi ein normiertes. muss das normiert sein, weil die audio libs das so brauchen? ist das überhaupt normiert?
wir hatten ja bisher quasi ein normiertes.
- Warum wo... weil ich eine feste Amplitude gegeben habe.
muss das normiert sein, weil die audio libs das so brauchen?
- Von meiner Seite aus muss dann nicht normiert sein je mehr Verarbeitungsprozesse desto schlechter. Ob audiolib das so möchte kein Ahnung.

Bei den Helligkeit und Kontrast slidern handelt es sich um eine Geradengleichung mit Offset und Steigung. Das habe ich nachgefragt.
Wobei Offset meist ein Addition ist, wird dann wohl die Helligkeit sein und die Steigung der Kontrast.

Wenn ich jetzt kein normiertes Signal habe dann mache ich schon bei der Umwandlung der FFT werte in db die "Ungenauigkeiten" sichtbar was ich ja nicht möchte.
Also muss ich Zwangsläufig vor der FFT Normieren??

Audio lib bietet ein Limiter kann ich den auch zu Normierung nutzen?
https://github.com/jussi-kalliokoski/audiolib.js/blob/master/src/effects/limiter.js
Welche werte muss ich den da eintragen das alles irwi sinnvoll ist?

Was wäre dann der Faktor den ich auf die FFt Werte wider mult. muss?

Warum muss das alles so kompliziert sein?:distress:
 
Hi, ich muss das ganze doch noch mal hochholen weil, funktioniert doch nicht so wie ich will:mad:
ohh, jetzt erst gelesen und wenig zeit

Ich habe mich dazu entschlossen die fft werde in dB umzuwandeln und diese werte möchte ich dann rendern aber wohin muss ich die Chroma limits setzen?
keine ahnung, auf den bereich, den du darstellen möchtest
der User gibt die dB ein (z.B. -140 bis -70).
z.b. auf -140 bis -70


wir hatten ja bisher quasi ein normiertes.
- Warum wo... weil ich eine feste Amplitude gegeben habe.
ja, wir hatten eine feste Amplitude von kleiner 1, womit wir davon ausgehen können, dass die max. Amplitude 1 ist, dass sie das bei uns nicht wird, ist erst mal nicht wichtig.

muss das normiert sein, weil die audio libs das so brauchen?
- Von meiner Seite aus muss dann nicht normiert sein je mehr Verarbeitungsprozesse desto schlechter. Ob audiolib das so möchte kein Ahnung.
das musst du ja aber wissen, weil du sonst dein eingangssignal, was ja nicht über webaudio, sondern über ip kommt, normieren musst.

Wenn ich jetzt kein normiertes Signal habe dann mache ich schon bei der Umwandlung der FFT werte in db die "Ungenauigkeiten" sichtbar was ich ja nicht möchte.
Also muss ich Zwangsläufig vor der FFT Normieren??
das ist jacke wie hose, normieren musst du dein eingangssignal, wenn die web audio api das so verlangt. wenn die audiolib ein normiertes signal verlangt, musst du spätestens davor normieren, wenn die web audio api KEINE verlangt. verlangen beide keine, auch gut, musst du überhaupt nicht normieren
ob du normierst oder nicht, hilft dir aber immer noch nicht weiter für deine limits.
ob du min. amplitude/max. amplitude erst auf 0/1 normierst und dann die limits im bereich 0/1 legst, oder gleich im bereich min. amplitude/max. amplitude ändert ja nichts. klar, willst du den gesammten bereich abdecken, rechnet es sich mit 0/1 besser, diese rechnung nimmt dir ja aber chroma.js ab

Audio lib bietet ein Limiter kann ich den auch zu Normierung nutzen?
https://github.com/jussi-kalliokoski/audiolib.js/blob/master/src/effects/limiter.js
Welche werte muss ich den da eintragen das alles irwi sinnvoll ist?
keine ahnung, muss ich mir erst mal ansehen, aber nochmal, du musst ja wissen, was du für signale darstellen willst. wenn es nicht deine signale sind, sondern anwendersignale, musst du dir von diesem die grenzen mitgeben lassen. bekommst du vom anwender schon ein normiertes signal, bist du entweder fein raus, weil du ihm das einfach normiert anzeigst, oder besser du lässt dir von diesem doch wieder die grenzen geben, um deine achse entsprechend seinem signal zu bemaßen.
 
ohh, jetzt erst gelesen und wenig zeit
macht nix.

tsseh schrieb:
z.b. auf -140 bis -70
Nee das geht nicht so ohne weiteres, weil -140 wäre dunker und -70 heller, Chroma dreht das um -70 ist dunkler als -140. Mit eine Multiplikation mit mal -1 ist das nicht getan.
Negative zahlen gehen sowieso nicht, da passiert nix.


tsseh schrieb:
ja, wir hatten eine feste Amplitude von kleiner 1, womit wir davon ausgehen können, dass die max. Amplitude 1 ist, dass sie das bei uns nicht wird, ist erst mal nicht wichtig.
Ah, deswegen hast du die Chroma limits von 0-1 gesetzt.

tsseh schrieb:
ob du min. amplitude/max. amplitude erst auf 0/1 normierst und dann die limits im bereich 0/1 legst, oder gleich im bereich min. amplitude/max. amplitude ändert ja nichts. klar, willst du den gesammten bereich abdecken, rechnet es sich mit 0/1 besser, diese rechnung nimmt dir ja aber chroma.js ab
Ja sicher nimmt mir das rechnen chroma ab aber, zum einen habe ich noch ein Bargraphen (Path) der der auf ein Gitter grendert wird und das Gitter geht von -140 bis -70 db bei einen peak von -100db geht der Path eben nur bis -100.
Zum anderen möchte ich ein Gradient rendern in den Farben die der User eingegeben hat und unten drunter eine scala mit den dB werten.
Wenn also der Farbverlauf schwarz, dunkel blau, blau , hell blau, weiß ist, ist ein peak mit -150 schawarz -140 kaum zu sehn -100 db schön blau und alles was mehr als -70 db ist weiß.
So kann man dann nach stunden noch erkennen wie laut den jemand gesendet hat.

Jetzt kommt der kniff mit den Kontrast, Helligkeit slidern.
Ein User sieht bei -140db im Spektrum... "Da könnte jemand gesendet haben" und schiebt an den slidern bis er das Signal gut erkennen kann(Er macht sich das Spektrum hübsch).
Der Clou ist die Geradengleichung an das Gradient anzugleichen.
z.B. Schiebt jemand an den Helligkeit Regler(Offset) wird ein peak der bei -140db kaum zu sehen ist immer heller, passen dazu muss das Gradient wandern, das was auf den spektum zu sehn ist muss auch mit den Gradient Werten passen. Beim Kontrast ist das wider anders, der schränkt das ganze ein, es gibt dann kein dunkel und hellblau mehr. z.B sind -140 bis -110dB schwarz,-110 bis -90 blau und -90 bis -70 weiß.

Das einfachste wäre die silder gehen von 0 bis 255 und chroma von 0 bis 256.

Hoffe du verstehst das soweit.

Bevor wir jetzt anfangen etwas mit Slidern zu machen muss das ganze erst mal statischer funktionieren. Sprich dB eingabe, Gradient rendern, Spektrum rendern, Path rendern, wenn das alles stimmt kommen wir zu den Schiebereglern.


tsseh schrieb:
keine ahnung, muss ich mir erst mal ansehen, aber nochmal, du musst ja wissen, was du für signale darstellen willst. wenn es nicht deine signale sind, sondern anwendersignale, musst du dir von diesem die grenzen mitgeben lassen. bekommst du vom anwender schon ein normiertes signal, bist du entweder fein raus, weil du ihm das einfach normiert anzeigst, oder besser du lässt dir von diesem doch wieder die grenzen geben, um deine achse entsprechend seinem signal zu bemaßen.
Naja der Anwender gibt ja sowieso ein welchen Amplitudenbereich er darstellen möchte. Ob die audiolib nun ein Normiertes Signal haben möchte kann ich nirgends finden.
 
ich verstehe nicht wo du ein problem hast
Nee das geht nicht so ohne weiteres, weil -140 wäre dunker und -70 heller, Chroma dreht das um -70 ist dunkler als -140. Mit eine Multiplikation mit mal -1 ist das nicht getan.
Negative zahlen gehen sowieso nicht, da passiert nix.
ist das dein problem?
ich hab das mal ausprobiert, hab die aktuelle chroma.js genommen, geht alles

Ja sicher nimmt mir das rechnen chroma ab aber, zum einen habe ich noch ein Bargraphen (Path) der der auf ein Gitter grendert wird
was hat das eine mit dem anderen zu tun?

und das Gitter geht von -140 bis -70 db bei einen peak von -100db geht der Path eben nur bis -100.
ja, und?

Zum anderen möchte ich ein Gradient rendern in den Farben die der User eingegeben hat und unten drunter eine scala mit den dB werten.
als legende? ok!

Jetzt kommt der kniff mit den Kontrast, Helligkeit slidern.
ja, wenn der user die werte eingibt ist doch alles klar

Das einfachste wäre die silder gehen von 0 bis 255 und chroma von 0 bis 256.
warum auch immer das das einfachste wäre, aber klar, kannst du auch machen, dann musst du eben die werte, ehe du sie in chroma reinschiebst erst auf den bereich 0 bis 256 normieren

Bevor wir jetzt anfangen etwas mit Slidern zu machen muss das ganze erst mal statischer funktionieren. Sprich dB eingabe, Gradient rendern, Spektrum rendern, Path rendern, wenn das alles stimmt kommen wir zu den Schiebereglern.
ja, ich sehe kein problem

Ob die audiolib nun ein Normiertes Signal haben möchte kann ich nirgends finden.
das ist/sind das/die einzige(n) problem(e) die ich noch sehe
* ist dein eingangssignal normiert
* erwartet die web audio api ein normiertes signal
* erwartet die audiolib ein normiertes signal

- - - Aktualisiert - - -

Das einfachste wäre die silder gehen von 0 bis 255 und chroma von 0 bis 256.
das sehe ich jetzt erst, warum geht der silder von 0 bis 255 und chroma von 0 bis 256?
das ergibt keinen sinn, gut, die kleine ungenauigkeit wirst du nicht mal bemerken, aber warum WILLST du diese?
 
tsseh schrieb:
was hat das eine mit dem anderen zu tun?
Eben nix aber warum soll ich mit 2 verschieden Werten arbeiten? Ich möchte ich kann doch das Spektrum und den path mit den dB werten rendern.
So kann man falls der User Die Legende in Volt haben möchte die werte einfacher umrechnen.

tsseh schrieb:
Legende ja das ist das richtige Wort

tsseh schrieb:
warum auch immer das das einfachste wäre, aber klar, kannst du auch machen, dann musst du eben die werte, ehe du sie in chroma reinschiebst erst auf den bereich 0 bis 256 normieren
+
tsseh schrieb:
das sehe ich jetzt erst, warum geht der silder von 0 bis 255 und chroma von 0 bis 256?
das ergibt keinen sinn, gut, die kleine ungenauigkeit wirst du nicht mal bemerken, aber warum WILLST du diese?
Einfacher deshalb weil wenn der User die dBs ändert müsste ich jedesmal die Chroma limits ändern + das Limit der slider oder deren step-scale.
Ist es nicht sinnvoller hzerzugehen und alles auf eine Wert zu bringen chroma 0-256 slider 0-256 step = 1. nicht gut??
Und nein die Ungenauigkeiten sollen nicht erscheinen.



tsseh schrieb:
das ist/sind das/die einzige(n) problem(e) die ich noch sehe
* ist dein eingangssignal normiert
* erwartet die web audio api ein normiertes signal
* erwartet die audiolib ein normiertes signal
Sind das jetzt fragen?
Nein Eingangssignal ist nicht normiert warum sollte ich das auch tun? ich sample mit 16 bit die web audio api arbeitet mit 32 bit, ich komme doch nie an die grenzen der 32 bit.
Würde ich höher auflösen als letztendlich verarbeitet wird kann ich das verstehen aber andersrum :confused: Ich weiß garn ich wohin ich Normieren soll.
 
Einfacher deshalb weil wenn der User die dBs ändert müsste ich jedesmal die Chroma limits ändern + das Limit der slider oder deren step-scale.
anstelle der grenzwerte in deinem werteberich in chroma als grenzen einzutragen findest du es einfacher deine werte in den bereich 0-256 zu bringen um die grenzen in chroma nicht anpassen zu müssen?

Sind das jetzt fragen?
ja, fragen die geklärt werden müssen

Nein Eingangssignal ist nicht normiert warum sollte ich das auch tun?
nicht du, der anwender, du musst es nur tun, wenn das eingangssignal nicht normiert ist aber die web audio api es so verlangt

ich sample mit 16 bit die web audio api arbeitet mit 32 bit, ich komme doch nie an die grenzen der 32 bit.
was heißt du samplest mit 16 bit? du hast eine auflösung von 16 bit?
aber in welchem bereich? reden wir über einen ad-wandler?
dann hast du noch eine stufe mehr, dein eingangssignalbereich wird auf den bereich 0-65535 abgebildet. damit kommt die web audio api klar?

Würde ich höher auflösen als letztendlich verarbeitet wird kann ich das verstehen aber andersrum :confused:
über auflösung haben wir noch gar nicht gesprochen. 16 bit auflösung im int-bereich sind 65536 verschiedene werte. die kannst du im gleitkommabereich mit FLT_EPSILON = 1E-5 im bereich 0 - 1 locker einhalten

Ich weiß garn ich wohin ich Normieren soll.
du musst es aber wissen. dass die audiolib nur im bereich 0-1 arbeitet hast du ins spiel gebracht.
dass ein audiosignal in digitaler form und damit auch der input der web audio api ingendwie definiert sein muss dürfte logisch klar sein.
nur wie genau ist es definiert?
ist dein eingangssignal vom anwender denn immer ein audiosignal? wenn ja ist alles gut, dann müsstest du aber auch nicht immer die grenzwerte vom anwender verlangen, weil die dann immer gleich sein müssten.
 
Zuletzt bearbeitet:
tsseh schrieb:
anstelle der grenzwerte in deinem werteberich in chroma als grenzen einzutragen findest du es einfacher deine werte in den bereich 0-256 zu bringen um die grenzen in chroma nicht anpassen zu müssen?
Ist es nicht schlau die chroma Limits + die Slider bis 256 gehen zu lassen und die FFT Werte bis 256?? Sonnst müsste man sobald ein User die Amplitudenbereich ändert immer an drei stellen operieren.


tsseh schrieb:
aber in welchem bereich? reden wir über einen ad-wandler?
dann hast du noch eine stufe mehr, dein eingangssignalbereich wird auf den bereich 0-65535 abgebildet. damit kommt die web audio api klar?
Ja AD-Wandler und nein die Int 16Bit werten in flaot 32 gewandelt in der script node
sample = sample > 0 ? sample / 32767.0 : sample / 32768.0;


tsseh schrieb:
. dass die audiolib nur im bereich 0-1 arbeitet hast du ins spiel gebracht.
Ja habe ich weil die Audio Api nur mit float 32 im bereich -1 bis +1 arbeitet, sodass audiolib auch so arbeitet, gehe ich von aus.

tsseh schrieb:
ist dein eingangssignal vom anwender denn immer ein audiosignal? wenn ja ist alles gut, dann müsstest du aber auch nicht immer die grenzwerte vom anwender verlangen, weil die dann immer gleich sein müssten.
Jup ist immer ein Audio Signal und immer 16 bit.
 
Ist es nicht schlau die chroma Limits + die Slider bis 256 gehen zu lassen und die FFT Werte bis 256?? Sonnst müsste man sobald ein User die Amplitudenbereich ändert immer an drei stellen operieren.
kannst du so machen, ich höätte es nicht gemacht, aber mach.


Ja AD-Wandler und nein die Int 16Bit werten in flaot 32 gewandelt in der script node
sample = sample > 0 ? sample / 32767.0 : sample / 32768.0;
also normierst du ja schon, auf den bereich +-1


Ja habe ich weil die Audio Api nur mit float 32 im bereich -1 bis +1 arbeitet, sodass audiolib auch so arbeitet, gehe ich von aus.
und worüber reden wir dann die ganze zeit?

Jup ist immer ein Audio Signal und immer 16 bit.
also alles klar
 
tsseh schrieb:
also normierst du ja schon, auf den bereich +-1
Ja aber sagtest du nicht das ich eine Normierungsfaktor zu denn fft werten multiplizieren muss?


tsseh schrieb:
Nein ist es nicht, wenn ich den user Die Einstellung der Dezibels überlasse dann komme nimmer wider die "Ungenauigkeiten" zu Tage, das darf unter keinen Umständen Passieren.
Selbst wenn der USer Quatsch einstellt wie -1000db bis 0 db oder -95 bis -90dB.

Habe gerade herausgefunden das wenn ich bei den Chroma Limits im negativen bereich bleibe, dann kommen die Ungenauigkeiten nicht zum vorschein.
Ich rechne also die FFT Werte in Db um, dann normiere ich auf 0-256 und setzte die limits [-256, 0].
Jetzt muss ich nur noch wissen was ich mit den dB werten machen muss die der user einstellt.
Auf die normierten 0-256 dazu Addieren?? Das gleiche dann einen Offset d.h wenn -120dB eingestellt sind dann fängt alles bei -120 an.
 
Zuletzt bearbeitet:
Ja aber sagtest du nicht das ich eine Normierungsfaktor zu denn fft werten multiplizieren muss?
laut deiner letzten aussage nicht
* das signal das anwenders ist ein audoisignal und damit im bereich -1 bis 1
* das wandelt er warum und wie auch immer in ein 16 bit wert bereich
* das wandelst du wieder in ein audiosignal
schickst das durch deine verarbeitung und bekommst fft-transformierte werte mit amplituden im bereich -1 bis 1
=> ursprungssignal ist im bereich -1 bis 1 genau wie die fft werte
wandelst du diese in db hast du keine verschiebung zu den ursprungswerten

Nein ist es nicht, wenn ich den user Die Einstellung der Dezibels überlasse dann komme nimmer wider die "Ungenauigkeiten" zu Tage, das darf unter keinen Umständen Passieren.
Selbst wenn der USer Quatsch einstellt wie -1000db bis 0 db oder -95 bis -90dB.
die "Ungenauigkeiten" sind aber nun mal da
sonst musst du diese rausfiltern, aber das kann auch falsch sein

Habe gerade herausgefunden das wenn ich bei den Chroma Limits im negativen bereich bleibe, dann kommen die Ungenauigkeiten nicht zum vorschein.
dann machst du was falsch

Ich rechne also die FFT Werte in Db um, dann normiere ich auf 0-256 und setzte die limits [-256, 0].
ähhh, du hast werte im bereich 0 bis 256 und stellst werte im bereich -256 bis 0 dar? dann siehst du nichts

Jetzt muss ich nur noch wissen was ich mit den dB werten machen muss die der user einstellt.
welche db werte? die die der anwender sehen will in der farbscala? die wolltest du doch auf 0-256 mappen.
und musst dann deine fft werte auch entsprechend den db-grenzwerten den anwenders umrechnen

Auf die normierten 0-256 dazu Addieren??
ähhhh neee

Das gleiche dann einen Offset d.h wenn -120dB eingestellt sind dann fängt alles bei -120 an.
???
 
tsseh schrieb:
das wandelt er warum und wie auch immer in ein 16 bit wert bereich
Der ADC Wandelt in 16 bit Bereich.
tsseh schrieb:
das wandelst du wieder in ein audiosignal
Ob nun 16 bit oder flaot32 bit Audio spielt kein rolle, ich normiere auf den bereich den die audio api haben möchte.

tsseh schrieb:
=> ursprungssignal ist im bereich -1 bis 1 genau wie die fft werte
wandelst du diese in db hast du keine verschiebung zu den ursprungswerten
Asso ist das wenn im Zeitbereich die max Amplitude 1 ist, ist das auch nach der fft der Fall.


tsseh schrieb:
die "Ungenauigkeiten" sind aber nun mal da
sonst musst du diese rausfiltern, aber das kann auch falsch sein
Und wie Filtert man diese raus?

tsseh schrieb:
dann machst du was falsch
Äh nöö.


tsseh schrieb:
ähhh, du hast werte im bereich 0 bis 256 und stellst werte im bereich -256 bis 0 dar? dann siehst du nichts
Doch weil die dB Werte ja immer negativ sind, die werte sind dann normiert von 0 bis -256

=tsseh schrieb:
welche db werte? die die der anwender sehen will in der farbscala? die wolltest du doch auf 0-256 mappen.
und musst dann deine fft werte auch entsprechend den db-grenzwerten den anwenders umrechnen
Der User stellt ein -120 bis 0(Amplitudenbereich) dB Anstatt jetzt die Chormal Limits von -120 bis 0 gehen zu lassen setze ich die Limits auf -256 bis 0.
Die Slider gehen auch von 0 bis 256. Die FFT Werte(DB Werte) sind Skaliert von 0 bis 256 bzw. -256.
Die Silder sind ja eine Geradengleichung aber ohne die jetzt in betracht zu ziehen, wo muss ich mit den vom User eingestellten dB's hin. Die kann ich ja nur auf die FFT/dB Werte auf addieren.
Eine Multiplikation machte keinen sinn, genau sowenig jedesmal die Chroma Limits zu ändern wenn der User den Amplitudenbereich ändert, dann nämlich müsste ich die Slider auch jedesmal neu Anpassen


tsseh schrieb:
Dan wie?
 
Asso ist das wenn im Zeitbereich die max Amplitude 1 ist, ist das auch nach der fft der Fall.
nur die hälfte, da die fft werte ja gespiegelt sind und idR nur der linke teil betrachtet wird

Und wie Filtert man diese raus?
ab einem grenzwert nullen

sicher


Doch weil die dB Werte ja immer negativ sind, die werte sind dann normiert von 0 bis -256
aber die db werte normierst du ja dann wieder auf 0 bis 256 weil deine farbscala ja von 0 bis 256 gehen soll
wenn du die auf 0 bis minus 256 normierst, und die limits auch so setzt, hast du das selbe, als wenn du das im positiven bereich machst

Der User stellt ein -120 bis 0(Amplitudenbereich) dB Anstatt jetzt die Chormal Limits von -120 bis 0 gehen zu lassen setze ich die Limits auf -256 bis 0.
und wo ist da der sinn hinter? wenn der user von -120db bis 0 eingibt, will er das auch sehen. dann setzt du einfach deine chroma limits auf -120 bis 0 und gibst die db werte direkt in die chromafunktion, oder du machst es so, wie du es wolltest und setzt die chroma limits fest auf 0 bis 256 und normierst deine db werte in den usergrenzen von -120db bis 0 auf den bereich 0 bis 256

Die Slider gehen auch von 0 bis 256. Die FFT Werte(DB Werte) sind Skaliert von 0 bis 256 bzw. -256.
ja was denn nun?
normierst du die db werte auf 0 bis 256 oder auf 0 bis -256? je nachdem musst du die chroma werte auch auf 0 bis 256 oder auf 0 bis -256 setzten.

Die Silder sind ja eine Geradengleichung aber ohne die jetzt in betracht zu ziehen, wo muss ich mit den vom User eingestellten dB's hin. Die kann ich ja nur auf die FFT/dB Werte auf addieren.
Eine Multiplikation machte keinen sinn, genau sowenig jedesmal die Chroma Limits zu ändern wenn der User den Amplitudenbereich ändert, dann nämlich müsste ich die Slider auch jedesmal neu Anpassen
du weisst nicht wie du normieren sollst?
Code:
<!DOCTYPE HTML>
<html>
  <head>
    <title>test</title>
      <style>
        * { color: #00ff00; }
      </style>
      <script src="chroma.js"></script>
    </head>
  <body>
    min: <input id="min" type="text"> max: <input id="max" type="text"> bereich min: <input id="normRangeMin" type="text"> bereich max: <input id="normRangeMax" type="text">
    <br>
    wert: <input id="val" type="text"> wert normiert: <input id="normVal" type="text"> wert normiert auf bereich: <input id="normRangeVal" type="text">
    <script>
      var min = -140;
      var max = -70;
      var normRangeMin = 0;
      var normRangeMax = 255;
      var val = -110;
      function norm(x)
      {
        return (x - min) / (max - min);
      }
      function norm2Val(x)
      {
        return min + x * (max - min);
      }
      function normRange(x)
      {
        return normRangeMin + (normRangeMax - normRangeMin) * (x - min) / (max - min);
      }
      function normRange2Val(x)
      {
        return min + (x - normRangeMin) * (max - min) / (normRangeMax - normRangeMin);
      }
      document.getElementById("min").value = min;
      document.getElementById("min").addEventListener("change", function()
      {
        min = parseFloat(this.value);
        min = min == NaN ? 0 : min;
        if (val < min)
        {
          val = min;
          document.getElementById("val").value = val;
          document.getElementById("normVal").value = norm(val);
          document.getElementById("normRangeVal").value = normRange(val);
        }
        if (max <= min)
        {
          max = min + 1;
          document.getElementById("max").value = max;
        }
        set1();
        set2();
        set3();
      });
      document.getElementById("max").value = max;
      document.getElementById("max").addEventListener("change", function()
      {
        max = parseFloat(this.value);
        max = max == NaN ? 1 : max;
        if (val > max)
        {
          val = max;
          document.getElementById("val").value = val;
          document.getElementById("normVal").value = norm(val);
          document.getElementById("normRangeVal").value = normRange(val);
        }
        if (min >= max)
        {
          min = max - 1;
          document.getElementById("min").value = min;
        }
        set1();
        set2();
        set3();
      });
      document.getElementById("normRangeMin").value = normRangeMin;
      document.getElementById("normRangeMin").addEventListener("change", function()
      {
        normRangeMin = parseFloat(this.value);
        normRangeMin = normRangeMin == NaN ? 0 : normRangeMin;
        if (normRangeMax <= normRangeMin)
        {
          normRangeMax = normRangeMin + 1;
          document.getElementById("normRangeMax").value = normRangeMax;
        }
        document.getElementById("normRangeVal").value = normRange(val);
        set3();
      });
      document.getElementById("normRangeMax").value = normRangeMax;
      document.getElementById("normRangeMax").addEventListener("change", function()
      {
        normRangeMax = parseFloat(this.value);
        normRangeMax = normRangeMax == NaN ? 0 : normRangeMax;
        if (normRangeMin >= normRangeMax)
        {
          normRangeMin = normRangeMax - 1;
          document.getElementById("normRangeMin").value = normRangeMin;
        }
        document.getElementById("normRangeVal").value = normRange(val);
        set3();
      });
      document.getElementById("val").value = val;
      document.getElementById("val").addEventListener("change", function()
      {
        val = parseFloat(this.value);
        val = val == NaN ? 0 : val;
        if (val < min)
        {
          this.value = val = min;
        }
        if (val > max)
        {
          this.value = val = max;
        }
        set1();
        set2();
        set3();
        document.getElementById("normVal").value = norm(val);
        document.getElementById("normRangeVal").value = normRange(val);
      });
      document.getElementById("normVal").value = norm(val);
      document.getElementById("normVal").addEventListener("change", function()
      {
        normVal = parseFloat(this.value);
        normVal = normVal == NaN ? 0 : normVal;
        if (normVal < 0)
        {
          this.value = normVal = 0;
        }
        if (normVal > 1)
        {
          this.value = normVal = 1;
        }
        val = norm2Val(normVal);
        set1();
        set2();
        set3();
        document.getElementById("val").value = val;
        document.getElementById("normRangeVal").value = normRange(val);
      });
      document.getElementById("normRangeVal").value = normRange(val);
      document.getElementById("normRangeVal").addEventListener("change", function()
      {
        normRangeVal = parseFloat(this.value);
        normRangeVal = normRangeVal == NaN ? 0 : normRangeVal;
        if (normRangeVal < normRangeMin)
        {
          this.value = normVal = normRangeMin;
        }
        if (normRangeVal > normRangeMax)
        {
          this.value = normRangeVal = normRangeMax;
        }
        val = normRange2Val(normRangeVal);
        set1();
        set2();
        set3();
        document.getElementById("val").value = val;
        document.getElementById("normVal").value = norm(val);
      });
    </script>
    <p>wertebereich</p>
    <div id="black1"></div>
    <div id="blue1"></div>
    <div id="yellow1"></div>
    <div id="red1"></div>
    <div id="val1"></div>
    <script>
      function set1()
      {
        var colorScale1 = chroma.scale(['#000000', '#0B16B5', '#FFF782', '#EB1250']).domain([min, max]).out('hex');
        document.getElementById("black1").style.backgroundColor = colorScale1(min);
        document.getElementById("black1").textContent = min;
        document.getElementById("blue1").style.backgroundColor = colorScale1(min + (max - min) / 3);
        document.getElementById("blue1").textContent = min + (max - min) / 3;
        document.getElementById("yellow1").style.backgroundColor = colorScale1(min + (max - min) / 3 * 2);
        document.getElementById("yellow1").textContent = min + (max - min) / 3 * 2;
        document.getElementById("red1").style.backgroundColor = colorScale1(max);
        document.getElementById("red1").textContent = max;
        document.getElementById("val1").style.backgroundColor = colorScale1(val);
        document.getElementById("val1").textContent = val;
      }
      set1();
    </script>
    <p>normiert</p>
    <div id="black2"></div>
    <div id="blue2"></div>
    <div id="yellow2"></div>
    <div id="red2"></div>
    <div id="val2"></div>
    <script>
      function set2()
      {
        var colorScale2 = chroma.scale(['#000000', '#0B16B5', '#FFF782', '#EB1250']).domain([0, 1]).out('hex');
        document.getElementById("black2").style.backgroundColor = colorScale2(norm(min));
        document.getElementById("black2").textContent = norm(min);
        document.getElementById("blue2").style.backgroundColor = colorScale2(norm(min + (max - min) / 3));
        document.getElementById("blue2").textContent = norm(min + (max - min) / 3);
        document.getElementById("yellow2").style.backgroundColor = colorScale2(norm(min + (max - min) / 3 * 2));
        document.getElementById("yellow2").textContent = norm(min + (max - min) / 3 * 2);
        document.getElementById("red2").style.backgroundColor = colorScale2(norm(max));
        document.getElementById("red2").textContent = norm(max);
        document.getElementById("val2").style.backgroundColor = colorScale2(norm(val));
        document.getElementById("val2").textContent = norm(val);
      }
      set2();
    </script>
    <p>normiert auf 0 bis 255</p>
    <div id="black3"></div>
    <div id="blue3"></div>
    <div id="yellow3"></div>
    <div id="red3"></div>
    <div id="val3"></div>
    <script>
      function set3()
      {
        var colorScale3 = chroma.scale(['#000000', '#0B16B5', '#FFF782', '#EB1250']).domain([normRangeMin, normRangeMax]).out('hex');
        document.getElementById("black3").style.backgroundColor = colorScale3(normRange(min));
        document.getElementById("black3").textContent = normRange(min);
        document.getElementById("blue3").style.backgroundColor = colorScale3(normRange(min + (max - min) / 3));
        document.getElementById("blue3").textContent = normRange(min + (max - min) / 3);
        document.getElementById("yellow3").style.backgroundColor = colorScale3(normRange(min + (max - min) / 3 * 2));
        document.getElementById("yellow3").textContent = normRange(min + (max - min) / 3 * 2);
        document.getElementById("red3").style.backgroundColor = colorScale3(normRange(max));
        document.getElementById("red3").textContent = normRange(max);
        document.getElementById("val3").style.backgroundColor = colorScale3(normRange(val));
        document.getElementById("val3").textContent = normRange(val);
      }
      set3();
    </script>
  </body>
</html>
 
Sorry wenn Antwort so spät, habe ein Haufen arbeit auf Arbeit.

tsseh schrieb:
nur die hälfte, da die fft werte ja gespiegelt sind und idR nur der linke teil betrachtet wird
Linker teil?? Meinst du Real anteil weil es die reelle fft ist, es gibt ja noch die Complexe mit Real und Imaginär Anteil.


tsseh schrieb:
ab einem grenzwert nullen
Einleuchtend.

tsseh schrieb:
-256 meinte ich.


tsseh schrieb:
du weisst nicht wie du normieren sollst?
Doch das hätte ich auch noch geschafft habe noch 40 Arbeitstage... dann an ist erst mal sense und dan kann ich Weiter Programmieren, ist mir gerade alles zu viel.

Eins noch habe ihr ein ähnliches Projekt gefunden https://github.com/elafargue/html5/blob/master/waterfall2/waterfall.html
und der schreibt 256 + Irgendwelche Minus werte. Kann man das auch als Normierung gelten lassen, wenn ich meine dB Werte mit 256 Addiere?
 
Linker teil?? Meinst du Real anteil weil es die reelle fft ist, es gibt ja noch die Complexe mit Real und Imaginär Anteil.
du erzeugst mit der fft aus n samples n fft werte, dabei werden die frequenzen von 0 bis n/2 größer(linke seite) von n/2 bis n werden sie wieder kleiner(rechten seite). du hast auf der rechten seite die selben frequenzen wie auf der linken aber in entgegengesetzter richtung.
bei rein reellen eingangswerten müssen, damit für die jeweils 2 werte mit gleicher frequenz wieder ein zusammengesetzter wert dieser frequenz ergibt der wieder reell ist(die beiden imaginäranteile zusammen also 0 ergeben müssen), der realanteil beder werte gleich groß sein und der imaginäranteile zusammen 0(imaginäranteil der linken seite = -imaginäranteil der rechten seite).
jetzt kommt es darauf an, was die fft als ergebniss liefert.
liefert sie n werte oder n/2?
idR reicht die linke seite wobei dann die frequenz dem argument(phasenwinkel) und die amplitude dem halben betrag der komlexen zahl entspricht.
weil man das weiss, kann man das aber auch gleich wieder berücksichtigen und die amplitude verdoppeln
was deine fft macht musst du mal nachsehen

Eins noch habe ihr ein ähnliches Projekt gefunden https://github.com/elafargue/html5/blob/master/waterfall2/waterfall.html
und der schreibt 256 + Irgendwelche Minus werte. Kann man das auch als Normierung gelten lassen, wenn ich meine dB Werte mit 256 Addiere?
nein

- - - Aktualisiert - - -

Eins noch habe ihr ein ähnliches Projekt gefunden https://github.com/elafargue/html5/blob/master/waterfall2/waterfall.html
und der schreibt 256 + Irgendwelche Minus werte.
der hat ein canvas der höhe 256 und zeichnet werte zw. 1 und -256 auf die y koordinate canvas.height + value also 256 + value
ein value von -256 landet damit auf y = 0
 
Zurück
Oben