Hilfe: Datenskalierung mit einem 8.8-fixed point Wert

OP (Firma: student) #636712
Lesenswert?

Hallo allerseits!!!

ich brauche dringend Hilfe, hoffentlich kann mir jemand behilflich sein 
!

Es geht um folgende Problemmstellung:

ich soll ein FPScale-Modul auf 2 verschiedenen Wegen realisieren (1. 
Synplify DSP(eigener Blockset in Simulink-Umgebung, speziell für 
DSP-Aufgaben); 2. CoDeveloper (basierend auf C-Sprache)

An einem FPGA (Altera) ist ein serieller Codec angeschlossen. Die 
seriell vom Codec gesendeten Daten (left/right je 16bit signed) werden 
im FPGA in einem Shiftregister parallel gewandelt und in einem Register 
dem FPScale-Modul zur Verfügung gestellt. Der Shifttakt (12.288MHz) soll 
auch als Systemtakt für das FPScale-Modul verwendet werden. Die 
Updaterate des Übergaberegisters beträgt 96kHz. Neue Daten werden mit 
einem ND-Signal (1 clk-cycle high alle 128 clks) angezeigt, welches auch 
gleichzeit als Interrupt Signal für den DSP verwendet wird. Von den 
beiden 16-bit Registern (left/right) soll nur das "left-Register als 
Eingang für das FPScale-Modul verwendet werden.
Die Eingangsdaten des FPScale-Moduls sind PSK-Daten (Träger 16Khz bzw 
12kHz). Diese Daten sollen so skaliert und gefiltert werden, dass der 
Ausgangs-Effektivwert einem fest vorgegebenen Wert entspricht (Fehler < 
20%) und keinen DC-Anteil aufweist (> -40dB). Die Ausgangs-Bandbreite 
soll etwa 3kHz bis 30kHz betragen. Die Ausgangsdaten sollen wieder in 
einem 16-bit Register abgelegt werden.

Kann mir bitte jemand mit dem Regelungsalgorithmen helfen, im Anhang 
habe ich ein paar Skizzen abgelegt, die helfen sollen, das Ganze zu 
verstehen. Da Regelungstechnik nicht Gegenstand meines Studiums ist, 
weiß ich nicht weiter. Ich wäre sehr dankbar, wenn jemand mir mit dem 
Regelungsalgorithmen helfen könnte!
Gast #637006
Lesenswert?

Also von dem Anhang zu urteilen hast du die 1. Implementierung mit 
Synplify DSP schon gemacht?

Was ist denn der Umfang wie man das mit dem 2. Tool macht? Hast du da 
auch Funktionsblöcke oder musst du die selber machen?

Von deiner Skizze zu urteilen, ist die erste Funktion des Regelblockes 
die Effketivwertbildung. Hast du damit Probleme?
Gast #637044
Lesenswert?

Was representiert denn das 8.8 fixed point Format? Sollen das 8-bit für 
den Integerwert und 8-bit für Fraktionalenteil sein?

Das soll dann als Zweierkomplement dargestellt werden? Also das 
Vorzeichen wird von den 8-bit Integerwert abgezogen?

Nach S-Notation also s7.8 mit dem Wertebereich:

Also von

Der kleinste positive Wert ist damit 1/256. Das ist aber kleiner als 
1/127. Verstehe ich hier was falsch in der Notation? Im Dokument steht 
das mit 127 rauf oder runter skaliert werden soll.


Die 16-bit Eingangsdaten sind auch Zweierkomplement Zahlen?
OP (Firma: student) #637255
Lesenswert?

8.8 fixed point Format: das 8-bit für den Integerwert und 8-bit für 
Fraktionalenteil, ist richtig, bloß wie bilde ich diesen 
Wert(Algorithmus)? soll ich das Resultat der Effektivwertberechnung und 
Soll-Wert vor dem Vergleich in 8.8-Format umrechnen? Im Blockset von 
SynplifyDSP ist ein Integrierer vorhanden, so daß ich auf einfache Weise 
einen I-Glied realisieren könnte. Was ich nicht weiß: wie soll der 
Gain(8.8-Format) gebildet werden, so daß eine Regelung stattfindet.

Die Eingangsdaten sind 16-bit signed integer Zahlen!
Gast #637313
Lesenswert?

Fang vielleicht mal beim Multiplizierer an.

Also, wenn deine Eingangsdaten 16-bit signed sind, dann ist das ein 
Format s15.0 (oder 16.0, wie du es schreibst). Wenn das mit dem Format 
s7.8 multipliziert wird, dann hat das Ergebnis eine Representation von 
s23.8.

Die Fixedpointregel besagt s(a1.b1) * s(a2.b2) = s(a1+a2+1.b1+b2)

Das bedeutet das am Eingang von der Regelschleife die Zahl ein Format 
von s23.8 hat, ausser ich habe was übersehen und sie wird wieder zurück 
auf s15.0 skaliert. Für die Effektivwertbildung müsstest du das dann 
beachten.

Die Veränderung des Fixepointformats geschieht in der Regel durch 
shiften der Zahl.

Nur mal als Beispiel wie du von s15.0 zu s8.8 kommst. Bei s15.0 hat Bit 
0 die Wertigkeit 2^0. Bei s8.8 hat Bit 8 die Wertigkeit 2^0. Wenn du 
also die Zahl 1.0 im s15.0 Format representiert hast, dann ist Bit 0 
gesetzt. Im s8.8 Format ist Bit 8 gesetzt. Die Umwandlung erfolgt also 
indem man s15.0 um 8-bit nach links shiftet. Da kann es natürlich jetzt 
ein Problem mit Überlauf geben. Um keine Daten zu verlieren müsstest du 
also s15.0 im 8-bit nach links shiften und würdest s23.8 erhalten. Dann 
teste ob die Zahl den s8.8 Bereich überschreitet. Wenn das der Fall ist 
hat ein Überlauf stattgefunden. Ich glaube deine Aufgabenstellung war 
dann den Maximalwert zu nehmen.

Ich muss sagen, das ist eine umfangreiche Aufgabe, dafür dass du 
scheinbar nichts davon in der Vorlesung gehört hast?
Gast #637472
Lesenswert?

Hallo,

ich denke das ist nicht ganz richtig:

> Nach S-Notation also s7.8 mit dem Wertebereich:
>
> -2^7 ... 2^7 - 2^{-8}
>
> Also von
>
> -128 ... 128-1/256

s7.8 überstreicht meiner Meinung nach den Bereich:

-128.99609375 ... 127.99609375

also

-2^(7) - 2^(-8) * 2^(8)-1  ...  2^(7)-1 + 2^(-8) * 2^(8)-1

Deine untere Grenze ist imho nicht ganz korrekt. Oder lieg' ich falsch?


pumpkin
#637537
Lesenswert?

Du hast eigentlich immer noch einen 16-bit-signed-int, der wird nur 
anders interpretiert, das Komma um 8 Binärstellen versetzt.

Der Wertebereich ist statt -32768 bis 32767 also -128.0 bis 127.996 (in 
1/256er Schritten)!

Deine Theorie mit dem "-128.99609375 ... 127.99609375" hat einen Fehler: 
Die Werte zwischen 0 und -1 (oder wahlweise 0 und 1) sind mit dem 
verwendeten Schema nicht darstellbar. Wenn es funktionierte, dann hätte 
man im Prinzip ein Perpetuum Mobile der Informatik ;)

