Forum: Offtopic Mathematische Funktion für diverse Wellenformen gesucht


von Daniel A. (daniel-a)


Lesenswert?

Zunächst, der Einfachheit halber normalisiere ich hier eine Halbwelle 
auf den bereich 0<t<1, statt auf 0<t<π, das finde ich intuitiver.

Ich brauche eine mathematische Funktion, mit der viele Wellenformen 
abdecken kann. Etwas vergleichbar zu dieser JS Funktion, aber halt als 
Formel:
1
function v(time, peak, waveform){ 
2
  const norm_time_2 = time >= 0 ? time % 2 : (1-time) % 2;
3
  const norm_time = norm_time_2 % 1;
4
  const m_peak = norm_time_2 < 1 ? peak : 1-peak;
5
  const norm_peak = peak >= 0 ? m_peak : 1-m_peak; 
6
  const sawtooth = norm_time < norm_peak ? norm_time / norm_peak : 1 - (norm_time - norm_peak) / (1 - norm_peak);
7
  const halfwave = 1-Math.pow(1-sawtooth, waveform);
8
  return norm_time_2 < 1 ? halfwave : -halfwave;
9
}
https://jsfiddle.net/nk5tufm8/

Eine Welle (-1<t<1) genügt schon. Eventuell komme ich auch mit einer 
Halbwelle aus, wäre aber nicht unbedingt ideal.

Ich brauche etwas, womit ich ungefähr die gleichen Wellenformen abdecken 
kann. Aber vor allem brauche ich etwas simples, das ich noch weiter 
umformen kann.

Es sollte auch nicht noch komplexere Wellenformen zulassen. Eigentlich 
will ich am Ende eine art Frequenzanalyse eines bestehenden Audiosignals 
machen,
aber eine, wo ich auch die Wellenform abschätzen kann. Ich weiss, das 
wird nicht gut funktionieren, aber das muss es auch nicht. Und würde ich 
die Wellenform gar nicht einschränken,
könnte ich gar keine Frequenzinformationen mehr isolieren.
Die Einschränkung hier ist übrigens, dass es pro Halbwelle nur eine 
Spitze gibt, und dass, wenn man den Teilbereich zwischen den Spizen 
anschaut, dieser invertierbar ist.

Ohne die Asymetrie (in der JS Funktion oben die Variable peak), könnte 
ich das ja noch umsetzen:
Wobei, mit der sign funktion wird das umformen schwieriger, und ohne hab 
ich nur eine Halbwelle, was zwar auch noch genug sein sollte, aber dann 
fehlt immernoch die Asymmetrie. Und mit dem modulo wird das Umformen 
auch nicht leichter.

Hat da jemand eine Idee für eine möglichst simple Formel, die diese 
Anforderungen erfüllt?

von Gustl B. (-gb-)


Lesenswert?

Hm, wenn du möglichst alle beliebigen Wellenformen erzeugen können 
möchtest, dann wäre doch die Summierung verschiedener Frequenzen mit 
unterschiedlichen Amplituden was. Klar, das liefert keinen perfekten 
Rechteck oder Sägezahn, kommt aber schon bei wenigen Frequenzen die 
addiert werden recht nahe ran.

von Daniel A. (daniel-a)


Lesenswert?

Gustl B. schrieb:
> Hm, wenn du möglichst alle beliebigen Wellenformen erzeugen können
> möchtest, dann wäre doch die Summierung verschiedener Frequenzen mit
> unterschiedlichen Amplituden was. Klar, das liefert keinen perfekten
> Rechteck oder Sägezahn, kommt aber schon bei wenigen Frequenzen die
> addiert werden recht nahe ran.

Das muss ich mir erst noch genauer ansehen. Wenn die Wellenform wirklich 
absolut beliebig ist, funktioniert was ich vorhabe nicht mehr, ich 
müsste also schauen, wie und wie Stark ich das einschränke. 
Andererseits, wenn ich das Signal sowieso aus Sinuswellen zusammensetze, 
und ich eine Frequenzanalyse mache, macht es eventuell mehr Sinn, wenn 
ich statt dem was ich vor hatte einfach gleich eine normale wavelet 
transformation oder eine FT mache, und versuche daraus danach 
abzuschätzen, welche Wellenformen involviert waren. Wäre aber auch nicht 
trivial.

Was ich mir auch noch nicht richtig überlegt hatte ist, wann 2 
Wellenformen überhaupt gleich sind. Man könnte meinen, einfach wenn sie 
gleich aussehen, das scheint aber keine wirklich Sinnvolle 
Betrachtungsweise zu sein. Wenn man sich z.B. die 2 Wellen bei dem 
Thread hier ansieht: 
https://dsp.stackexchange.com/questions/48873/how-to-rotate-the-phase , 
das sind eigentlich beides normale Rechteckwellen, zumindest hören sie 
sich gleich am, die 2te ist einfach 90 Grad rotiert.

Ich muss meinen Ansatz nochmal in ruhe überdenken...

von Egon D. (Gast)


Angehängte Dateien:

Lesenswert?

Daniel A. schrieb:

> Was ich mir auch noch nicht richtig überlegt hatte
> ist, wann 2 Wellenformen überhaupt gleich sind. Man
> könnte meinen, einfach wenn sie gleich aussehen,

