Verfasst am: 29.07.2011, 15:55
Titel: Nachbildung von Messdaten
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 )
% 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
% 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))
% 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
iflength(x)<=100% Erzwingung der Dimensionsbedigung von Matrizen
x(101)=[x2];
f(101)=[0];
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?
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
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 und die Anmerkung. Werde ich mal ändern und schauen was passiert
Wenn es nicht verstanden wird. Bitte fragen, ich versuchs so gut wie möglich zu erklären...
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
Hmpfxxx
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.08.2011, 10:23
Titel:
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?
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.
Hmpfxxx
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.08.2011, 11:04
Titel:
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
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 . 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.
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.
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!
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.
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!!
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.