Forum: Mikrocontroller und Digitale Elektronik DSP - C-Code: Arrayproblem (Median ohne Buffer)


von Alex (Gast)


Lesenswert?

Hallo zusammen,
ich versuche gerade einen eigentlich recht einfachen Codeschnipsel 
fertig zu bekommen und habe dabei gemerkt, dass mir offensichtlich an 
einer essenziellen Stelle C-Kenntnis fehlt.

Ziel: Es gibt ein Array namens "Window" aus den aktuellsten drei 
elementen eines ADWandlers. Eine funktion aktualisiert diese mit neuen 
werten. Eine funktion bildet den Rang2 Median und gibt ihn aus.

Nun möchte ich, dass die Update-Funktion das im speicher feststehende 
window ändert, das Medianfilter beim Sortieren aber gerade nicht das 
ursprüngliche Window verändert, damit in jeder stufe die aktuellsten 
drei werte genommen werden.

Mein Code:
1
uint16 new_value = adcValue0;
2
static uint16 window[3] = {0,0,0};
3
4
5
void update_window (uint16 new_value, uint16 window[])    // fügt neuen Wert nach FiFo Prinzip hinzu
6
{
7
    window[2] = window[1];
8
    window[1] = window[0];
9
    window[0] = new_value;
10
}
11
12
uint16 median (uint16 window[])            // sortiert Window und gibt Median aus
13
{
14
    uint16 buffer;
15
16
    if(window[1]>window[2])
17
    {
18
        buffer = window[2];
19
        window [2] = window[1];
20
        window [1] = buffer;
21
    }
22
    if (window[0]>window[1])
23
    {
24
        buffer = window[1];
25
        window [1] = window[2];
26
        window [0] = buffer;
27
    }
28
    if(window[1]>window[2])
29
    {
30
        buffer = window[2];
31
        window [2] = window[1];
32
        window [1] = buffer;
33
    }
34
35
    return window[1];
36
}
37
38
39
// Aufruf:
40
    update_window(adcValue0, window);
41
    signal = median(window);

Ich weiß nun nicht wie ich das o.g. Problem löse. Bei einer normalen 
Variablen, die ich mit einer Funktion im Speicher bearbeiten möchte 
übergebe ich ja die Adresse der Variablen und arbeite mit Pointern. Wenn 
die funktion nur die werte nutzen soll, übergebe ich die variable 
einfach so.
Das array selbst ist ja nun bereits ein pointer - wie übergebe ich es 
richtig wenn ich a) die funktion nur lokal und b) die funktion global 
damit arbeiten lassen will?

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:


> Das array selbst ist ja nun bereits ein pointer

Nicht ganz richtig. Aber seis drum

> - wie übergebe ich es
> richtig wenn ich a) die funktion nur lokal und b) die funktion global
> damit arbeiten lassen will?

Gar nicht.
Das was du willst, ist mit Arrays nicht möglich.
Arrays werden IMMER so übergeben, dass die Funktion einen Pointer auf 
das erste Element des Arrays bekommt. Und damit arbeitet die Funktion 
IMMER auf dem Array des Aufrufers.
Wenn du in der Funktion lediglich mit einer Kopie arbeiten willst, dann 
musst du dir diese selbst erzeugen. Entweder in der Funktion oder 
ausserhalb.
Oder du packst das Array in eine Struktur. Dann übergibst du kein Array 
mehr, sondern eine Struktur. Und das funktioniert dann wieder so, wie du 
das gewohnt bist.
Oder du überlegst dir eine andere Form, wie du den Median ermittelst.
Oder vielleicht brauchst du ja auch gar keinen Median und der Mittelwert 
ist das was du benötigst.

Arrays sind die Ausnahme. Sie werden IMMER per Startadresse übergeben.

von Alex (Gast)


Lesenswert?

dankesehr für die klare ansage, dann gehts wohl nur mit Pufferarray!

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.