Ich habe aus einer Messung die Messwerte über die Frequenz. In einem beliebigen Frequenzbereich nehmen die Messwerte sehr ähnliche Werte an, so dass sie nahezu eine horizontale Linie beschreiben.
Wie könnte ich von Matlab automatisch diesen Frequenzbereich finden lassen?
Ich dachte mir dass man die Differenzen benachbarter Messpunkte betrachten könnte und ein Differenzlimit definiert in dem sie zu liegen haben. Aber wirklich weiter hat mich das auch nicht gebracht.
Was passieren soll ist folgendes. Zunächst berechnest Du die Differenz zwischen benachbarten Messwerten. Dann ersetzt Du alle Differenzen die klein genug sind durch 1, der Rest wird 0. Dann bildest Du wieder die Differenzen darüber. +1 sind sie genau dann, wenn der Bereich tendentiell gleicher Werte betreten wird und -1 wenn er verlassen wird. Jetzt werden alle Bereichseingänge gesucht und dazu ihr Verlassen, das ist dann Inhalt der Matrix L. Weil zweimal Differenzen gebildet wurden müssten die Werte in L gegenüber der Ausgangsliste um zwei Werte verschoben werden.
Manuel123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.02.2010, 20:54
Titel:
Hi Evron,
ersmatl danke für die schnelle Antwort. Hab es ausprobiert, aber bekommen immer die Fehlermeldung
Was willst Du denn machen, den curvefitting hört sich nach plotten an. Habe meinen Code aber auch nicht getesttet, er sollte einfach nur Bereiche finden, wo in einer Liste (M), die Differenz zwischen den Werten gering ist, damit also nichts plottbares. Denn L(:,1) sollte sagen, ab welchen Wert es los geht und L(:,2), wo es endet.
Gerade gesehen, dass ein paar Fehler drin waren. Sorry. Also hier als funktionierendes Beispiel:
Code:
M=[13222.522.53467];
Grenze=0.5;
M=M(2:end)-M(1:end-1); % Differenz benachbarter Punkte bilden
M(abs(M)>Grenze)=0; % alle zu großen Differenzen auf 0 setzen
M(M~=0)=1; % den Rest auf 1
M=M(2:end)-M(1:end-1);
M=[M -1]; % damit es am Ende in jedem Fall ein 'Bereichsende' gibt
L(:,1)=find(M==1);
L(:,2)=arrayfun(@(I)find(M(L(I,1):end)==-1,1,'first')+L(I,1), size(L, 1));
L % Ausgabe
erweitertert bei mir den Zeilenvektor um eine Spalte. Wenn aus zwei Vektroren bzw. Matritzen ein(e) neue(r) gebildet wird, müssen beide die gleiche Anzahl von Zeilen bzw. Spalten haben.
Wie auch immer. Zwei Varianten: Entweder Du machst aus Stiffness einen Zeilenvektor
jetzt funktioniert es bei mir auch. Allerdings scheint immer noch etwas falsch zu sein. Betrachtet man die Matrix L so wurden zwar die 1 er erkannt, allerdings findet er nicht die dazugehörige -1.
In der zweiten Spalte steht immer die Zahl 1112. An dieser Stelle befindet sich zwar auch eine -1 aber das macht ja wenig Sinn.
M=M(2:end)-M(1:end-1); % Differenz benachbarter Punkte bilden
M(abs(M)>Grenze)=0; % alle zu großen Differenzen auf 0 setzen
M(M~=0)=1; % den Rest auf 1
M=M(2:end)-M(1:end-1);
M=[M; -1]; % damit es am Ende in jedem Fall ein 'Bereichsende' gibt
L(:,1)=find(M==1);
L(:,2)=arrayfun(@(I) find(M(L(I,1):end)==-1,1,'first')+L(I,1), size(L, 1));
L % Ausgabe
Manuel123
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.02.2010, 15:55
Titel:
Jetzt habe ich das auch mit dem Code verstanden ...
M=M(2:end)-M(1:end-1); % Differenz benachbarter Punkte bilden
M(abs(M)>Grenze)=0; % alle zu großen Differenzen auf 0 setzen
M(M~=0)=1; % den Rest auf 1
M=M(2:end)-M(1:end-1);
M=[M; -1]; % damit es am Ende in jedem Fall ein 'Bereichsende' gibt
L(:,1)=find(M==1);
L(:,2)=arrayfun(@(I)find(M(L(I,1):end)==-1,1,'first')+L(I,1), size(L, 1));
L % Ausgabe
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.