Verfasst am: 21.02.2009, 18:21
Titel: Werte einer [m,n]-Matrix als Bild wiedergeben
Hallo erstmal,
ich habe ein etwas kniffliges Problem, auf dass Ihr hoffentlich eine Antwort wisst. Ich habe eine [m,n]-Martix, deren Werte nicht linear, sondern in x- und y-Richtung durch Vektoren festgelegt werden sollen. Die Werte der Matrix sollen als "Pixel" mit zugehöriger Farbe dargestellt werden, um den Wert in der Grafik erkennen zu können.
Hintergrund der ganzen Aktion ist, dass ich für eine Diplomarbeit STFT- und CWT-Analysen durchführe und die Ergebnisse mit v.a. logarithmischen Ordinaten darstellen möchte.
Könntest du mal einen Codeausschnitt (das was halt für die Problemlösung interessant ist) posten. Kann mir nämlich irgendwie nicht vorstellen wo genau das Problem liegt.
Bezüglich deiner Matrix, schaut die so aus? Wenn ja, wie schaut diese in Matlab genua aus. Wie sprichst du diese an?
Ich bin mir nicht ganz sicher, ob die Funktion CWT bekannt ist, daher kleine Einweisung:
y ist ein Vektor, der ein zu analysierentes Signal darstellt
scales ist ein Vektor, der steuert, in welchem Frequenzbreich und mit welcher Auflösug untersucht wird
wname ist das zu benutzende Wavelet
Code:
coefs=cwt(y,scales,wname); %Ermittelung der Waveletkoeffizienten
F=scal2frq(scales,wname)*fs; %Umrechnen der scales in Frequenzen
Der Zeitvektor ist durch die Anzahl der Elemente in y gegeben und kann durch die Abtastrate leicht generiert werden.
Das Problem ist nun, dass die Matrix coefs die darzustellenden Koeffizienten enthält. Die Werte coefs( m , : ) sind ein scale bzw. eine Frequenz, die Werte coefs( : , n ) sind ein Zeitpunkt. Die Werte coefs( : , n ) sind einfach, da sie linear über den Zeitbereich verteilt sind. Die Werte coefs( m , : ) sind das Problem, sie sind reziprog verteilt, und sollen in der Grafik logarithmisch dargestellt werden.
Mit der Funktion imagesc komme ich nicht weit, da ich weder die Werte beliebig anordnen kann auf der Ordinate, noch einen logarithmische Aufteilung realisieren kann. Bisher löse ich das Problem, indem ich contourf benutze, jedoch funktioniert dies nur bendingt, und für viele Signale nicht anwendbar.
tut mir Leid, aber ich glaube das Problem ist, wir können kaum nachvollziehen was du machen möchtest. Oben steht was von ner Matrix, von der keiner weiß wie Sie aussieht. Dann erwähnst du kurz eine STFT und danach erklärst du CWT und das die Darstellung logarithmisch sein soll. D.h. ich kann auch nur ins blaue hineinraten:
Damit nicht interpoliert wird. Für die CWT sollte das so ähnlich funktionieren, da du die Frames ja dort speichern kannst. Bei der STFT ist es natürlich einfacher weil die dort fest sind.
Ich hab mir die Mühe gemacht, und ein kleine Funktion geschrieben, die mir nun weiter hilft. Ich werde pcolor mal ausprobieren, war mir bisher nicht bekannt, klingt aber nach dem was ich suche. Vieleicht hilft es euch, wenn ich euch mal die Funktion zeige, die ich nun verwende.
if y(1)>y(m) for T=1:M
index=[m m];
for i=1:window
while i>=y(index(1)) && index(1)>1
index(1)=index(1)-1;
end
coeff_map(i,T)=mean(coeff_scale(min(index+[10]):max(index+[10]),T));
index(2)=index(1);
end end else for T=1:M
index=[11];
for i=1:window
while i>=y(index(1)) && index(1)<m
index(1)=index(1)+1;
end
coeff_map(i,T)=mean(coeff_scale(min(index-[10]):max(index-[10]),T));
index(2)=index(1);
end end end
pcolor funktioniert mit den STFT-Daten super, kann aber die CWT-Daten nicht verarbeiten, da diese zu viel an der Zahl sind. Es reicht der Speicher einfach nicht (und mein Rechner hat davon nun eigentlich nicht zuwenig). Meine Funktion ist zwar nicht sehr schnell, kann aber damit arbeiten.
ich würde das nicht gerade ne kleine funktion nennen. Würde glaube ich mind. eine Stunde brauchen um zu verstehen was du da machst. Weiß jetzt auch nicht wie ich dir da jetzt gerade noch helfen kann. Probier einfach das pcolor mal aus und sag bescheid obs klappt oder nicht.
Nun, pcolor ist schon genau das, was ich gesucht habe. Von daher vielen Dank, aber das Problem ist, dass dieser Algorithmus in Verbindung mit der Datenmenge, die bei der CWT entsteht, zuviel Arbeitsspeicher benötigt (4Gbyte real und 4Gbyte virtuell reichen anscheinend nicht mal ansatzweise). Der Algorithmus von mir braucht für die Datenmenge ca. 7 bis 8 min. Das ist nun nicht schnell, aber er funktioniert, von daher werde ich diesen wohl weiter ausbauen.
Bei einer Messung der Bereuchnungsdauer mithilfe der cputime-Funktion habe ich bei den STFT-Daten ermittelt, dass pcolor ca. 1,8s und meine imagesale-Funktion 2,2s benötigt um die Grafik zu erstellen. Von daher eigentlich noch ganz gut.
Falls jemand mal auf ähnliche Probleme mit der Darstellung von Matrix-Daten stößt und pcolor nicht verwenden kann, darf es gerne mal mit imagescale versuchen.
Einstellungen und Berechtigungen
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.