Verfasst am: 27.07.2011, 15:44
Titel: aus mehreren Limit-Files eine resultierende Minimakennlinie
Hallo liebe Matlab Menschen , ich hab mal wieder ein Problem
habe zwei limit files(Eiheit: Frequenz über dBµV), die beiden geplottet ergeben zwei voneinander versetzte waagrechte linien!
Meine Frage:
Jedes file hat unterschiedliche minima und maxima, da Absatz zwischen den beiden(siehe Anhang). Nun möchte ich gerne die beiden kennlienen vergleichen und eine resultierende Minima-und Maximakurve generieren.
Sitze schon seit vormittag an diesem problem, bitte HILFE!!
Meine Idee:
Die Mins aus den beiden limits raussuchen, dass größere solange mit dem anderen vergleichen, bis dieses größer oder gleich dem größeren wird , ab dann wird die kleinere der beiden limits verwendet!
Hoffe es ist einigermaßen verständlich
Danke schon mal
Du hast zwei Kennlinien in einem Frequenzbereich...Achsenbeschriftung wäre was feines
K1 mit 50µV im Bereich: 0.03...4.25 (Hz??)
K2 mit 52µV im Bereich: 0.50...8.54 (Hz??)
Der gemeinsame Freq.bereich ist demnach 0.5...4.25 (Hz??). Was willst du jetzt vergleichen? Kannst du dein gewünschtes Ergebnis bitte etwas genauer definieren.
Der gemeinsame Freq.bereich ist demnach 0.5...4.25 (Hz??).
nicht ganz; Limit 1 mit 50µV wird verwendet von 0.03MHz...0.5Mhz, ab hier soll der resultierende Plott auf die Kennliene K2 mit 52µV springen und diese bis zum Ende verwenden!
Sorry für die fehlende Skalierung, sollte nur ein Beispiel sein!
In ferner zukunft soll es dann mal so aussehen, dass ich mehr als nur zwei limits habe, sondern mehrere und ein entsprechendes Programm soll mir dann das resultierende limit daraus bilden und einzeichnen!
hier ist es natürlich auch wieder ein sonderfall, da beide limits (K1 ß K2) einen gemeinsamen x-Wert von 0.5 besitzten--> dies ist leider nur sehr selten!
Wie kann das dann funktionieren um keinen schrägen sprung auf die nächste Kennlinie zu erhalten siehe Anhang!
hier ist es natürlich auch wieder ein sonderfall, da beide limits (K1 ß K2) einen gemeinsamen x-Wert von 0.5 besitzten--> dies ist leider nur sehr selten!
Wie kann das dann funktionieren um keinen schrägen sprung auf die nächste Kennlinie zu erhalten siehe Anhang!
Ja gar nicht! Wenn max(f) von K1 < als min(f) von K2, wirst du beim Verbinden immer diese Schräge haben (eigtl. ein undefinierter Bereich).
Ich habe es jetzt schon mal für 3 Kennlinien zusammen. Allerdings mit der Schräge, wenn sich die benachtbarten Kennlinien nicht überschneiden. Du musst mir mal noch erklären, wie du die Schräge verhindern möchtest. Ich habe mir das Ergebnis deines Programms für diesen Fall noch nicht angeschaut.
Ich weiß ja jetzt nun nicht, wie viele Kennlinien du hast...man sollte am Besten eine Funktion schreiben, mit der MyStruct mit den Kennlinien gefüllt wird. Die Darstellung macht man am Besten auch noch in einer Schleife.
% gesamte Kennlinie erstellen
m = 1; % aktueller Index der n+1. Kennlinie
l = 1; % l = gibt den aktuellen Index von K gesamt an for n = 1:length(minima_x) for i = 1:length(MyStruct(n,1).xval) % i. Frequenzwert der m. Kennlinie kleiner n. minimum? if MyStruct(n,1).xval(i) <= minima_x(n) % ja...Werte der n. Kennlinie nehmen
MyStruct(anzahl_k+1,1).xval(l) = MyStruct(n,1).xval(i);
MyStruct(anzahl_k+1,1).yval(l) = MyStruct(n,1).yval(i);
else % Werte von der nächsten Kennlinie (n+1) nehmen
MyStruct(anzahl_k+1,1).xval(l) = MyStruct(n+1,1).xval(m);
MyStruct(anzahl_k+1,1).yval(l) = MyStruct(n+1,1).yval(m);
m = m + 1;
end
l = l + 1;
end % aktuellen Index von K gesamt in l speichern
l = l + m - 1;
j = m; % j wird für den Rest benötigt
m = 1; % nächste Kennlinie: m zurücksetzen end % Rest von letzter Kennlinie anhängen
MyStruct(anzahl_k+1,1).xval(l:l + length(MyStruct(anzahl_k,1).xval) - j) = MyStruct(anzahl_k,1).xval(j:end);
MyStruct(anzahl_k+1,1).yval(l:l + length(MyStruct(anzahl_k,1).yval) - j) = MyStruct(anzahl_k,1).yval(j:end);
% Kennlinien plotten:
%for i=1:anzahl_k+1 semilogx(MyStruct(1,1).xval, MyStruct(1,1).yval,'b','LineWidth',4);
hold on
%end;
semilogx(MyStruct(2,1).xval,MyStruct(2,1).yval,'r','LineWidth',4);
semilogx(MyStruct(3,1).xval,MyStruct(3,1).yval,'m','LineWidth',4);
semilogx(MyStruct(4,1).xval,MyStruct(4,1).yval,'g--','LineWidth',2);
hold off;
grid on;
axis([0.9*min(MyStruct(1,1).xval)1.1*max(MyStruct(3,1).xval)4855]);
xlabel('Frequenz in [MHz]');
ylabel('Magnitude in [dBµV]');
legend('K1','K2','K3','K gesamt')
Hey ich dank dir! Werds mir gleich mal anschaun. Ich hab sowas gebastelt, aber bei weitem nicht so fein und sauber strukuriert wie bei dir:(
Werd deine Lösung heut mal durcharbeiten, denn das problem bei meiner lösung ist, sie ist nur auf diesen speziellen fall anwendbar. Ich benötige jedoch eine Funktion, die für jedmögliche limitfile konstellation anwendbar ist.
plot(parsedData(:,1), parsedData(:,2),'r', freq1, dbu1, 'b', freq2, dbu2, 'c');
hold on;
grid on;
set(gca,'xscale','log');
set(gca, 'ylim', [48 55]);
%Beschriftung der plots
min_array = [];
%maxValue = max(parsedData(:,1));
%min und max Werte der einzelnen limit - files
minVal_1 = min(parsedData(:,1));
minVal_2 = min(secondLimit(:,1));
maxVal_2 = max(secondLimit(:,1));
minVal_3 = min(thirdLimit(:,1));
maxVal_3 = max(thirdLimit(:,1));
%% Abfragen der limit Granzen
%Abfrage auf welchen limit file das resultierende starten soll
if(minVal_1>minVal_2)
option = 1;
else
option = 2;
end
%umgekehrte Fall(case 1 noch nicht bearbeitet)
switch option
case 2,
%loop_count
for iii = 1:length(parsedData(:,1))
if(parsedData(iii,1) < minVal_2)
min_array(iii, = parsedData(iii,;
else
%minVal_2 muss senkrecht auf erstes Limit springen
min_array(iii, = [minVal_2, parsedData(1,2)];
%wenn limit erreicht ist wird die for-loop abgebrochen
break;
end
end
%zweites limit wird an min_array angehängt
min_array = [min_array; secondLimit];
end
%min_array(find(min_array(:,1) >= minVal_3), = [];
%neues Limit muss wieder an min_array angehängt werden
min_array(length(min_array)+1, = [maxVal_2, thirdLimit(1,2)];
x = find(thirdLimit(:,1) >= maxVal_2);
min_array = [min_array; thirdLimit(x,];
plot(min_array(:,1), min_array(:,2),'g');
Xlabel ('f in [MHz]');
ylabel(' Magnitude in dBµV');
hl = legend('parsedData','secondLimit','thirdLimit' ,'result.Limit','Location','NorthWest');
hold off;[code]
In denen bereichen wo sich die limits nicht überlappen, soll auch kein resultierendes sein.
Zitat:
Ich weiß ja jetzt nun nicht, wie viele Kennlinien du hast...
Es können schon bis zu 10 oder 15 sein.
Echt sau nett von dir, dass du dir soviel Mühe gemacht hast!
Geb dir morgen Bescheid, wies weitergeht![/code]
Habe noch einen Fehler gefunden, wenn fmax von K2 < fmax K1...
Außerdem müsste man die Kennlinien in Mystruct vorher nach den Y-Werten und den fmin - Werten aufsteigend sortieren.
Code:
% gesamte Kennlinie erstellen
m = 1; % aktueller Index der n+1. Kennlinie
l = 1; % l = gibt den aktuellen Index von K gesamt an for n = 1:length(minima_x) iflength(MyStruct(n+1,1).xval) < length(MyStruct(n,1).xval)
k = length(MyStruct(n+1,1).xval);
else
k = length(MyStruct(n,1).xval);
end for i = 1:k
% i. Frequenzwert der m. Kennlinie kleiner n. minimum? if MyStruct(n,1).xval(i) <= minima_x(n) % ja...Werte der n. Kennlinie nehmen
MyStruct(anzahl_k+1,1).xval(l) = MyStruct(n,1).xval(i);
MyStruct(anzahl_k+1,1).yval(l) = MyStruct(n,1).yval(i);
else % Werte von der nächsten Kennlinie (n+1) nehmen
MyStruct(anzahl_k+1,1).xval(l) = MyStruct(n+1,1).xval(m);
MyStruct(anzahl_k+1,1).yval(l) = MyStruct(n+1,1).yval(m);
m = m + 1;
end
l = l + 1;
end % aktuellen Index von K gesamt in l speichern
l = l + m - 1;
j = m; % j wird für den Rest benötigt
m = 1; % nächste Kennlinie: m zurücksetzen 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.