Hallo, Ich habe eine saubere, berechnete Sinuswelle, sin(x), 1000Hz, 96000Hz Samplingrate, also 96 Samples, 16-bits vorzeichenbehaftet. Ich möchte diese integrieren, so daß -cos(x) dabei rauskommt. Ich habs versucht mit Simpson-Integration, aber irgendwie weiss ich nicht, von wo bis wo ich integrieren soll, um alle Punkte einer -cos(x)-Kurve zu bekommen. Könnt ihr mir helfen? Geht das überhaupt mit nur einer Schwingung?
Was genau kommt bei dir raus bzw. wie kommst du darauf, dass es nicht gehen könnte? Welche Grenten hast du benutzt. Es sollte ohne Probleme gehen wenn du den Sinus über eine Periode (also z.B. von 0 bis 2*pi) integrierst. Musst nur darauf achten später den "Gleichanteil" zu entfernen der beim Integrieren entsteht.
Hallo, was möchtest du denn erreichen? Wenn Du über eine Sinus-Periode integrierst( so habe ich dein Vorgehen verstanden), wird das Integral zu null. Da du die analytische Lösung von deinem Problem schon kennst, erübrigt sich die Integration über die Samples doch eigentlich, oder? Grundsätzlich funktioniert Zeitdiskrete Integration aber so, dass eine Summe aus den Werten zu jedem Abtastzeitpunkt gebildet wird. Die Amplitude an einem Abtastzeitpunkt wird mit der Abtastzeit, z.B. (1/96000)sec multipliziert und dann aufsummiert. Die Integration wird oft in der Schule so hergeleitet, dass die Fläche unter einem Graphen in immer schmälere Streifen eingeteilt wird, deren Flächeninhalt dann im Integrationsintervall (dem Bereich auf der x-Achse) ermittelt wird. Genau das kannst Du mit deinen Samples machen. Viele Grüße
> was möchtest du denn erreichen? Wenn Du über eine Sinus-Periode > integrierst( so habe ich dein Vorgehen verstanden), wird das Integral zu > null. richtig. das habe ich auch schon festgestellt :-( > Da du die analytische Lösung von deinem Problem schon kennst, erübrigt > sich die Integration über die Samples doch eigentlich, oder? ich nehme die sinusfunktion nur als test, übrigens teste ich auch noch mit dreieck- und rechteckfunktionen (alle jeweils 1000Hz, 96 samples). herauskommen soll ein integrator, der jede beliebige wellenform integrieren kann. und zwar so, dass sie mir ein neues array an samples liefert (gleiche grösse wie das input-array), aber mit werten, die die stammfunktion erzeugen würde. ich habe übrigens eine scheinbare lösung gefunden, die mit sinus, rechteck und dreieck funktioniert: ich berechne per simson-integration 48 samples von der der mitte der schwingung an und gehe 48 mal eines nach rechts. überläufe werden natürlich berücksichtigt, also 96->0, 97->1 usw. das ergibt tatsächlich in allen 3 fällen neue kurven, die dem integral entsprechen (verglichen mit dem, was mathematika ausspuckt). allerdings glaube ich, dass das nur funktioniert, weil die kurven zufällig ab der mitte umgekehrt symmetrisch sind. > Die Amplitude an einem Abtastzeitpunkt wird mit der Abtastzeit, z.B. > (1/96000)sec multipliziert und dann aufsummiert. ja, aber das gibt ja bekanntlich 0, wenn ich die ganze welle benutze und den originalwert/96000, wenn ich nur einen wert benutze. mittlerweile glaube ich, dass das, was ich vorhabe, gar nicht möglich ist, oder höchstens dann, wenn man werte zwischen den samples interpoliert, damit man eine bessere auflösung für die numerische integration bekommt, (weil man dann mit reellen zahlen als 'index' arbeiten kann). aber vielleicht bin ich auch nur zu doof dazu :-(
>dass sie mir ein neues array an samples >liefert (gleiche grösse wie das input-array), aber mit werten, die die >stammfunktion erzeugen würde. Dabei aber beachten, dass es nie nur eine Stammfunktion gibt, sondern immer unendlich viele, die sich alle um eine Konstante "+ C" unterscheiden (anschaulich: alle gleiche Form, aber nach oben oder unten im Koordinatensystem verschoben). Welche Stammfunktion aus der unendlichen Stammfunktionenmenge Du mit Deinem Integrator erzeugst, hängt davon ab, an welchem Sample Du ihn startest, und mit welchem Anfangswert für die Summenvariable.
Ich verstehe das Problem nicht. Bei diskreten Werten wird das Integral doch wieder zur Summe und es gilt(Delta t = 1):
Schon erwähnt wurde, dass du dann noch einen beliebigen konstanten Wert addieren kannst.
Im "Handbook for Digital Signal Processing" ISBN 0471619957 ist auch ein Kapitel zu Differenzieren und Integrierern in DSP-Technik: http://sitb-images-eu.amazon.com/Qffs+v35lerfbcaBe0FmcVbG2zoBKFpkkye3t5wMqs1FCsspdR/u+O7R77kukfO3 das könnte ich mal genauer nachlesen. Der dort vorgestellte Differenzierer (da war gerade ein Thread zur FM-Demodulation, deshalb hab ich das nachgelesen) ist eine Art RC-Hochpass mit nachgeschaltetem Korrekturfilter.
> Dabei aber beachten, dass es nie nur eine Stammfunktion gibt, sondern > immer unendlich viele, die sich alle um eine Konstante "+ C" > unterscheiden ja, ich weiss. ich will natürlich die haben, bei der C=0 ist. >Ich verstehe das Problem nicht. Bei diskreten Werten wird das Integral >doch wieder zur Summe und es gilt(Delta t = 1): >F(t_n) = \sum_{i=0}^{n} f(t_i) mein problem ist: sin(x) bei x=0 ergibt 0, das integral wäre -cos(x) bei x=0, also -1. diese -1 entspricht in meinen samplingdaten einer -32767. wie komme ich auf diese zahl? addiere ich alle samples auf, bin ich wieder bei 0. nehme ich nur die fläche unter der kurve bei punkt 0, habe ich 0*1, also auch 0. deshalb bin ich ja der meinung, dass man eine einzelne sinuswelle nicht richtig integrieren kann.
> Im "Handbook for Digital Signal Processing" ISBN 0471619957* ist auch ein > Kapitel zu Differenzieren und Integrierern in DSP-Technik: > http://sitb-images-eu.amazon.com/Qffs+v35lerfbcaBe... > das könnte ich mal genauer nachlesen. Der dort vorgestellte > Differenzierer (da war gerade ein Thread zur FM-Demodulation, deshalb > hab ich das nachgelesen) ist eine Art RC-Hochpass mit nachgeschaltetem > Korrekturfilter. danke. das werde ich mir mal besorgen.
Peter wrote: > ja, ich weiss. ich will natürlich die haben, bei der C=0 ist. > mein problem ist: sin(x) bei x=0 ergibt 0, das integral wäre -cos(x) bei > x=0, also -1. diese -1 entspricht in meinen samplingdaten einer -32767. > wie komme ich auf diese zahl? Wenn du die -1 nicht addieren willst, kannst du auf diesen Wert natürlich auch nicht kommen. Nach meinem Eindruck hast du überhaupt keine Ahnung von der Integration. Du must erst einmal deine mathematischen Defizite beseitigen, bevor du hier weiter machen kannst.
> Wenn du die -1 nicht addieren willst, kannst du auf diesen Wert > natürlich auch nicht kommen. sin(x)-1 ist nicht das selbe wie -cos(x). damit schiebe ich die kurve einfach nur nach unten. :-( > Nach meinem Eindruck hast du überhaupt > keine Ahnung von der Integration. deswegen frage ich ja auch? wo ist das problem?
>ich will natürlich die haben, bei der C=0 ist.
Diese Forderung ist sinnlos.
Es gilt:
Folglich haben alle drei Funktionen dieselbe Ableitung [*] und sind somit alles Stammfunktionen von f. Die Kriterien "Soll Stammfunktionen von f sein mit C = 0" erfüllen alle drei gleichermaßen, obwohl sie nicht identisch sind. ------------------------- [*] nämlich
>>ich will natürlich die haben, bei der C=0 ist. >Diese Forderung ist sinnlos. ich weiss, dass die ableitung von -cos(x) sin(x), wowie die von -cos(x)+irgendeinekonstante auch sin(x) ist. aber das ist doch gar nicht mein problem. eine konstante versetzt doch nur die kurve in y-richtung. wenn ich eine kurve bekommen könnte, die aus sin(x) -cos(x)+irgendwas_konstantes macht, wäre ich schon völlig zufrieden. nur: wie mache ich das aus meinen 96 samples?
Das ist in der einfachsten Variante erstaunlich simpel: ----------------------------- s = sstart; FOR (k = 0 .. N-1) { s = s + a[k]*d; // Integration b[k] = s; // F-Funktionswert abspeichern } ----------------------------- Dabei ist N = die Anzahl der Samples, z. B. 96 d = der Abstand zweier aufeinanderfolgender Samples, z. B. 0.1 a[] = das Input-Array mit den N Samples b[] = das Output-Array (N Stammfunktion-Funktionswerte) sstart = ein Parameter; legt Y-Shift der b[]-Werte fest (Alles bis auf N sind Float-Zahlen.) Hast Du es so schon probiert?
> Hast Du es so schon probiert?
danke für deinen vorschlag.
kann sein, ich bin mir nicht mehr so sicher, was ich alles schon
probiert habe. sowas ähnliches habe ich bestimmt schon probiert (mit d=1
zumindest).
ich werde deinen vorschlag auf jeden fall ausprobieren und dann melde
ich mich, wie's ausgegangen ist. das wird leider erst morgen sein.
Du schriebst : --- mein problem ist: sin(x) bei x=0 ergibt 0, das integral wäre -cos(x) bei x=0, also -1. diese -1 entspricht in meinen samplingdaten einer -32767. wie komme ich auf diese zahl? addiere ich alle samples auf, bin ich wieder bei 0. nehme ich nur die fläche unter der kurve bei punkt 0, habe ich 0*1, also auch 0. deshalb bin ich ja der meinung, dass man eine einzelne sinuswelle nicht richtig integrieren kann. --- Von welcher Stelle Integrierst Du eigentlich ?! Das Integral über x0=0 bis x1=0 ist nunmal gleich null, egal welche f/F(x) Du hast ! Wenn ich mich noch richtig erinnere ist jede stetige (die Funktion hat keine sprünge) f(x) integrierbar. Eine Sinus/Cosinus Funktion ist dies auf jeden fall !
> Das Integral über x0=0 bis x1=0 ist nunmal gleich null, > egal welche f/F(x) Du hast das ist mir klar f(x)-f(x) ist natürlich 0 und damit ist die fläche auch 0. aber den fehler mache ich gar nicht. bei mir (sinusfunktion) ist die fläche von 0 ... 2*pi null, was auch ganz normal ist. daher denke ich dass das nicht der erste punkt von -cos(x) sein kann (es sei denn, man addiert die integrationskonstante -1). naja, warten wir mal ab, was "Gasts" vorschlag bringt.
Peter wrote: > ich weiss, dass die ableitung von -cos(x) sin(x), wowie die von > -cos(x)+irgendeinekonstante auch sin(x) ist. aber das ist doch gar nicht > mein problem. eine konstante versetzt doch nur die kurve in y-richtung. > wenn ich eine kurve bekommen könnte, die aus sin(x) > -cos(x)+irgendwas_konstantes macht, wäre ich schon völlig zufrieden. > nur: wie mache ich das aus meinen 96 samples? Ein Vorschlag zur Güte: Warum differenzierst du nicht einfach. Schließlich ist die Ableitung von sinus wieder cosinus. Dann hast du nicht das Problem, dass du die Geschichte mit der Stammfunktion und dem konstanten Summanden nicht kapierst.
> Warum differenzierst du nicht einfach. > Schließlich ist die Ableitung von sinus wieder cosinus. differenzieren und integrieren sind nicht das selbe. nur weil man, egal wie oft man differenziert oder integriert, bei der sinusfunktion immer die gleiche kurve, aber phasenverschoben rauskommt, ist das bei anderen funktionen nicht so. ich habe das dumpfe gefühl, du hast nicht ganz verstanden was ich will. lies den thread doch bitte noch mal von vorn.
Du willst also integral(sin(x)) in den grenzen 0 bis 2pi haben wenn ich dich richtig verstehe ? MFG Patrick
>Du willst also integral(sin(x)) in den grenzen 0 bis 2pi haben wenn ich >dich richtig verstehe ? Meine Güte, nein! Er hat doch gleich zu Anfang gesagt, was er will: "...alle Punkte einer -cos(x)-Kurve zu bekommen." Wollte er ein Integral (= nur eine Zahl), hätte er geschrieben "Möchte das Integral darüber in den Grenzen ... und ... berechnen."
Trotzdem schau mal wegen den Integrationsgrenzen (cos hat eine positive und negative Halbwelle) MFG Patrick
so, da bin ich wieder :-) also, erstmal danke ein "Gast": dein tip hats gebracht. ich war mir fast sicher, dass das einer meiner ersten versuche war, aber irgendwie hab' ichs zu schnell verworfen und irgendwann den wald vor lauter bäumen nicht mehr gesehen. ich mache es jetzt so: als startwert nehme ich 0 und den faktor d lasse ich ganz weg. das ergibt natürlich eine kurve die völlig ausserhalb des gültigen wertebereichs ist. danach wird aber das integralwerte-array heruntergeteilt und in y-rechtung geshiftet, so dass es in meine -32768...+32767 passt. der grund für die nachbearbeitung ist: unterschiedliche frequenzen und unterschiedliche anzahl samples liessen die kurve mal flacher mal, steiler werden. durch die nachträgliche bearbeitung passt die kurve immer optimal in ein 'signed short' array. ich hab es mit verschiedenen kurven getestet: alles wird perfekt integriert! vielen dank auch an alle anderen, die sich meinen kopf zerbrochen haben.
Und ich habe mal die vier Seiten aus dem Mitra / Regalia - Buch nachgelesen. Er unterscheidet drei klassische numerische Integrationsverfahren, rectangular, trapezoidal und Simpson. Das erste summiert die Werte auf den Stützstellen auf, das zweite die Mittelwerte aus zwei benachbarten Stützstellen und Simpson ist komplizierter. Der Frequenzgang des ersten steigt leicht an, das soll praktischerweise genau den Abfall eines D/A-Wandlers nahe der Nyquist-Frequenz kompensieren. Das zweite hat einen abfallenden Frequenzgang. Wie schon beim Differenzierer berechnet er schließlich noch eine Korrekturfunktion. Das ergibt ein FIR-Filter, im Beispiel mit 15 oder 16 Taps.
> das ist mir klar f(x)-f(x) ist natürlich 0 und damit ist die fläche auch > 0. > aber den fehler mache ich gar nicht. bei mir (sinusfunktion) ist die > fläche von 0 ... 2*pi null, was auch ganz normal ist. daher denke ich > dass das nicht der erste punkt von -cos(x) sein kann (es sei denn, man > addiert die integrationskonstante -1). naja, warten wir mal ab, was > "Gasts" vorschlag bringt. Genau, beim Aufsummieren der Sinuswelle hast Du das Integral Int_0^x sin(t)dt berechnet (also von 0 bis x). Das ist nach den Regeln der Integralrechnung nun aber mal nicht -cos(x) sondern -cos(x) - (-cos(0)), also 1-cos(x). Willst Du -cos(x) berechnen, musst Du nicht bei Null sondern bei pi/2 mit der Integration beginnen: Int_pi/2 ^x = -cos(x) -(-cos(pi/2)) = -cos(x) Wenn Du dann den Wert bei x=0 bestimmst, musst Du die Sinuswelle von pi/2 bis 0 (also von rechts nach links) integrieren. Dann kommt gebnau -1 heraus. Gruss Mike
> Er unterscheidet drei klassische numerische Integrationsverfahren, > rectangular, trapezoidal und Simpson. ja, es gibt noch verfeinerungen wie die 3/8-regel und 'romberg', aber alle haben den nachteil, dass man mehrere punkte braucht (mindestens 2), um einen zu berechnen. das liess mich fälschlicherweise vermuten, dass man aus x ausgangswerten keine x integralwerte berechnen kann, sondern nur weniger. > Wenn Du dann den Wert bei x=0 bestimmst, musst Du die Sinuswelle von > pi/2 bis 0 (also von rechts nach links) integrieren. Dann kommt gebnau > -1 heraus. das mache ich ja nun mit einer verschiebung in y-richtung. wenn ich z.b. mit sin(0) starte, also noch nichts aufsummiert habe, habe ich als ersten wert 0. aber dadurch, dass die anderen werte alle grösser sind, wird beim zurück-shiften in meinen gültigen wertebereich diese 0 automatisch zu -32768, was -1 also -cos(0) entspricht.
Freut mich, dass es geklappt hat. Dass das Finden einer einfachen Lösung sich oft als gar nicht einfach erweist, das kennen wohl die meisten hier nur zu gut. >danach wird aber das integralwerte-array >heruntergeteilt und in y-rechtung geshiftet, so dass es in meine >-32768...+32767 passt. Das kannst Du natürlich auf Deine Anwendung anpassen. >der grund für die nachbearbeitung ist: >unterschiedliche frequenzen und unterschiedliche anzahl samples liessen >die kurve mal flacher mal, steiler werden. Das ist auch richtig so. Wenn f(x) irgendeine Funktion ist, dann ist f(k x) die um den Faktor k in x-Richtung "gestauchte" Funktion dazu. Hat nun f(x) die Stammfunktion F(x), dann hat f(k x) aber die Stammfunktion 1/k F(k x), d. h. die Stammfunktion ist ebenfalls in x-Richtung gestaucht, aber außerdem auch noch mit dem Skalierungsfaktor 1/k beaufschlagt. Ein analoger Integrator (OpAmp + C + R passend verschaltet) würde übrigens auch dieses Verhalten zeigen. >durch die nachträgliche >bearbeitung passt die kurve immer optimal in ein 'signed short' array. OK, das ist dann sozusagen eine andere Baustelle. >ich hab es mit verschiedenen kurven getestet: alles wird perfekt >integriert! :-)
Peter wrote: > das mache ich ja nun mit einer verschiebung in y-richtung. wenn ich z.b. > mit sin(0) starte, also noch nichts aufsummiert habe, habe ich als > ersten wert 0. aber dadurch, dass die anderen werte alle grösser sind, > wird beim zurück-shiften in meinen gültigen wertebereich diese 0 > automatisch zu -32768, was -1 also -cos(0) entspricht. Mathematisch stellt dieses "shiften" nichts anderes dar, als die Addition eines konstanten Wertes zur Stammfunktion, in diesem Fall von -1. Also das, was du oben weder verstanden noch für gut befunden hast. Wollte ich nur einmal erwähnt haben.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.