Wenn sie durch Ähnlichkeitsabbildungen (Stauchung oder
Streckung in Amplitudenrichtung; Translation in Zeit-
richtung) zur Deckung zu bringen sind.


> das scheint aber keine wirklich Sinnvolle Betrachtungsweise
> zu sein.
> Wenn man sich z.B. die 2 Wellen bei dem Thread hier ansieht:
> https://dsp.stackexchange.com/questions/48873/how-to-rotate-the-phase ,
> das sind eigentlich beides normale Rechteckwellen,

Nur zu meiner Klarheit: Wir sprechen von den Wellen,
die ich als Bild hier angehängt habe?

Das eine ist ganz sicher KEINE Rechteckwelle.


> zumindest hören sie sich gleich am, die 2te ist einfach
> 90 Grad rotiert.

Das Gehör ist kein taugliches Messinstrument. Es gilt das
Ohmsche Gesetz der Akustik: Zwei (periodische) Wellen
klingen für den Menschen gleich, wenn die Amplituden der
Teiltöne übereinstimmen.

Die Wellenform wird aber durch Amplitude UND Phase der
Teiltöne diktiert. Die Abbildung zwischen Betragsspektrum
und Zeitfunktion ist nicht bijektiv.


> Ich muss meinen Ansatz nochmal in ruhe überdenken...

Ja :)
Vielleicht mal das hinterliegende Problem beschreiben.

von Daniel A. (daniel-a)


Lesenswert?

Egon D. schrieb:
> Nur zu meiner Klarheit: Wir sprechen von den Wellen,
> die ich als Bild hier angehängt habe?

Ja

Egon D. schrieb:
> Daniel A. schrieb:
>> Ich muss meinen Ansatz nochmal in ruhe überdenken...
>
> Ja :)
> Vielleicht mal das hinterliegende Problem beschreiben.

Ich weiss noch nicht, was ich damit später mal machen werde. Ich will 
vor allem etwas herum experimentieren, und schauen, was dabei heraus 
kommt.

Worum es mir bei der ganzen Geschichte vor allem geht, ist, wenn ich 
irgendeinen Song nehme, das in ein Format zu bringen, mit dem ich 
möglichst einfach Aussagen über diesen machen kann, diesen eventuell 
auch verändern kann. Ich will die Daten quasi in eine Intuitiv 
verständliche Form bringen. Wenn man ein paar Rechteck oder 
Sägezahnwellen hört, will ich nicht sehen, in welche Sinuswellen man das 
unterteilen könnte, ich will effektiv sehen, da waren vermutlich diese 
Töne mit dieser Wellenform. Ein bisschen wie Audiosignal zu MIDI quasi, 
nicht ganz so Extrem, aber in die Richtung. Quasi, gegeben ein paar 
simple mögliche Wellengrundformen, was ist das Minimum an Tönen / 
Komponenten, mit denen man das Signal reproduzieren kann. Deshalb wollte 
ich zuerst mal die simplen möglichen Wellengrundformen festlegen.

von R. M. (n_a_n)


Angehängte Dateien:

Lesenswert?

Daniel A. schrieb:
> Hat da jemand eine Idee für eine möglichst simple Formel, die diese
> Anforderungen erfüllt?


Für eine Rechteck - Schwingung kann ich Dir eine geschlossene Funktion 
anbieten.
(siehe Anhang)
Ich bin mir nicht sicher ob das überhaupt eine partielle Lösung ist, da 
ich zugeben muss das Problem nicht mal im Ansatz verstanden zu haben.

Für die oben verlinkten Bilder
https://dsp.stackexchange.com/questions/48873/how-to-rotate-the-phase
gibt es den Suchbegriff: Hilberttransformation.

von Daniel A. (daniel-a)


Lesenswert?

Ich bin in letzter Zeit nicht dazu gekommen, hier goss weiter zu machen.

@R. M.

Diese Rechteck Funktion ist sehr interessant. Dass ich nicht selbst 
darauf gekommen bin, die floor Funktion zu nehmen. Das kann man ja wie 
ein if else verwenden. Damit kann ich den Code oben in Teilfunktionen 
zerlegen, und damit die relevanten Teile zusammensetzen:

https://jsfiddle.net/b024updc/4/

https://www.wolframalpha.com/input/?i=sign%281-%28x+mod+2%29%29+*+%28+%28+%281-floor%28j+-+t+%2B+1%29%29+*+%281-%281-%28j%2Ft%29%29%5Ea%29+%29+%2B+%28+floor%28j+-+t+%2B+1+%29+*+%281-%28++%28j-t%29%2F%281-t%29%29%5Eb%29+%29+%29+where+j%3Dabs%28%28x+mod+2%29-1%29%2C+t%3D0.75%2C+a%3D100%2C+b%3D2


Ob mir das nun effektiv bei meinem Vorhaben weiterhilft weiss ich noch 
nicht, aber damit habe ich das ding immerhin mal.

von Daniel A. (daniel-a)


Angehängte Dateien:

Lesenswert?

Es ist erstaunlich, wie gut man schon die kleinsten Abweichungen zu 
einer sauberen Sinuswelle hören kann. Für
gibt es nur etwa ±1.354% Abweichung, und trotzdem tönt es komplett 
anders! (Soundfiles im Anhang).

Auch interessant ist, wenn man sich erst a anhört, tönt es wie 1 Ton, 
aber nachdem man sich b und c anhört, hört sich a wie 2 Töne an!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.