WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

aus mehreren Limit-Files eine resultierende Minimakennlinie

 

elcachon
Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 27.07.2011, 15:44     Titel: aus mehreren Limit-Files eine resultierende Minimakennlinie
  Antworten mit Zitat      
Hallo liebe Matlab Menschen Laughing , ich hab mal wieder ein Problem Sad
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!!Smile

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

untitled.fig
 Beschreibung:

Download
 Dateiname:  untitled.fig
 Dateigröße:  4.06 KB
 Heruntergeladen:  310 mal
Private Nachricht senden Benutzer-Profile anzeigen


elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 08:34     Titel:
  Antworten mit Zitat      
Guten morgen,

weiß wirklich gar niemand einen Rat? Bin schon a bissal verzweifelt! Sad

Bin für jeden Ratschlag dankbar
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 09:33     Titel:
  Antworten mit Zitat      
jemand daheim??
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 10:25     Titel:
  Antworten mit Zitat      
Ehrlich gesagt verstehe ich deine Idee nicht Question

Du hast zwei Kennlinien in einem Frequenzbereich...Achsenbeschriftung wäre was feines Wink

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.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 11:01     Titel:
  Antworten mit Zitat      
hey danke für deine Antwort,
Zitat:

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!

Gruß elcachon
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 11:09     Titel:
  Antworten mit Zitat      
d.h. die Gesamtkennlinie soll dann eine Stufe bei 0.5 MHz haben und dort auf 52µV springen und auf diesem Wert bis 8.54 MHz gehen?

Edit: Sollen die beiden Bereich bei der Stufe verbunden werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 11:14     Titel:
  Antworten mit Zitat      
ja genau!

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 11:33     Titel:
  Antworten mit Zitat      
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!

untitled.fig
 Beschreibung:

Download
 Dateiname:  untitled.fig
 Dateigröße:  7.91 KB
 Heruntergeladen:  354 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 11:35     Titel:
  Antworten mit Zitat      
Habs mal ziemlich unelegant und nur für diesen spezifischen Fall gelöst!

Code:

freq = [0.67 0.88 3.90 4.59 5.77 6.23 8.54];
dbu = [52 52 52 52 52 52 52];
together = [freq', dbu'];
hold on;
plot(parsedData(:,1), parsedData(:,2),'r', freq, dbu, 'b');
grid on;
set(gca,'xscale','log');
set(gca, 'ylim', [48 55]);

hl = legend('parsedData','together','Location','best');

min_array = [];

maxValue = max(parsedData(:,1));

minVal_1 = min(parsedData(:,1));
minVal_2 = min (together(:,1));

%kleinster Wert von parsedData größer als kleinster Wert von together

if(minVal_1>minVal_2)
    option = 1;
else
    option = 2;
end

switch option
   
    case 2,
             
%loop_count
for iii = 1:length(parsedData(:,1))
   
    if(parsedData(iii,1) <= minVal_2)
       
        min_array(iii,:) = parsedData(iii,:);
         
    else
        %wenn limit erreicht ist wird die for-loop abgebrochen
        break;
    end

end
   

   
end  
min_array = [min_array;together];
plot(min_array(:,1), min_array(:,2),'g');
Xlabel ('f in [MHz');
ylabel(' Magnitude in dBµV');
hold off;


alles noch in der erprobungsphase
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 12:24     Titel:
  Antworten mit Zitat      
elcachon hat Folgendes geschrieben:
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).
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 12:41     Titel:
  Antworten mit Zitat      
stimmt!

aber genau das soll ja umgangen werden, es soll eine senkrechte sein egal ob
Zitat:
max(f) von K1 < als min(f) von K2
ist oder nicht!

