Verfasst am: 21.06.2012, 16:03
Titel: Schrittweise Differenzbildung und Codierung
Hiho, ich habe einen Code geschrieben.
Dieser Code soll eine schrittweise Vektorcodierung vornehmen. Ich habe einen Datensatz. Dieser Datensatz stellt eine Matrix dar. Nun sollen die einzelnen Spaltenvektoren der Matrix nacheinander codiert werden.
Der erste Spaltenvektor bleibt unverändert, dieser wird Irf1 genannt. Der zweite Spaltenvektor wird Irf2 genannt. Der codierte erster Spaltenvektor ergibt sich aus der Differenz Irf1[i]-Irf2[i]. Dabei wird die Bitbreite des Vektors aus der maximalen Differenz zwischen den Elementen berechnet. Zum Bsp., wenn die maximale Differenz von Irf1[i]-Irf2[i] in den Elementen i=389, die Zahl 9 beträgt, dann ist die max. Bitbreite des gesamten Vektors=5bit.
Der zweite codierte Vektor muss sich dann aus der Differenz von Irf2-Irf3 ergeben, wieder muss dabei die maximale Bitbreite berechnet werden.
Insgesamt wird in einem 32bit Bus operiert.
Die gesamte Codierung muss schrittweise erfolgen, das heisst, darf nicht sofort die Differenz zwischen den benachbarten Spaltenvektoren bilden, da in der Realitaet mir kein fertiger Datensatz vorliegt, sondern die Vektoren nacheinander kommen.
Hier ist der Code:
Code:
1:
%Variablen Deklaration
br=32 %Busbreite, darf nicht verändert werden, abhängig vom µC, in diesem Fall 32bit
%in C muesste kommen: int m, n, mm, nn, P;, und auch const br:=32
m=0;
mm=0;
%Zuweisen von Vektoren und nur fuer Matlab laden des Datensatzes
Raw=M1; %Datensatz01, die Rawmatrix
Irf1=Raw(:,1); %erster Vektor (erste M-Sequenz), bleibt unverändert
Irf2=Raw(:,2); %zweiter Vektor, zur Bildung der Differenz
%spaeter muss hier eine Indizierung stehen, so dass dann nacheinander alle
%Vektoren durchgegangen werden, also immer die Differenz zwischen zwei
%nebeneinander stehenden Vektoren gebildet wird (groeßere Schwirigkeit) in
%C sollte das einfacher sein, da man immer auf zwei M-Sequenzen wartet
Dif=zeros(511,1); %zunext leerer Differenzvektor, wird später mit Irf1-Irf2 gefuellt
for i=1:511 %von dem ersten Index der Vektoren, bis 511 durchführen die Differenz
n=Irf1(i)-Irf2(i); %Differenzbildung
if n>m; %suche nach der groeßten Differenz
else m=n; %groeßte Differenz gefunden
end;
end;
if m==0 %Fehlerabfrage, falls m=0 ist, dann ist
Dif=zeros(511,1); %der Differenzvektor gleich 0 end; %kann im Normalfall nicht passieren
while m>0;
mm=bitshift(-m,1); %mm=Breite des codierten Vektors
end; mm=mm+1;
b=br; %Zeiger auf das momentane Bit
j=0; %Zeiger auf das Byte im momentanen Vektor
for i=1:511 %eigentliche Codierung
n=Irf1(i)-Irf2(i); %Differenzbildung
P=b-mm; %Wert um den in dem 32bit Bus verschoben wird
nn=n; %n Differenz von den beiden Werten zwischen
%der Vektoren, nn Zwischenwert zum Verschieben, damit
%die Differenz nicht veraendert wird
bitshift(nn,P); %Um P verschieben
Dif(j)=Dif(j)+nn; %zusammensetzen des codierten Vektors
end;
Hier waere der Pseudocode dazu: 1:
2: Nehme die ersten beiden Spaltenvektoren Irf1 und Irf2
3: Bilde davon die Differenz
4: Suche den höchsten Betrag der Differenz
5: Rechne aus, wie viele Bit braucht dieser Wert
6: Die Anzahl der Bit fuer diesen Wert ergibt die Bitbreite des Diff.Vektors
7: Erstelle den Differenzvektor mit der Bitbreite aus 6.
8: Nehme Irf2 und Irf3
9: Gehe zu 3.
10: End.
Mein Problem ist, dass der Code so ziemlich nicht das macht, was er machen soll und ich kann den Fehler nicht finden.
Viele Grueße.
Verfasst am: 21.06.2012, 17:23
Titel: Re: Schrittweise Differenzbildung und Codierung
Jan S hat Folgendes geschrieben:
Hallo bmtil,
Zitat:
Mein Problem ist, dass der Code so ziemlich nicht das macht, was er machen soll ...
das ist eine sehr vage Fehlerbeschreibung. Kannst Du das noch genauer erklären?
Gruß, Jan
Ja, sorry der Vektor Dif wird nicht richtig erstellt, dieser wird nur mit Nullen befuehlt.
Ich hab 2 kleinere Fehler bereits gefunden, aber an denen lag es aber nicht.
Hier der neue Code:
br=32 %Busbreite, darf nicht verändert werden, abhängig vom µC, in diesem Fall 32bit
%in C muesste kommen: int m, n, mm, nn, P;, und auch const br:=32
m=0;
mm=0;
%Zuweisen von Vektoren und nur fuer Matlab laden des Datensatzes
Raw=M1; %Datensatz01, die Rawmatrix
Irf1=Raw(:,1); %erster Vektor (erste M-Sequenz), bleibt unverändert
Irf2=Raw(:,2); %zweiter Vektor, zur Bildung der Differenz
%spaeter muss hier eine Indizierung stehen, so dass dann nacheinander alle
%Vektoren durchgegangen werden, also immer die Differenz zwischen zwei
%nebeneinander stehenden Vektoren gebildet wird (groeßere Schwirigkeit) in
%C sollte das einfacher sein, da man immer auf zwei M-Sequenzen wartet
Dif=zeros(511,1); %zunext leerer Differenzvektor, wird später mit Irf1-Irf2 gefuellt
for i=1:511 %von dem ersten Index der Vektoren, bis 511 durchführen die Differenz
n=Irf1(i)-Irf2(i); %Differenzbildung
if n>m; %suche nach der groeßten Differenz
else m=n; %groeßte Differenz gefunden
end;
end;
if m==0 %Fehlerabfrage, falls m=0 ist, dann ist
Dif=zeros(511,1); %der Differenzvektor gleich 0 end; %kann im Normalfall nicht passieren
while m>0;
mm=bitshift(-m,1); %mm=Breite des codierten Vektors
mm=mm+1;
b=br; %Zeiger auf das momentane Bit
j=0; %Zeiger auf das Byte im momentanen Vektor
for i=1:511 %eigentliche Codierung
n=Irf1(i)-Irf2(i); %Differenzbildung
P=b-mm; %Wert um den in dem 32bit Bus verschoben wird
nn=n; %n Differenz von den beiden Werten zwischen
%der Vektoren, nn Zwischenwert zum Verschieben, damit
%die Differenz nicht veraendert wird
bitshift(nn,P); %Um P verschieben
Dif(j)=Dif(j)+nn; %zusammensetzen des codierten Vektors
end;
end;
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.