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

Nachbildung von Messdaten

 

Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2011, 15:55     Titel: Nachbildung von Messdaten
  Antworten mit Zitat      
Hey Matlab-Versteher!!!

Ich hab ein Problem, welches mich verzweifeln lässt!

Ich habe eine Reihe Messdaten (Spannung über Zeit) und soll die(fragt mich ned warum) nachbilden.

Habe schon einiges durchprobiert und letzendlich auf den Ansatz gekommen:

Die Messdaten können grob in einen Sinus eingebettet werden:
Also hol ich mir die Nullstellen von den Messdaten und generiere ein Sinus mit der gleichen Frequenz und Amplitude zwischen je zwei Nullstellen, und dass hin bis ich zwischen allen Nullstellen ein eigens generierten Sinus hab:

Meine codes gehen bisher so:
Ach ja, ich bin kein Programmierer und kein Matlab-Kenner, es gibt sicherlich krasse Schönheitsfehler (ruhig ansprechen Smile )

Code:

function zero(xwert, ywert)

% zero speichert den neg. Messwert vor der Nullstelle und den pos.
% Messerwert nach der Nullstelle



A=[xwert ywert];                        % Erzeugung einer Matrix aus den Messdaten

j=1;                                    % Startwert der For-Schleife
for i=1:length(A(:,1))                  % Definieren der Abtastrate
    if A(i, 2)<=0 && A(i+1, 2)>=0       % Bedigung zur Nullstellenerkennung
        P1(j, 1)=A(i, 1);                % Speichern der neg. Seite der N.stelle
        P1(j, 2)=A(i, 2);                % zugehöriger x-Wert
        P2(j, 1)=A(i+1, 1);            % Speichern der pos. Seite der N.stelle
        P2(j, 2)=A(i+1, 2);            % zugehöriger x-Wert
           
        j=j+1;                          % nächster Punkt
   
    end

end
 


=>Dieser Funktioniert soweit

Code:

function geradengleichung(P1,P2)

% geradengleichung berechnetet die Werte jeder Geradengleichung y=m*x+n und
% speichert die y-Werte welche zu den x=0 Werten gehen soll ab
j=1;
for k=1:length(P1(:,1))
   
    m(k,1)=(P2(j,2)-P1(j,2))/(P2(j,1)-P1(j,1));
    n(k,1)=P1(j,2)-m(k)*P1(j,1);
   
    z(k,1)=(-n(k,1)/m(k,1));
    %z(k,2)=[0];
    j=j+1;
   
end  
 


=>funktioniert auch

Code:

function sinus(z)

% sinus generiert die Messdaten des zu nachbildeten Messsignals

fs=5000;                                              % Abtastrate, Samplingrate
Ueff=230*sqrt(2);                                     % Effektivwert der Eingangsspannugn
j=1;

for k=1:length(z()-1)                                  % start der for-schleife
    x1=z(j,1);
    x2=z(j+1,1);
    x = x1:1/fs:x2;                                  % Bereich des k-ten Sinus
    td = x2-x1;                                      % Berechnung der Periodendauer
    f = Ueff.*sin(2*pi.*1/td.*(x-x1));               % Funktion der einzelnen Sinusabschnitte
   
    if length(x)<=100                                % Erzwingung der Dimensionsbedigung von Matrizen  
        x(101)=[x2];
        f(101)=[0];
    end

    if length(x)>101
        x(102)=[];
        f(102)=[];
       
    end
    Mf(:,j)=f;                                      % Abspeichern der y-daten in eine MAtrix
    Mx(:,j)=x;                                      % Passende x-Werte dazu
   
   
    j=j+1;
    end

 


=> Funktioniert ned wirklich.

Ich bekomme bei dem letzten Code bei der Matrix Mf und Mx in einer Spalte Nullen (bis auf den ersten Wert)

Wenn ich mir das dann zeichen lasse:

Code:

k=1;

for i=1:length(Mf)
    hold on
    plot(Mx(:,k),Mf(:,k));
    k=k+1;
   
end
 


bekomme ich somit eine Gerade auf der x-Achse. und ein Sinus fehlt hinten.
Also eigentlich fehlt vorne einer und hinten einer (is noch n anderes Problem), aber so fehlen hinten 2.

Verständlich ausgedrückt? Hoffe ich.
Wie kann es sein dass genau eine Spalte 0 ist, wenn alle anderen so gut funktionieren?

Bitte um hilfe!


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 29.07.2011, 19:29     Titel:
  Antworten mit Zitat      
Hast du etwas vorgegeben, wie die Messdaten nachgebildet werden sollen?