Hab jetz das jetzt so gelöst,gefällt mir aber gar noch gar nicht.
Code:
for iii = 1:length(parsedData(:,1))
   
    if(parsedData(iii,1) < minVal_2)
       
        min_array(iii,:) = parsedData(iii,:);
         
    else
       % hier wird einfach min(f)von K2 mit dem dbu-Wert von K1 verknüpft
        min_array(iii,:) = [minVal_2, parsedData(1,2)];
       
        %wenn limit erreicht ist wird die for-loop abgebrochen
        break;
    end

end
 


Danke das du dir zeit nimmst mir zu helfen!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 15:56     Titel:
  Antworten mit Zitat      
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.

Code:

clear all;
df = 0.01;
% Kennlinie 1
MyStruct(1,1).name = 'K1';
MyStruct(1,1).xval = [0.03:df:4.25].*10^6; % MHz
MyStruct(1,1).yval = [ones(1,length(MyStruct(1,1).xval)).*50]; % µV
% Kennline 2
MyStruct(2,1).name = 'K2';
MyStruct(2,1).xval = [0.50:df:8.54].*10^6; % MHz
MyStruct(2,1).yval = [ones(1,length(MyStruct(2,1).xval)).*52]; % µV
% Kennline 3
MyStruct(3,1).name = 'K3';
MyStruct(3,1).xval = [9.5:df:12.54].*10^6; % MHz
MyStruct(3,1).yval = [ones(1,length(MyStruct(3,1).xval)).*53]; % µV

% Anzahl der Kennlinien ermitteln
anzahl_k = length({MyStruct.name});
% Freq.-Minimum jeder Kennlinie ab K2 ermitteln
for i=2:anzahl_k
    minima_x(i-1) = min(MyStruct(i,1).xval);
end

% Kennlinie gesamt:
MyStruct(anzahl_k+1,1).name = 'K gesamt';
MyStruct(anzahl_k+1,1).xval = [];
MyStruct(anzahl_k+1,1).yval = [];

% 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) 48 55]);
xlabel('Frequenz in [MHz]');
ylabel('Magnitude in [dBµV]');
legend('K1','K2','K3','K gesamt')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
elcachon
Themenstarter

Forum-Century

Forum-Century


Beiträge: 190
Anmeldedatum: 03.05.11
Wohnort: ---
Version: 7.6.0(R2008a), 7.8.0(R2009a)
     Beitrag Verfasst am: 28.07.2011, 16:28     Titel:
  Antworten mit Zitat      
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.

[code]
%% Max ß Min Teil 2
close all;
%function f = MaxAndMin(axesName,inputData)
%parsedData = inputData;
freq0 = [0.0300 0.1500 0.3000 0.5000 1.2500 4.2500];
dbu0 = [50 50 50 50 50 50];
parsedData = [freq0',dbu0'];
%zusätzliches limit file für test
freq1 = [0.67 0.88 3.90 4.59 5.77 6.23 8.54];
dbu1 = [52 52 52 52 52 52 52];
secondLimit = [freq', dbu'];
%nexter limit block für test
freq2 = [7.55 9.44 12.02 15.88 17.13 25.05 30.12 45.33 80.05];
dbu2 = [51 51 51 51 51 51 51 51 51];
thirdLimit = [freq2', dbu2'];

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,Smile = parsedData(iii,Smile;

else
%minVal_2 muss senkrecht auf erstes Limit springen
min_array(iii,Smile = [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),Smile = [];

%neues Limit muss wieder an min_array angehängt werden
min_array(length(min_array)+1,Smile = [maxVal_2, thirdLimit(1,2)];
x = find(thirdLimit(:,1) >= maxVal_2);
min_array = [min_array; thirdLimit(x,Smile];

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]
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 16:44     Titel:
  Antworten mit Zitat      
Dann zeichne doch einfach Punkte

Code:


...dann hast du auch die Schräge/vertikale Linie nicht mehr. In diesem Übergang von Kn zu Kn+1 hat man ja ohnehin keine Werte.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.07.2011, 19:51     Titel:
  Antworten mit Zitat      
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)
    if length(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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.