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!
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?
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?
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?
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!
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?
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
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")
@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
@ 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
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?
> "-128.99609375 ... 127.99609375"
Ist ja ekelhaft, böser Fehler! Wieder was dazugelernt...
pumpkin
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.