Forum: Digitale Signalverarbeitung / DSP / Machine Learning Hilfe: Datenskalierung mit einem 8.8-fixed point Wert


von Juri L. (Firma: student) (juran78)


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!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Der Anhang fehlt.

von Juri L. (Firma: student) (juran78)


Angehängte Dateien:

Lesenswert?

jetzt aber!

von Alban (Gast)


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?

von Juri L. (Firma: student) (juran78)


Lesenswert?

die erste Implementierung ist noch nicht fertig, es fehlt der 
Regelalgorithmus, und ich weiß nicht genau, wie ich die Regelung 
realisieren soll. wie soll ich denn Gain (8.8-Format) bilden?

von Alban (Gast)


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?

von Juri L. (Firma: student) (juran78)


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!

von Alban (Gast)


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?

von pumpkin (Gast)


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

von Johannes S. (johanness)


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")

von Alban (Gast)


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

von Alban (Gast)


Lesenswert?

@ pumpkin

>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

Ich tu mir jetzt auch schwer das zu erklären. Johannes hat das ganz gut 
getan.

Ich bin einfach der Beschreibung hier gefolgt:

http://www.acoustics.hut.fi/teaching/S-89.3510/2006/projektityo/FixedPointDSPDev.pdf

von Juri Lechner (Gast)


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?

von Juri Lechner (Gast)


Lesenswert?

na was ist Leute, keine Ideen? :(

von pumpkin (Gast)


Lesenswert?

> "-128.99609375 ... 127.99609375"

Ist ja ekelhaft, böser Fehler! Wieder was dazugelernt...

pumpkin

von Alban (Gast)


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.

von Juri Lechner (Gast)


Lesenswert?

vielen dank an alle hilfsbereiten user !!!

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.