Forum: Digitale Signalverarbeitung / DSP / Machine Learning Vektormultiplizierer


von Gast (Gast)


Lesenswert?

Hi Leute,


ich bin's wieder mit meinem Vektorprozessor :-)

Ich habe ein Problem mit der Multiplikation. Ich bin jetzt dahinter 
gekommen, was der Multiplizierer macht. Das ist ein 16-bit 
Multiplizierer. Wenn ich 16x16-bit multipliziere, liefert er mir nur die 
LBSs. Ich will aber die MSBs. Wenn ich das um 16-bit nach rechts 
schiebe, bekomme ich Müll.

Hier der Code:


 for (i=0;i<vecEl-1;i++{
      resVec[i] = (aVec[i]*bVec[i]);
      resVec[i] = resVec[i]>>16; //shift by 16, to keep the MSB-part
 }

Ich habe das mit diesen Werten in Hex probiert:

Vec1= 0x837;Vec2=0x5b7f;

Das Ergebnis vom Multiplizierer ist: a049

Der erwartete Wert ist: 2efa049. Wie zu sehen ist, nur die unteren Bits 
wurden geliefert.

Wenn ich das um 16 Stellen nach rechts schiebe, ist das Ergebnis: 
ffffffff


Was ist daran falsch?

Ich danke euch für eure Hilfe!

von Detlef _. (detlef_a)


Lesenswert?

resVec ist 16Bit breit? Ergebnis 32 Bit breit zwischenspeichern.

      int32_t verdammt_breit ;
      verdammt_breit = (aVec[i]*bVec[i]);
      resVec[i] =verdammt_breit >>16; //shift by 16, to keep the 
MSB-part

Cheers
Detlef

von Gast (Gast)


Lesenswert?

Hi,

das kann aber nicht sein. vecRes ist kein skalarer Wert. vecRes ist 32 
breit aber unterteilt in einen Vektor, in 16bit. Die obere Hälfte 
enthält das Ergebnis von vecA(1)*vecB(1) und die untere Hälfte 
vecA(2)*vecB(2).

Ich verstehe das garnicht mehr. Ich bin fast dabei diesen Prozessor 
aufzugeben :-(

von Detlef _. (detlef_a)


Lesenswert?

Gast wrote:

> Hi,
>
> vecRes ist kein skalarer Wert. vecRes ist 32
> breit aber unterteilt in einen Vektor, in 16bit.

Häh? Wie issn der definiert, mail mal den kompletten Code. Neulich hieß 
vecRes auch noch resVec !?

> Ich verstehe das garnicht mehr. Ich bin fast dabei diesen Prozessor
> aufzugeben :-(

Der Prozessor ist völlig unschuldig, der tut, was Du ihm sagst.

Cheers
Detlef

von Gast (Gast)


Lesenswert?

Hi Detlev,


der Prozessor ist in einer anderen Sprache geschrieben. Da wird andere 
Syntax verwendet. Ich habe den Fehler jetzt. Ich musste nur das Ergebnis 
in 32-bit casten (wie du das empfohlen hattest) und dann shiften. Jetzt 
ist alles korrekt.



Ich danke dir herzlichst!

von 6645 (Gast)


Lesenswert?

Sonst gaebe es fuer das naechste Mal noch'n Simulator....

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.