www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Minimal- und Maximal-Funktion mathematisch erfassen


Autor: Stefan Zimmermann (wooschder)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich baue gerade eine Schaltung mit digitalen Filtern auf. Dabei muss ich 
den Minimal bzw. Maximal-Wert des aktuellen Samples von allen Filtern 
bestimmen. Bis jetzt hab ich Simulation in Simulink durchgeführt. Kann 
ich das auch mathematisch bestimmen?

Gruß
Stefan

Autor: Ras Funk (rasfunk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bis jetzt hab ich Simulation in Simulink durchgeführt.
> Kann ich das auch mathematisch bestimmen?

Unmöglich! Matlab verwendet reine Intuition um auf die Ergebnisse zu 
kommen...

Scherz beiseite, ich habe das Problem noch nicht ganz verstanden. Wovon 
brauchst Du die Maximal/Minimal-Werte? Geht es um die richtigen 
Skalierungsfaktoren, damit die Filter nicht überlaufen?

Autor: Wooschder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Beispiel: Ich habe zwei digitale Filter.

Zum ersten Abtastzeitpunkt (t=0) hat der erste Filter den Ausgangswert 
5, der zweite den Wert 4. Als Ergebnis für diesen Takt möchte 5 
erhalten.

Zum zweiten Abtastzeitpunkt (t=1) hat der erste Filter den Ausgangswert 
3, der zweite den Wert 6. Als Ergebnis für diesen Takt möchte 6 
erhalten.

Das ganze habe ich erfolgreich simuliert. Dabei habe ich einen 
Maximumblock mit sovielen Eingängen wie Anzahl der Filter benutzt. In 
diesem Beispiel wären es 2 Stück.

Die Ergebnisse der Simulation habe ich zwar, allerdings kann ich ja nur 
einer begrenzte Anzahl an Filtern simulieren. Ich möchte das ganze jetzt 
mathematisch erfassen und dann mit (falls das geht) unendlich vielen 
Filtern rechnen.

Was mir dabei fehlt, ist eine mathematische Funktion, die mir zu jedem 
Zeitpunkt das Maximum aus vielen verschiedenen anderen 
Funktionen(Filterausgängen) ausgibt.

Gruß
Stefan

Autor: Wooschder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

ich habe gerade etwas gefunden:

max(a,b) = (a + b + |a-b|) / 2


Gruß
Stefan

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"max" ist eine mathematische Funktion, wenn du sie definierst. Welchen 
Sinn es haben soll das in Form von Grundrechenarten und Betrag 
auszudrücken verstehe ich nicht.

Autor: Anon Nymous (fuechslein)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Min und Max sind nichtlinear Funktionen. Die Theorie die du suchst nennt 
sich "Non-Linear signal processing". Da gibt es ganze Buecher darueber 
die auch sehr interessant und lesenswert sind. Ich hab selber das Buch 
von Arce gelesen. Allerdings hoffe ich dass du sehr gute Mathematische 
Grundlagen auf dem Gebiet Statistik und Warsch. hast ansonsten wirds 
hart.

In deinem konkreten fall suchst du "FMH: FIR-Median Hybrid".
Das ganze wurde 1987 von Nieminen und Neuvo veroeffentlich:

http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arn...

Max/Min sind ein spezial Fall von Weighted medians.

Es gibt nicht viel einfache Literatur darueber. Und erst recht keine Uni 
Kurse.

HTH

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder versteh ich das Problem nicht richtig, oder die Lösung ist 
wirklich einfach und lautet in C etwa so:

#define ANZ 2 /* hier passenden Wert definieren */
#define MIN 0 /* hier ebenfalls */

int current, i;
current = MIN;

for (i=0; i<ANZ; i++)
{
  if (filterausgang[i] > current)
    current = filterausgang[i];
}

Dieser Code müsste dann pro Abtastung einmal laufen. In der Variablen 
current steht dann das aktuelle Maximum. Oder wenn das nicht gemeint 
ist, was genau dann? :-)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß auch nicht so ganz genau, wodrauf Du konkret hinaus willst. 
Wenn Dir die mathematische Bescheibung im Vordergrund steht, vielleicht 
auch von vielen Filterausgängen, d.h. vielen Argumenten der 
max-Funktion, und Du mit Methoden der Analysis dadran gehen willst, ist 
vielleicht die folgende Näherung für Dich wichtig:

max(x_1,...,x_N) = log(e^x_1+...+e^x_N)

Das Gleichheitszeichen ist hier natürlich ein "ungefähr gleich". Der 
Vorteil dieser Näherung ist, dass Du nach den x_i ableiten kannst. e^x_i 
steht hier für exp(x_i). Für eine Implementierung im Mikrocontroller ist 
das aber eher nichts, da würde das C-Beispiel oben mehr Sinn machen (und 
auch exakte Werte liefern). Die Näherung bietet sich nur an, wenn man 
eine Ableitung bestimmen will (z.B. für Aussagen zur Performance oder um 
einen schnelleren, suboptimalen Algorithmus herzuleiten).

Autor: Wooschder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Anon Nymous: Das scheint ganz gut zu sein, allerdings auch sehr 
mathematisch. Wie würde es Klitschko sagen: "Schwere Kost!"

@Mark Brandis: Mit der Simulation und C Code habe ich keine 
Schwierigkeiten. Das Problem bei der Simulation bzw. C-Code ist, dass 
ich immer nur eine begrenzte Anzahl an größer-kleiner-Vergleichen machen 
kann. Ich möchte das ganze mathematisch mit unendlich vielen Vergleichen 
ausrechnen. Und dann kann ich schauen, mit wievielen Vergleichen ich ein 
akzeptables Ergebnis bekomme.

@Michael: Das sieht sehr gut aus. Ich werde morgen damit rechnen und 
dann Rückmeldung geben.

Gruß
Stefan

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wooschder schrieb:

> @Mark Brandis: Mit der Simulation und C Code habe ich keine
> Schwierigkeiten. Das Problem bei der Simulation bzw. C-Code ist, dass
> ich immer nur eine begrenzte Anzahl an größer-kleiner-Vergleichen machen
> kann. Ich möchte das ganze mathematisch mit unendlich vielen Vergleichen
> ausrechnen. Und dann kann ich schauen, mit wievielen Vergleichen ich ein
> akzeptables Ergebnis bekomme.

Ach so. Ich hatte mich wohl zu sehr an den Satz "ich baue gerade eine 
Schaltung mit digitalen Filtern auf" gehalten ;-)

Autor: Wooschder (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Michael: Ich habe das gerade durchgerechnet. Ist wirklich nur ungefähr 
;-) Habs mal mit log(10^N1 + 10^N2 + ... + 10^Nn) durchgerechnet. Da 
wird das Ergebnis noch ein bißchen genauer.

Gruß
Stefan

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, ja: mit log(x) hab ich den natürlichen Logarithmus gemeint, gemäß 
der Namenskonvention im englischen Sprachraum (hier meint man ja eher 
den zur Basis 10, wenn man log(x) sagt) - bei den Amis wäre log10(x) der 
Logarithmus zur Basis 10. Oder aber Du machst das alles mit der Basis 
10, so wie bei Dir.

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.