Gaussverteilung

Neue Frage »

Auf diesen Beitrag antworten »
Hannibal 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.
 
Auf diesen Beitrag antworten »
eulerscheZahl

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;
Auf diesen Beitrag antworten »
Hannibal

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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.
 
Auf diesen Beitrag antworten »
Hannibal

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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);
	//...
}
Auf diesen Beitrag antworten »
Hannibal

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
Auf diesen Beitrag antworten »
Hannibal

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;
}


}
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Hannibal

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Hannibal

Vielen lieben Dank eulerscheZahl.
 
Neue Frage »
Antworten »


Verwandte Themen