Es gäbe da z.B. auch Curve Fitting oder die DFT...

Auf den ersten Blick fällt mir jetzt nur folgendes auf:

Code:

for k=1:length(z()-1)
...
% soll wohl heißen, Länge von z - 1
% das ist es aber nicht, sondern so:
for k=1:length(z)-1  
% die Klammern z() kann man auch weglassen      
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2011, 08:03     Titel:
  Antworten mit Zitat      
Nein, habe nichts vorgegeben.

Ich weiß dass es ein Sinus sein soll. Und hab schon solche Sachen ausprobiert. Curve fitting und auch FFT und so. aber da die Frequenz (miniminimal) sich ändert, und das Signal sehr lang ist bräuchte ich immer neue Abtastpunkte und start Punkte, sonst verschiebt sich das Signal. Deswegen die Lösung mit den Nullstellen!!

Danke für die verschönung Smile und die Anmerkung. Werde ich mal ändern und schauen was passiert Smile


Wenn es nicht verstanden wird. Bitte fragen, ich versuchs so gut wie möglich zu erklären...

Gruß... Ich!!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.08.2011, 09:18     Titel:
  Antworten mit Zitat      
Moin,

habs noch nicht ganz verstanden?

Zitat:
Curve fitting und auch FFT und so. aber da die Frequenz (miniminimal) sich ändert, und das Signal sehr lang ist bräuchte ich immer neue Abtastpunkte und start Punkte, sonst verschiebt sich das Signal.


Du hast ein Messfenster mit n Werten eines Sinussignals? Ändert sich nun innerhalb des Messfensters die Frequenz? Das wäre der FFT (bestimmt alle Frequenzanteile des Signals im Messfenster) aber egal, solange das Abtasttheorem eingehalten wird. Falls das Signal außerhalb deines Messfensters die Freq. ändert, ist ja auch die Nullstellen-Bestimmung falsch, da sie auch nur das Signal aus dem Messfenster wiedergibt Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2011, 10:23     Titel:
  Antworten mit Zitat      
Ok... Gedanken sammeln und zu Blatt bringen (schwierig):

Angenommen ich mach eine FFT über dass Messsignal, dann bekomme ich einen Frequenzpeak bei (z.B. 50.015). Wenn ich jetzt ein neuen Sinus generiere mit der Freuquenz dann stimmt das signal gegen Ende nicht mehr mit den Messdaten überein (die ausgerechnete Frequenz ist ja nur ein mittelwert).
Ich könnte jetzt auch für einzelne Abschnitte immer ne FFT machen und mein Sinus den Messdaten anzupassen, aber ich dacht mit den Nullstellen wäre dass viel geschickter und (für mich) einfacher!!

Würde es denn helfen wenn ich mal so ne reihe Messdaten hochlade?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.08.2011, 10:36     Titel:
  Antworten mit Zitat      
Hmpfxxx hat Folgendes geschrieben:
Wenn ich jetzt ein neuen Sinus generiere mit der Freuquenz dann stimmt das signal gegen Ende nicht mehr mit den Messdaten überein (die ausgerechnete Frequenz ist ja nur ein mittelwert).


Warum sollte die ermittelte Frequenz der FFT nur ein Mittelwert sein? So lange das Abtasttheorem eingehalten wird und der Leakage Effekt vermieden werden kann, erhältst du mit der FFT die exakte/n Frequenz/en des Signals.

Lad doch mal die Messdaten hoch...am Besten einen gepackten .mat-File.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2011, 11:04     Titel:
  Antworten mit Zitat      
Bei dem FFT bekomm ich doch ne Gaussche Glocke heraus oder? Daraus kann ich zwar die Frequenz finden, die am häufigsten vorkommt, aber kleine Abweichungen kann ich doch nicht in mein nachgebildetet Signal mit simulieren. (glaub ich)

So n Leakage Effekt is nicht im Singal vorhanden.

Nachfolgenden noch die Codes für die FFT die ich mit den Messsignalen durchgeführt hab.
Code:

Ts      = diff(time(1:2));              % Abtastzeit
N       = length(time);                 % Länge des Datenvektors
f       = (0:floor((N-1)/2)) / (N*Ts);    % Frequenzvektor für Spektrum-Plot
frequenz=transpose(f);
% Fouriertransformierte
SIGNAL      = fft(signal);                                      % Fouriertransformation
SIGNAL      = SIGNAL / N;                                       % Normierung
SIGNAL      = [SIGNAL(1);2*SIGNAL(2:floor((N-1) / 2) + 1)];     % begrenzen auf f_max
ergebnis    = [SIGNAL frequenz];                                %Erzeugen einer Messdatei

