DSP - C-Code: Arrayproblem (Median ohne Buffer)

Gast #2943900
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?
#2943924
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren