mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Sinuswelle integrieren zu -cos(t)


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: joep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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 :-(

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest du vielleicht deinen Code posten?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Thomas W. (wagneth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 !

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du willst also integral(sin(x)) in den grenzen 0 bis 2pi haben wenn ich 
dich richtig verstehe ?

MFG Patrick

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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."

Autor: Patrick Weinberger (seennoob)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Trotzdem schau mal wegen den Integrationsgrenzen (cos hat eine positive 
und negative Halbwelle)

MFG Patrick

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

:-)

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.