t = 0....t_end; % Zeitvektor
indx = find( t >= 5, 1, 'first'); % finde in t den ersten Wert >= 5
data_neu = data(indx:end); % ersten Werte bis t = 5 weglassen % Vorrausetzung t und data haben gleiche Dimension
moin,
joa also das mit dem abschneiden funktioniert nach ner kleinen änderungen super
Code:
ab= 872; %ab welchem wert solls losgehen?
index = find( B(:,1) >= ab, 1, 'first'); % finde in B den ersten Wert >= "ab"
B_neu = B(index:end,:); % ersten Werte bis "ab" weglassen
aber ich muss grad eh mal gucken - die skalierung der fensterung stimmt doch schon wieder nicht, selbst wenn ich den code von DSp nehme^^ (hab mal den plot angehängt)
das blöde ist, dass ich ständig gehindert werde, weiterzufummeln, weil ständig das hier kommt
Error using *
Out of memory. Type HELP MEMORY for your options.
Error in programm (line 100)
y_win = Mi(:,2)*win*poti/sum(win); % Fensterung mit Amplitudenkorrektur
kann doch eigentlich nicht sein, dass schon der speicher überläuft *überleg* - neustart matlab und es geht wieder "clearvars" hilft nicht..
k.A., bei mir funktioniert die unterschiedliche Achsenskalierung jedenfalls wie angegeben.
Was mit deiner Skalierung mit der Fensterfkt. nicht stimmen soll, kann ich so nicht nachvollziehen. Entweder postest du einen lauffähigen Code samt Daten, oder hängst mal ein Bild an. Bei dem Testsignal in meinem Bsp. ist jedenfalls alles korrekt. Also muss der Fehler ja irgendwo in deinem Code stecken
klar steckt der in meinem code wo sonst aber das sind ja nur paar zeilen bei der fensterfunktion und für die fft und so habe ich da jetzt deine version der "function genommen" - das ändert aber nix. den code kann ich gerne nochmal reinpacken. die daten sind ja etwas weiter oben zum laden - an denen hat sich ja nix geändert - einen plot von der falschen skalierung habe ich eins höher schon drangehangen.
dein beispielcode funktioniert ja auch. ich weiß auch nicht wie sich da beim übertragen die skalierung ändern kann^^ vorallem sieht es so aus, als müsste ich noch mit 5mio multiplizieren um die gleiche skalierung zu erlangen
I = importdata('1_2500.txt', '\t');
I(:,3) = []; % Höhe löschen, da sie hier nicht gebraucht wird
B = sortrows(I,[12])% Sortieren der Messergebnisse
B(:,1) = round(B(:,1)*10); % profilnummer umdimensionieren disp(num2str(B,'%7.4f')); % runden für weniger rechenaufwand
fa= 50; % Messfrequenz (Eingabewert)
ab= 872; %ab welchem wert solls losgehen?
index = find( B(:,1) >= ab, 1, 'first'); % finde in B den ersten Wert >= "ab"
B_neu = B(index:end,:); % ersten Werte bis "ab" weglassen
X = B_neu(:,1); % Matrix zerlegen in X und Y
Y = B_neu(:,2);
xu = unique(X); % schreibe Werte in xu, die kein 2. Mal auftauchen [~, stelle] = ismember(X, xu); % speichere die Stellen, die in X und xu vorkommen
yu = accumarray(stelle, Y, [], @mean); % bilde einen neuen Y-Wert (yu) für jeden X-Wert und mittel (mean) diesen für die Stellen (stelle), wo es mehrere Y-Werte gibt
for i= 1 : max(xu)% Schleife X-Achse für Interpolation, von 1 bis zum maximal auftretenden Wert
Xi = (ab:max(xu)); % zähle durch von 1 bis zum letzten Wert
Yi = interp1(xu,yu,Xi,'linear') ; % lineare Interpolation an den Stellen ohne Y-Wert end
Mi = [Xi; Yi]'; % die neue vollständige Matrix
Mi(:,2) = Mi(:,2) - mean(Mi(:,2)); % um den Mittelwert - nur so funzt fft
Mi(:,1) = Mi(:,1)/fa; % /50 um in Sek zu wandeln
Mittelwert_Messwerte = mean(round(Mi(:,2))) %Kontrolle
L = numel(Mi(:,1)); % Anzahl Werte zur Kontrolle ob Interpolation und Löschen geklappt hat
AnzahlMessungen_als_Kontrolle = L
poti = 2^nextpow2(L); % nächste 2er Potenz / gewünschte FFT-Länge
df = fa/poti; % Frequenzauflösung
L = numel(Mi(:,2))% Anzahl Werte zur Kontrolle ob Interpolation und Löschen geklappt hat
das müsste ja irgendwie an input bei der fensterung liegen -> zB an Mi(:,2) --> Yi kann ich irgendwie nicht nehmen - da meckert er. eigentartige geschichte - du hast es doch auch nicht anders gemacht
achso ja ne - da hatte ich eigentlich auch "L" drin - das poti ist noch ein überbleibsel vom rumprobieren- dachte ist eh nicht so wichtig ob er die nullen da mit fenstert. macht auch keinen großen unterschied - jedenfalls nicht 5 kommastellen
edit: ich weiß jetzt nicht ob ich dich da richtig verstehe, aber fa bezieht sich nicht auf die anzahl der werte und sozusagen eine feste größe, die die fehlende werte schon beinhaltet. daher muss ich ja unbedingt interpolieren, damit sich der frequenzraum nicht verschiebt..
Zuletzt bearbeitet von Chrislap am 13.07.2012, 11:29, insgesamt einmal bearbeitet
mit dem punkt funktioniert leider gar nix mehr - ich denke mal er multipliziert auch so elementweise, sonst würden die frequenzen ja nicht stimmen und nicht nur die skalieren (denke ich mal)..
ich wollte es ja mit Yi. versuchen aber da gabs probs..
edit: weiß jetzt nicht ob de mein edit von eben gelesen hattest^^
Was heißt...geht gar nichts mehr? Bitte poste doch genaue Fehlermeldungen, das erspart uns Zeit. Und nein...er multipliziert ohne den Punkt nicht elementweise. So langsam verliere ich echt die Lust...anscheinend weißt du es ja besser.
Mit deinem Satz bzgl. der Abtastfreq. kann ich nichts anfangen. Du musst die GENAUE Abtastfreq. schon wissen...sonst macht deine Analyse gar keinen Sinn!
achso ich dachte du hast das bei dir reinkopiert, weil du einen lauffähigen code wolltest und siehst es daher. mensch ja ich dachte nur er macht das so auch elementweise - das ergebnis sah so aus..
aber egal - ich habs rausgefunden mit dem punkt hat ihm die dimension nicht gepasst und das lag einem simplen transponieren zuvor, was ich übersehen hatte danke^^
ja ich bin schon echt schwierig - ich hoffe das wars erstmal.
und ja ich weiß die genaue Messfrequenz (fa) - die ist 50 Hz und die war nur ohne interpolieren leicht falsch - jetzt habe ich zeitdiskrete werte und es müsste stimmen. zumindest wenn ich richtig verstanden habe, was du meintest..
Nein, ich habe dein Programm nicht selbst getestet. Aber ich hatte so eine Ahnung wg. den Dimensionen...es müssen signal und win beides Spalten- ODER Zeilenvektoren sein.
Du hast doch einen Zeitvektor. Wenn t(1) = 0 dann ist t(2) deine Abtastrate Ta
fa = 1/Ta. Ist sie denn auch in jedem Abtastschritt gleich groß? Dennoch heißt das ja dan auch noch nicht, ob damit das Abtasttheorem eingehalten wird.
ja durchgängig 50 Hertz.. damit eine zeitdiskrete abtastung alle 0,02 sekunden - das sagt jedenfalls der hersteller. darauf muss ich mich leider verlassen, weil ich keinen vernünftigen zeitstempel habe mit anfangs- und endzeit.. es gibt nur profilnummern, die ich in zeiten umrechnen kann. da habe ich natürlich auch kein sonderlivch sicheres gefühl. ich sollte noch einmal eine testmessung machen. allerdings schaltet sich das gerät angeblich ab, sobald es die messfrequenz selber nicht exakt einhalten kann.
ob das abtasttheorem trotzdem noch falsch sein könnte, das weiß ich nicht - da muss ich mich wohl nochmal genauer drüber schlaulesen..
achso ja das meintest du ja das ist klar - die messgenauigkeit ist auch nicht gut genug, um so hohe frequenzen sicher festzustellen. darum geht es im folgenden. ich habe ja noch daten von anderen instrumenten (die leichter auszuwerten und genauer sind) um nun vergleiche zu ziehen bis zu welchen frequenzen ich erkenntnisse gewinnen kann. auf den ersten blick könnte selbst noch mein hauptpeak bei ca. 12 Hertz eine andere ursache haben (zB instrument). das wird sich hoffentlich rausstellen
ich hab da noch mal ne ganz kleine frage. und zwar will ich den ergebnisdatensatz der fft als txt. speichern (2 spalten mit tab oder anzahl bestimmter leerzeichen getrennt.
da hakt es bei mir leider schon, wenn ich die beiden vektoren 'mag' und 'fv' in eine matrix zusammenfügen will. so sieht das bei mir bisher aus aber er schreibt keine 2-spaltenmatrix (T) sondern fügt den 2. vektor einfach hinten dran..
Code:
fv=fv'; % damit die dimension stimmt
T = [fv; mag]; % <-- genau hier stimmt etwas nicht save('E:\profilmessungen\testmatlab\ergebnis.txt', 'T', '-ascii', '-tabs');
das eigenartige ist, dass das ganze zuvor im quelltext ja schonmal so geklappt hat, nachdem der datensatz so in einzelne vektoren aufgespalten wurde zum interpolieren etc., konnte ich ihn mit diesem befehl wieder zusammenfügen
da muss ich doch nicht irgendwie ne schleife machen extra!?
danke schonmal vllt ist die antwort wieder gar nicht so kompliziert^^
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.