mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Approximationkurve aus mehrehe Messpunkte


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute

ich beschäftige mich grad mit Matlab und habe dazu eine  Frage.
ich habe hier Daten  mit mehr als 500 Messpunkte.   Zwischen den 
einzelnen Punkten tretten Nullstellen auf.

nun möchte ich mit den von Null  verschiedene Punkte, eine Kurve 
darstellen, die sich an diesen Punkte annährt.
Hat da jemenad eine Idee wie diese zu realisieren ist.

Eine Mittelung ist auch nicht die Lösung,  da die Null-Werte auch 
betrachtet werden.

danke für Hilfe
Sebastian

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nullwerte rausschmeißen und dann die Fitting Toolbox von Matlab 
verwenden (falls du die hast)

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
such mal im file exchange von matlab, da gibts sehr gute projekte, z.b. 
polyfitn oder direkt von matlab polyfit

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Tom,

aber die Zeitachse an sich soll  sich nicht ändern  .  d h   egal ob 
dich   die Nullwerte rausschmeißt tretten an den Stellen Lücken.


Fitting Toolbox  habe ich noch  nicht gehört.

sonst eine andere Möglichkeit ??

danke
Sebastian

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Häufig funktionieren fertige Algorithmen auch wenn du die "0" durch 
"NaN" ersetzt.

Weitere Informationen zur Toolbox die ich meinte finden sich unter: 
http://www.mathworks.de/products/curvefitting/desc...
Allerdings muss die nicht unbedingt bei dir auch installiert sein.

Mit welcher Art von Kurve willst den annähern (Polygon, Spline,.. ) ?

Autor: Detlef _a (detlef_a)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jungs, mal in nen Mathebuch kucken hilft, in diesem Falle lineare 
Algebra. Der große Gauß sagt, dass das lineare Gleichungssystem A*x=y 
durch x=inv(A'A)A'y im Sinne minimaler Fehlerquadrate gelöst wird. Damit 
kann man wunderbar Polynome fitten, in diesem Fall eine Parabel in 
Meßwerte gefittet. Nulen in Matlab rauswerfen ist auch trivial.

Da braucht man keine Toolbox zu, nix.

Math rulez!
Cheers
Detlef

y=[1 0 2.5 0 0 4.5 0 3.5 2.5 0 1].';
x=(1:length(y));
x=x(:);
ind=find(y~=0);
xx=x(ind);
yy=y(ind);
M=[xx.*xx xx ones(length(xx),1)];
coff=inv(M'*M)*M'*yy;
xxx=linspace(min(x),max(x),1000).';
yfit=[xxx.*xxx xxx ones(length(xxx),1)]*coff;
plot(xxx,yfit,'b.-',x,y,'r.-')

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke detlef
es scheint eine gzute lösung zu sein.

aber bei:
>> ind=find(y~=0);

habe ich in meinem Vektor NaN anstatt 0.

das Ergebniss ist dann nicht mehr richtig.  ich habe in der Gleichung 
mit 'NaN' versucht. auch ohne erfolg.
hast jemand  da bitt ein Tricks.

in einem If-Anweisung zu konvertieren   von NaN in Nullen  klappt auch 
nicht.


danke

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NaN ist ein besonderer Ausnahmefall - dafür gibts isnan()

verwende einfach Folgendes:
y(isnan(y))=0;

Autor: Nicolas S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm eine neue Variable t mit der Länge der Meßwertvariable m und 
numeriere den Inhalt:
t = zeros(1,length(m));
t = 1:length(t);

Dann suche nach den Nullstellen:
indices = ~(m == 0);

t = t(indices);
m = m(indices);

Und schon hast Du m und t-Wert von allen gültigen Werten.

Autor: Michael Lenz (hochbett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sebastian,

wahrscheinlich suchst Du die Funktion interp1, die Du beispielsweise so 
bedienen kannst:

yneu = interp1(x,y,xneu,'spline')

Gruß,
  Michael

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja  es muss quasi  alle Punkte Mitteln  ohne die Nullen zu betrachten 
und dann eine interpolation über diese von Null verchieden gemittelte 
Punkten.

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nur darum geht, eine Menge Meßwerte durch eine mathematische 
Kurve mit bestimmten Genauigkeits- und Aufwandsanforderungen zu 
beschreiben, ist dieses Tool hier genau richtig. Dort bekommst du 
Vorschläge fürs Fitten bis zum Abwinken. Such dir dann einfach die für 
dich passenste Approximation aus.

http://zunzun.com/


Das ist auch nett:
http://www.softintegration.com/chhtml/lang/lib/lib...


Gruß -
Abdul

Autor: Dipl.-Ing. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

aus Sicht der Signalverarbeitung stellt Dein Problem ein Signal mit 
hohen Freuqenzen dar, die sich durch "schnelle" Änderungen darstellen.

Wenn Du nun die hohen Frequenzen herausfilterst, wird das Signal 
automatisch geglättet.

Dazu genügt es, das Signal durch ein FIR-Tiefpass prozessieren zu 
lassen. FIR-Filter sind einfach zu realisieren und sollten kein 
unüberwindbares Problem darstellen. Guck einfach, wo Du die 
Grenzfrequenz hinlegst, damit das Ergebnis optimal wird.

Wenn Du das Problem besonders elegant und optimal lösen willst, kannst 
Du auch ein CIC-Interpolator (Cascaded Integrator Comb nach Hogenauer) 
einsetzen. Die Theorie hat's in sich aber die Realisierung ist ebenfalls 
einfach.

Gruß

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.