Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Technische Informatik (http://www.informatikerboard.de/board/board.php?boardid=7)
--- Gaussverteilung (http://www.informatikerboard.de/board/thread.php?threadid=2771)
Geschrieben von Hannibal am 17.01.2016 um 18:26:
Gaussverteilung
Hallo Leute,
ich habe ein kleines Problem bei einer Aufgabe.
Die Aufgabe lautet folgendermaßen:
1.)Die Codewörter (z.B. 110 / 001 etc.) sollen in Vektoren abgebildet werden, wobei die logische 1 auf +1 und die logische 0 auf -1 abgebildet werden soll.
2.)Danach soll das Kanalrauschen elementweise mit einzulesender Rauschleistung dazu addiert werden.
3.)Dann wird jede positive Zahl auf 1 und jede negative Zahl auf 0 abgebildet.
Den ersten und dritten Teil habe ich geschafft aber bei dem zweiten Teil komme ich nicht weiter:
float rausch = 0.;
float rauschleisung = 0.;
for (int i = 0; i < 12; i++)
{
rausch = rausch + (float)((rand() / RAND_MAX) - 0.5);
}
das wäre so meine idee aber es kommt einfach nicht das richtige Ergebnis dabei raus.
Ich hoffe ihr könntmir helfen.
Danke im Voraus.
Geschrieben von eulerscheZahl am 17.01.2016 um 18:37:
RAND_MAX ist ein int. Und zwar ein ziemlich großes.
rand() / RAND_MAX ist deshalb ziemlich sicher 0. Der Cast nach float kommt zu spät.
Außerdem solltest du das rauschen vielleicht den Bits zuweisen, statt zum Gesamtrauschen zu addieren.
Etwa so: daten[i] += (float)rand() / RAND_MAX - 0.5;
Geschrieben von Hannibal am 18.01.2016 um 13:13:
Vielen Dank für die schnelle Antwort eulerscheZahl.
Ich werde das aufjedenfall versuchen.
Ich hatte das so gemacht gehabt:
for (int i = 0; i<nN*nBit; i++)
{
analogNoise[i] = analog[i] + (rausch*rauschl);
if (analogNoise[i]>0)
{
fehlerwort[i] = true;
}
else
{
fehlerwort[i] = false;
}
}
weiss nicht ob das richtig ist, aber mann muss es ja noch mit der rauschleistung multiplizieren.
Geschrieben von eulerscheZahl am 18.01.2016 um 13:16:
Die Frage ist, wo du rausch berechnest und wo die es zuweist.
Wenn du es erst berechnest und dann jedem Wert zuweist, ist der Zufallseffekt dahin. In jedem Schleifendurchlauf muss der Rauschwert deshalb neu bestimmt werden.
Geschrieben von Hannibal am 18.01.2016 um 13:39:
float* analog = new float[nN*nBit];
float* analogNoise = new float[nN*nBit];
float* quant = new float[nN];
float rausch = 0.;
float rauschl = 0.;
cout << "rauschlesitung:" << endl;
cin >> rauschl;
cout << endl;
for (int i = 0; i < nN*nBit; i++)
{
if (sendewort6[i] == true)
{
analog[i] = 1.0;
}
else
{
analog[i] = -1.0;
}
}
for (int i = 0; i < 12; i++)
{
rausch = rausch + (float)((rand() / RAND_MAX) - 0.5);
}
for (int i = 0; i<nN*nBit; i++)
{
analogNoise[i] = analog[i] + (rausch*rauschl);
if (analogNoise[i]>0)
{
fehlerwort[i] = true;
}
else
{
fehlerwort[i] = false;
}
}
so sieht das ganze aus eulerscheZahl.
Geschrieben von eulerscheZahl am 18.01.2016 um 13:43:
Wie ich vermutete: du addierst eine Konstante.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
|
for (int i = 0; i < 12; i++)
{
rausch = rausch + (float)((rand() / RAND_MAX) - 0.5); //zur Division zweier ints hatte ich mich schon geäußert.
}
//rausch hat jetzt immer den gleichen Wert, rausch*rauschl ist konstant
for (int i = 0; i<nN*nBit; i++)
{
analogNoise[i] = analog[i] + (rausch*rauschl);
//...
} |
|
Geschrieben von Hannibal am 18.01.2016 um 13:49:
Ach so.
Das heißt ich müsste es in die zweite for schleife mit rein nehmen:
for (int i = 0; i<nN*nBit; i++)
{
//hier zum beispiel
analogNoise[i] = analog[i] + (rausch*rauschl);
vielen dank eulerscheZahl
Geschrieben von Hannibal am 18.01.2016 um 17:01:
ich habe es jetzt getestet, leider kommen ganz komische werte beim empfangswert bzw bei der berechnung der absoluten und relativen fehler.
sieht jetzt wie folgt aus:
for (int i = 0; i < nN*nBit; i++)
{
if (sendewort6[i] == true)
{
analog[i] = 1.0;
}
else
{
analog[i] = -1.0;
}
for (int a = 0; a < 12; a++)
{
rausch = rausch + ((((float)rand()) / RAND_MAX) - 0.5);
}
analogNoise[i] = analog[i] + (rausch*rauschl);
if (analogNoise[i]>0)
{
fehlerwort[i] = true;
}
else
{
fehlerwort[i] = false;
}
}
Geschrieben von eulerscheZahl am 18.01.2016 um 17:29:
du solltest rausch vielleicht vor der Schleife noch auf 0 setzen, sonst hast du noch das alte Rauschen zusätzlich mit drin.
Wenn das nicht hilft, brauche ich mehr als ein "ganz komische werte", nämlich Eingabe, Ausgabe und erwartete Ausgabe.
Geschrieben von Hannibal am 18.01.2016 um 17:50:
Eingabe und Ausgabe:
Bitte geben Sie eine Rauschlesitung rauschl ein:
10
Absolute Fehler: 38 Relative Fehler: 57.5758
Das hier ist das empfangswort:
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
und das hier die quantisierte folge:
-0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621
-0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621
-0.374621 -0.374621 -0.374621 -0.374621 -0.374621 -0.374621
SNR in dB: -0.336012dB
SNR pro Bit: -0.112004
Die Berechnung der absoluten und relativen Fehler sowie des SNRs stimmen, da ich diese schon bei einer anderen Aufgabe überprüft habe.
und nochmals vielen dank für deine hilfe.
Geschrieben von eulerscheZahl am 18.01.2016 um 18:25:
Stelle mal den kompletten Code rein. Wenn es eine Datei ist, dann bitte in [code]...[/code], bei mehr als .zip.
edit: per PN geklärt.
Geschrieben von Hannibal am 18.01.2016 um 20:04:
Vielen lieben Dank eulerscheZahl.
Forensoftware: Burning Board, entwickelt von WoltLab GmbH