%Maximalwertbestimmung
xvektor=abs(SIGNAL);                    %Absolutwerte des komplexen Vektors
yvektor=abs(frequenz);                  
xmax=find(xvektor==max(xvektor));       %suche nach dem Maximum der x-Achse

fmax=yvektor(xmax);                     %suche nach y-Wert des Maximum


%Visuelle Ausgabe
plot(ergebnis(:,2),abs(ergebnis(:,1)));
xlim([0 100])
 


Code:

fs = 5000;                          % [Hz] Abtastfrequenz
to = 0;                             % [s] Anfangszeit
te = 80;                            % [s] Endzeit        
t  = to:1/fs:te;                    % [s] Vektor Abtastzeiten
a = 230;                            % [V] Amplitude
f  = fmax;                            % [Hz] Frequenz-Vektor
p = 0.54*pi/180;                     %Phasenkorrektur
sinus = a.*sin(2*pi.*f.*t+p);            % Sinus-Signal

plot(t,sinus,'Color',[1 0 0])
 


test.zip
 Beschreibung:

Download
 Dateiname:  test.zip
 Dateigröße:  2.62 MB
 Heruntergeladen:  341 mal
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 02.08.2011, 11:36     Titel:
  Antworten mit Zitat      
Ich habe mal das Amplitudenspektrums deines kompletten Signals dargestellt. Da in diesem Messfenster keine ganzen Perioden deines Signals enthalten sind (ist bei einem chirp-Signal auch schwer zu erreichen), ensteht doch ein Leakage-Effekt Wink. Daher habe ich das Zeitsignal noch mit einem Hann-Fenster bewertet, um den Leck.-Effekt zu minimieren. Außerdem habe ich mal zu Beginn des Zeitsignals eine Grundwelle herausgenommen. Hier sieht man deutlich, dass es kein reiner Sinus ist, der lediglich über der Zeit seine Frequenz ändert. Die Grundwelle ist hier schon mit Störungen überlagert, was auch das Amplitudenspektrum verdeutlicht. In so fern wäre die Bestimmung der Freq. über die Nullstellen zwar für die Grundwelle richtig, aber die Nachbildung des Signals wäre nicht exakt.

Man könnte nun aus dem FFT-Spektrum z.B. die höchten 20 Amplitudenwerte nehmen und daraus wieder ein Signal generieren. Ob das sinnvoll ist, weiß ich aber nicht. Dazu müsstest du mal genauer beschreiben, welche Anforderung (Genauigkeit) an die Nachbildung gestellt werden.

Gruß DSP

Amplitudenspektrum.GIF
 Beschreibung:

Download
 Dateiname:  Amplitudenspektrum.GIF
 Dateigröße:  44.98 KB
 Heruntergeladen:  457 mal
Grundwelle_signal.GIF
 Beschreibung:

Download
 Dateiname:  Grundwelle_signal.GIF
 Dateigröße:  11.75 KB
 Heruntergeladen:  443 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2011, 14:53     Titel:
  Antworten mit Zitat      
Hui... erst mal danke dass du dir so viel mühe mit mir gibst.

Das einzige was ich sagen kann ist, dass des mit den Nullstellen bei der Nachbildung genau genug ist. Smile
Und ich mich letzend Endes dazu entschieden habe.

Problem ist bei mir immer noch, dass bei meinem Code irgendwas falsch sein muss... Und ich deswegen drei falsche Nachbildungen bekomme: Es liegt daran, dass Matlab bei zwei von den drei einzelnen Sinusnachbildungen NaN da stehen hat und beim dritten 0.

Ich lad jetzt einfach mal alles Hoch und hoffe du/ihr könnte mir den doofen Fehler sagen.

Bei der Variablen Mf sind bei den Spalten 2436 2552 und 2355 irgend ein Fehler.
Zudem schaff ich es rein logisch ned, zu kapieren wie ich den ersten und letzten Sinus nachbilden soll..

Hauptfunktion ist zero(x,y) mit den Daten die ich oben schon reingestellt hab!

Schauts euch an.. Danke Smile

Lala.zip
 Beschreibung:

Download
 Dateiname:  Lala.zip
 Dateigröße:  1.66 KB
 Heruntergeladen:  279 mal
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2011, 16:44     Titel:
  Antworten mit Zitat      
Ok ich glaub ich habs soweit geschafft...

wenn man die fuction sinus durch den Code ersetzt, kommt ein wunderschönes Signal heraus.

Code:

function sinus(z)

%sinus generiert die Messdaten des zu nachbildeten Messsignals

