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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.