@alban:
> Die Fixedpointregel besagt s(a1.b1) * s(a2.b2) = s(a1+a2+1.b1+b2)

Ich hab ewig gebraucht (auch weil "Numerik für Physiker" ein Weilchen 
her ist), um mir die +1 herzuleiten, die ist nur bei Multiplikation 
zweier vorzeichenbehafteter Variablen da, oder? Also 
u(a1.b1)*s(a2.b2)=s(a1+a2.b1+b2)? (mit u meine ich "unsigned")
Gast #637565
Lesenswert?

@Johannes

>Ich hab ewig gebraucht (auch weil "Numerik für Physiker" ein Weilchen
>her ist), um mir die +1 herzuleiten, die ist nur bei Multiplikation
>zweier vorzeichenbehafteter Variablen da, oder? Also
>u(a1.b1)*s(a2.b2)=s(a1+a2.b1+b2)? (mit u meine ich "unsigned")

Ja das sehe ich auch so. Das extra bit bei den zwei signed 
multiplications kommt from zweiten sign bit. Also z.B.:

s2.2 * s2.2 --> sii.ff * sii.ff = ssiiii.ffff

(i: integer Teil, f: fraktioneller Teil)

u2.2 * s2.2 --> ii.ff * sii.ff = siiii.ffff
Gast #637738
Lesenswert?

Leute, ich danke euch für eure Aussagen, doch mein Problem liegt in dem 
Regelalgorithmus.

1) Ich ermittle den Effektivwert von 64 nachfolgenden Eingangswerten.

2) Effektivwert(Istwert) wird mit dem Sollwert(0.5) verglichen.

3) Nun soll die Stellgröße ermittelt werden (Zahl in 8.8-Format), mit 
welcher 64 nacheinanderfolgenden Eingangswerte multipliziert(skaliert) 
werden sollen. Ich habe in dem Blockset einen Integrierer, den ich 
einsetzen könnte, ich könnte also die (Soll-Ist)-Differenz integrieren.

Wenn ich den Eingangswert(s15-Format) mit der Stellgröße(8.8-Format) 
multipliziere, dann erhalte ich einen Wert in s23.8-Format, wenn ich es 
richtig verstehe. Dieser wird wiederum in die Berechnung des nächsten 
Effektivwertes einbezogen. soll ich diesen Wert(bevor er in die 
Effektivwertberechnung geht) wieder in s15-Format umwandeln?
Gast #638329
Lesenswert?

@Juri,

Im Endeffekt musst du diese Fixedpoint Evaluierung, die wir für den 
Multiplizierer aufgezeigt haben für deine ganze Regelschleife machen. 
Also auch den Integrierer.

Lese dir doch mal das Dokument von dem Link durch den ich gestern 
angegeben habe. Da werden die Regeln ganz gut beschrieben.

Da das ganze im Kreis läuft, wirst du irgendwo das Format anpassen 
müssen, damit es wieder stimmt.

Das ganze ist übrigens kein Regelungstechnik Problem, sondern reine 
Fixedpoint Nummerntheorie, die ihr auf jeden Fall vor der 
Aufgagbenstellung durchgenommen haben müsst. Ansonsten kann ich nicht 
verstehen wie ihr so eine Aufgabe aufbekommt, ohne irgendeine 
Vorbereitung.

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