fs=5000;                                              %Abtastrate, Samplingrate
Ueff=230*sqrt(2);                                     %Effektivwert der Eingangsspannugn

j=1;

for k=1:length(z)-1                          %start der for-schleife
    if z(j) ~= z(j+1) && z(j+1) > z(j)
   
    x1=z(j,1);
    x2=z(j+1,1);
    x = x1:1/fs:x2;                                  %Bereich des k-ten Sinus
    td = x2-x1;                                      %Berechnung der Periodendauer
   
    %else
    %    x2=z(j,1);
    %    x1=z(j+1,1);
    %    x0=z(j+1,1)-x2;
    %    x=x0:1/fs:x1;
    %    td=x1-x2;

       
   
   
    f = Ueff.*sin(2*pi.*1/td.*(x-x1));               %Funktion der einzelnen Sinusabschnitte
   
    if length(x)<=100                                %Erzwingung der Dimensionsbedigung von Matrizen  
        x(101)=x2;
        f(101)=0;
    end

    if length(x)>101
        x(102)=[];
        f(102)=[];
       
    end
    Mf(:,j)=f;                                      %Abspeichern der y-daten in eine MAtrix
    Mx(:,j)=x;                                      %Passende x-Werte dazu
   
    end
    j=j+1;

end
   
erzeuge(Mx,Mf);
 


Jetzt muss ich mir nur noch was für den ersten und letzten abgehackten Sinus überlegen!
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.08.2011, 08:46     Titel:
  Antworten mit Zitat      
Ich hänge immer noch mit nem geistigen logischen Knoten im Kopf da!!

Mein aktuelles Sinus-Generier-Program sieht so aus:
Code:

function sinus(z)

%sinus generiert die Messdaten des zu nachbildeten Messsignals

fs=5000;                                              %Abtastrate, Samplingrate
Ueff=230*sqrt(2);                                     %Effektivwert der Eingangsspannugn

j=1;

for k=1:length(z)-1                          %start der for-schleife
    if z(j) ~= z(j+1) && z(j+1) > z(j)
   
   
        if k-1~=0
        x1=z(j,1);
        x2=z(j+1,1);
        x = x1:1/fs:x2;                                  %Bereich des k-ten Sinus
        td = x2-x1;                                      %Berechnung der Periodendauer
   
        else
          td=z(2,1)-z(1,1);  
          x=0:1/fs:z(1,1);
          x1=z(1,1);      
          x2=z(1,1);
         
   
        end
       
   
   
    f = Ueff.*sin(2*pi.*1/td.*(x-x1));               %Funktion der einzelnen Sinusabschnitte
   
    if length(x)<=100                                %Erzwingung der Dimensionsbedigung von Matrizen  
        x(101)=x2;
        f(101)=0;
    end

    if length(x)>101
        x(102)=[];
        f(102)=[];
       
    end
    Mf(:,j)=f;                                      %Abspeichern der y-daten in eine MAtrix
    Mx(:,j)=x;                                      %Passende x-Werte dazu
   
    end
    j=j+1;

end
%j=length(z);
%Mf(:,j)=Ueff.sin(2*pi.*1/td.*(x-1));
%Mx(:,j)=x;
erzeuge(Mx,Mf);
 


mit dem Code bekomme ich Bild 2 hin

mach ich die else bedingung weg dann bekomm ich Bild 1

1.Problem: bei bild zwei bekomme ich nullen in meine Mx Matrix... kein Plan warum.
2.Problem: Bei Bild zwei fehlt der zweite Sinus, der wird wegen der 1. for-Schleifen durchgang und der if-Bedingung k-~=0 kaputt gemacht.

Aber ich weiß nicht wie ich des losen soll...

ARrrrrghhhhh!!!

2.jpg
 Beschreibung:

Download
 Dateiname:  2.jpg
 Dateigröße:  43.58 KB
 Heruntergeladen:  532 mal
1.jpg
 Beschreibung:

Download
 Dateiname:  1.jpg
 Dateigröße:  43.46 KB
 Heruntergeladen:  465 mal
 
Hmpfxxx

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.08.2011, 11:28     Titel:
  Antworten mit Zitat      
Um das Thema abzuschließen...

Habe soweit meine Codes funktionstüchtig gemacht.
Teilweise danke an die Unterstützung.

Für Leute die das gleiche Problem haben, empfehle ich lieber mit PLL rumzuhantieren.

Bzw. der Befehl interp1, kann hier auch gut helfen.

Gruß und Ende!!
 
Neues Thema eröffnen Neue Antwort erstellen



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.