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

projekt chrisl - frequenzanalyse, etc. von scannerpunktwolke

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.07.2012, 16:53     Titel:
  Antworten mit Zitat      
Code:

h1 = subplot(2,1,1)
...
h2 = subplot(2,1,2)
...
axis([h1, h2],[0 10 -1 1])

% oder nur h1 oder h2 verwenden um nur bei einem subplot die achsen zu limitieren
axis([h1],[0 10 -1 1])

 



Code:

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


Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 11:20     Titel:
  Antworten mit Zitat      
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
 


nur das mit dem sublot funktioniert leider noch nicht richtig - wenn ich die axen eingestellt habe, ist leider plötzlich das signal weg^^
Code:

fig=figure(4)
h1 = subplot(2,1,1);
 plot(fv,mag);
axis([h1],[0 10 -2 2])
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in [Hz]']);
ylabel('Amplitude')
title('Betragsspektrum');
grid on;
 

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..

test.fig
 Beschreibung:

Download
 Dateiname:  test.fig
 Dateigröße:  83.93 KB
 Heruntergeladen:  541 mal
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: 13.07.2012, 11:52     Titel:
  Antworten mit Zitat      
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 Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 12:13     Titel:
  Antworten mit Zitat      
klar steckt der in meinem code wo sonst Very Happy 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 Very Happy

Code:

clc
clear all
close all
clearvars

I = importdata('1_2500.txt', '\t');
I(:,3) = [];                            % Höhe löschen, da sie hier nicht gebraucht wird

B = sortrows(I,[1 2])                   % 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

y_zerop = [Mi(:,2)' zeros(1,poti - length(Mi()))];      %Nullen angehängt manuell
[mag, mag_dB, fv] = FFT_betragsspektrum( y_zerop, poti, fa ) ;

fig=(figure(fig+1));
plot(fv,mag)
title('Single-Sided Amplitude Spectrum of y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

% Fensterfunktion

win = hann(poti)';                      % Hann-Fensterung
fig = figure(3);
plot(win)
axis([0 poti 0 1.1])
title('Hann-Fensterung')
ylabel('Amplitudenskalierung')
xlabel('N Stützstellen')
grid



% Betragsspektrum des Testsignals ohne Fensterung

fig=figure(4)
h1 = subplot(2,1,1);
plot(fv,mag);
 
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in [Hz]']);
ylabel('Amplitude')
title('Betragsspektrum - ohne Fensterung');
grid on;


% Signal mit Hann Fenster
win = hann(poti)';
y_win = Mi(:,2)*win*poti/sum(win); % Fensterung mit Amplitudenkorrektur

[mag, mag_dB, fv] = FFT_betragsspektrum( y_win, poti, fa ) ;
subplot(2,1,2)
plot(fv,mag);
xlabel(['Auflösung: ',num2str(df),' Hz Frequenz in [Hz]']);
ylabel('Amplitude')
title('Betragsspektrum - mit Hann-Fensterung');
grid on;
 


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
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: 13.07.2012, 12:19     Titel:
  Antworten mit Zitat      
Das Signal Mi hat doch aber nicht die Länge poti...dann kann es auch nicht stimmen.

Code:

% Signal mit Hann Fenster
win = hann(length(Mi(:,2)))';
y_win = Mi(:,2)*win*length(win)/sum(win); % Fensterung mit Amplitudenkorrektur

[mag, mag_dB, fv] = FFT_betragsspektrum( y_win, poti, fa ) ;
% hier wird jetz wieder Zeropadding durchgeführt, falls length(y_win) < poti ist
 


Edit: Ist dir eigentlich auch klar, dass sich durch die Interpolation deine Abtastfreq. ändert?

Zuletzt bearbeitet von DSP am 13.07.2012, 12:24, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 12:24     Titel:
  Antworten mit Zitat      
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 Sad

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, 12:29, insgesamt einmal bearbeitet
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: 13.07.2012, 12:29     Titel:
  Antworten mit Zitat      
Hier fehlt schlicht weg ein Punkt bei der Multiplikation von Signal und win

Code:

y_win = Mi(:,2) .* win *poti/sum(win); % Fensterung mit Amplitudenkorrektur
 


Es muss elementweise mul. werden!
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 12:32     Titel:
  Antworten mit Zitat      
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^^
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: 13.07.2012, 12:36     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 12:48     Titel:
  Antworten mit Zitat      
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 Very Happy mit dem punkt hat ihm die dimension nicht gepasst und das lag einem simplen transponieren zuvor, was ich übersehen hatte Smile 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..
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: 13.07.2012, 13:03     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 13:15     Titel:
  Antworten mit Zitat      
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..
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: 13.07.2012, 13:19     Titel:
  Antworten mit Zitat      
Wenn deine Abtastfreq. nur 50 Hz ist, darf die maximale Freq. in deinem Signal höchsten 25 Hz sein. Besser wäre allerdings ein Faktor 5 statt 2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2012, 13:26     Titel:
  Antworten mit Zitat      
achso ja das meintest du Smile 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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Chrislap
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2012, 10:53     Titel:
  Antworten mit Zitat      
tachchen liebe matlabgemeinde.

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 Smile
da muss ich doch nicht irgendwie ne schleife machen extra!?
danke schonmal vllt ist die antwort wieder gar nicht so kompliziert^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  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 - 2024 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.