ich habe in diesem Forum viele nützliche Informationen erhalten und gesammelt. Jedoch bin ich jetzt mit meinem Rat am Ende und habe mich dazu entschlossen mich hier nun anzumelden und meine Fehlermeldung zu erläutern.
Ich habe einen piezoelektrischen Beschleunigungssensor der alle drei Messachsen (x-y- und z-Achse) misst. Zusätzlich verwende ich noch ein Mikrofon.
Mein MATLAB-Code mit den Parametern sieht wie folgt aus:
Danach möchte ich gerne eine FFT-Analyse machen. Da es sich hierbei um eine 10 sekündige Messung handelt, habe ich eine Signallänge von insgesamt 500.000 Werten. Daher muss ich die Fensterfunktion in eine Schleife packen, damit mein Rechner nicht überlastet wird. Da es sich um drei Achsen handelt, muss dies ebenfalls drei mal gemacht werden. Ich hab es so realisiert:
Code:
%% Fensterfunktion % ---------------- % Anzahl der Segmente bestimmen
k_x = round(n/nfft);% k Segmente der Länge nfft transformieren
H_x = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_x = zeros(nfft,k_x);
m = 1;
win = hann(nfft);
for i=1:k_x
% Fensterung mit Hann
x_win = xa(m:nfft+m-1).*win;
H_x = fft(x_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0_x(1:(nfft/2)+1,i) = abs(H_x(1:(nfft/2)+1));
% nächstes Segment
m = m + nfft;
end
k_y = round(n/nfft);% k Segmente der Länge nfft transformieren
H_y = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_y = zeros(nfft,k_y);
m = 1;
win_y = hann(nfft);
for i_y=1:k_y
% Fensterung mit Hann
y_win = ya(m:nfft+m-1).*win_y;% Multiplikation von Signal und Fenster
H_y = fft(y_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0_y(1:(nfft/2)+1,i_y) = abs(H_y(1:(nfft/2)+1));
% nächstes Segment
m = m + nfft;
end
k_z = round(n/nfft);% k Segmente der Länge nfft transformieren
H_z = zeros(nfft,1);% Zeropadding, fehlende Daten werden mit Nullen aufgefüllt
Hpos0_z = zeros(nfft,k_z);
m = 1;
win_z = hann(nfft);
for i_z=1:k_z
% Fensterung mit Hann
z_win = za(m:nfft+m-1).*win_z;% Multiplikation von Signal und Fenster
H_z = fft(z_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0_z(1:(nfft/2)+1,i_z) = abs(H_z(1:(nfft/2)+1));
% nächstes Segment
m = m + nfft;
end
Anschließend wollte ich die Signale (Spektrum) plotten
Code:
%% Bildbereich/Frequenzbereich/FFT % --------------------------------
X = fft(x_win, nfft);% FFT mit Fensterfunktion
Xabs = abs(X);% Absolutzahlen
Xfin = fftshift(Xabs/nfft);% Verschiebung der Null-Frequenz-Komponente % zur Mitte des Spektrums
Y = fft(y_win, nfft);% FFT mit Fensterfunktion
Yabs = abs(Y);% Absolutzahlen
Yfin = fftshift(Yabs/nfft);% Verschiebung der Null-Frequenz-Komponente % zur Mitte des Spektrums
Z = fft(z_win, nfft);% FFT mit Fensterfunktion
Zabs = abs(Z);% Absolutzahlen
Zfin = fftshift(Zabs/nfft);% Verschiebung der Null-Frequenz-Komponente % zur Mitte des Spektrums
% Graphische Darstellungen % ------------------------ % Ausgabe in m/s^2 % ---------------- subplot(3,1,2);% Bild mit drei Einzelbildern (mittleres Bild) plot(x_fs-fn, Xfin, 'b');%
hold on;% in gleiches Bild plotten plot(x_fs-fn, Yfin, 'r');%
plot(x_fs-fn, Zfin, 'g');%
axis([0 fn 0(maxpeak+0.01)]);% Skalierung der x- und y-Achse title(['Frequenzbereich (Auflösung: ',num2str(df),' Hz)']);% Titel xlabel('Frequenz in Hz');% Beschriftung x-Achse ylabel('Amplitude in m/s^2');% Beschriftung y-Achse legend('x-Achse','y-Achse','z-Achse');% Legende grid on;% Gitternetzlinie hold off;% nicht mehr in gleiches Bild plotten
% Ausgabe in dB % ------------- subplot(3,1,3);% Bild mit drei Einzelbildern (unteres Bild) plot(x_fs-fn, mag2db(Xfin + eps),'b');% mag2db = 20*log10(x), eps = kleine Konstante zur Vermeidung von log10(0) hold on;% in gleiches Bild plotten plot(x_fs-fn, mag2db(Yfin + eps),'r');% mag2db = 20*log10(y), eps = kleine Konstante zur Vermeidung von log10(0) plot(x_fs-fn, mag2db(Zfin + eps),'g');% mag2db = 20*log10(z), eps = kleine Konstante zur Vermeidung von log10(0) axis([0 fn -10020*log10(maxpeak/2)+3]);% Skalierung der x- und y-Achse title(['Frequenzbereich (Auflösung: ',num2str(df),' Hz)']);% Titel xlabel('Frequenz in Hz');% Beschriftung x-Achse ylabel('Amplitude in dB');% Beschriftung y-Achse legend('x-Achse','y-Achse','z-Achse');% Legende grid on;% Gitternetzlinie hold off;% nicht mehr in gleiches Bild plotten
wählen, damit es nicht zu viele Iterationen werden, falls die Division nicht aufgeht.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
heute habe ich den ganzen Tag versucht, die Daten richtig zu plotten. Bin jedoch auf keinen grünen Zweig gekommen. Mein Problem ist nämlich, dass so wie ich es bisher im Code verwendet habe, nur einmal 16384x1 geplottet (stem) wird und nicht 30mal (16384x30).
Kann mir hier jemand eine Hilfestellung geben, denn ich weiß nicht, wie ich die Schleife in den plot einbeziehen kann.
der Code ist leider recht unübersichtlich, insbesondere weiß man nicht, wie die Codeschnipsel zusammenhängen. Vor allem aber nutzt du stem doch nirgends? So ist mir leider nicht klar, wie man dir helfen kann.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
da hast du natürlich recht. Ich hab noch den alten plot Befehl hier im Forum gehabt. Inzwischen habe ich den Befehl stem verwendet, da er sich für die graphische Darstellung des Spektrums besser eignet.
Ich habe jetzt exemplarisch mal jeweils eine Messdatei sowie mein Matlab-Programm angehängt.
Ich nehme mit einem Schalldruckpegelmessgerät 10 Sekunden auf und bekomme mit der dazugehörigen Software eine Spektrum. Über die 10 Sekunden Messzeit wird ein Gesamtsummenpegel (LZeq) in dB gemittelt. Mit dem Gesamtsummenpegel soll ermittelt werden, ob eine störende Frequenz bei bestimmten Betriebszuständen eines bspw. Lüfters mit einem defekten (manipulierten) Lüfters entstehen.
Fast Gleichzeitig läuft die Messung über einen Triaxialen Beschleunigungssensor sowie einem externen Mikrofon (Mikrofon soll zur Kontrolle der Messdaten dienen) statt. Diese Messdaten werden mit einem Oszilloskop aufgenommen und später in .mat Dateien umgewandelt. Diese Messungen laufen ebenfalls für 10 Sekunden. Hierbei hab ich eine Abtastfrequenz von 50 kHz eingestellt, damit ich im interessierendem Hörbereich (20 Hz bis 20 kHz) agieren kann.
Mir wurde Empfohlen eine FFT mit einem Hann Fenster zu machen mit einer Auflösung von ca. 3 Hz. Somit habe ich ein nfft von 2^14 (16384), da sonst eine dft durchgeführt werden würde. Hiermit erhalte ich eine Auflösung von 3,05... Hz und sollte ausreichend sein.
Für die 10 Sekunden Messzeit habe ich eine gesamte Samplezahl von 500000. 500000/16384 = 30,51... also ca. 30 Durchläufe. Ich möchte gerne diese 30 Durchläufe mitteln und graphisch plotten, damit ich dieses Spektrum mit dem Spektrum des Schalldruckpegelmessgerätes vergleichen kann. Die 10 Sekunden Messzeit und die Mittelung der Daten ist denke ich vorteilhaft, damit alle aufkommenden Geräusche aufgenommen werden können bei einem bestimmten Betriebszustand des Lüfters.
Harald, ich habe gesehen, dass du dich sehr gut mit diesem Thema auskennst. Was sagst du denn allgemein dazu? Sollte ich die 30 Durchläufe mitteln und dann plotten oder ist es ausreichend eben nur einen Durchgang zu plotten?
Messdaten Triaxial-Sensor und Mikrofon des standard Lüfters. Es sind jedoch weitere 9.mat Dateien vorhanden, deswegen werden alle 10 Daten im Matlab Programm eingelesen.
Messdaten Triaxial-Sensor und Mikrofon des defekten (manipulierten) Lüfters. Es sind jedoch weitere 9.mat Dateien vorhanden, deswegen werden alle 10 Daten im Matlab Programm eingelesen.
bitte helfe mir, dir zu helfen. ;)
Das sind jetzt gute 500 Zeilen Code, die ich nicht ausführen kann, weil mir ein Großteil der Dateien fehlt. Mal ganz davon abgesehen, dass du Pfade hart kodiert hast.
Zitat:
Harald, ich habe gesehen, dass du dich sehr gut mit diesem Thema auskennst.
Mit Signalverarbeitung kenne ich mich eher wenig aus. Da sich im Forum nur wenige "Fragenbeantworter" aufhalten, versuche ich da auch nach Möglichkeit zu helfen.
Zitat:
Sollte ich die 30 Durchläufe mitteln und dann plotten oder ist es ausreichend eben nur einen Durchgang zu plotten?
Das musst letztlich du aus der Anwendung heraus entscheiden.
Für mich ist beides begrenzt aussagekräftig. Was ich mir z.B. vorstellen kann ist neben dem Mittelwert auch Minimum und Maximum oder Quantile zu plotten, um eine Vorstellung von der Streuung der Messungen zu bekommen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
ich kenne mich mit Matlab nicht so gut aus und wusste nicht besser, wie ich den ganzen Code hätte etwas luftiger gestallten können, damit er nicht so hart kodiert ist. Hätte gerne die Daten in einer Art Schleife eingelesen aber das hab ich nicht hin bekommen. Ist für jetzt auch egal
Zitat:
Das sind jetzt gute 500 Zeilen Code, die ich nicht ausführen kann, weil mir ein Großteil der Dateien fehlt. Mal ganz davon abgesehen, dass du Pfade hart kodiert hast.
-> Ja ich wollte nicht alle 20 Messdaten hochladen, aber wenn es dich interessiert, kann ich das gerne noch machen. Ich weiß halt nur nicht, wie viel MB ich hier hochladen kann, möchte das Forum nicht zumüllen.
Vielen Dank Harald, mit dem Hinweis der Quantile . Dem werde ich mal nachgehen. Ich hab nochmals bezüglich der FFT recherchiert und eine interessante und verständliche (zumindest in meinen Augen) Homepage gefunden.
So wie ich das hieraus verstanden habe, reicht meine Abtastfrequenz von 50 kHz aus, da ich nach dem Abtasttheorem (Nyquist-Frequenz 25 kHz) mit dieser Abtastfrequenz eine vernünftige Anzahl (>2) habe, um das Signal verlustfrei zu rekonstruieren.
Ich mach mich jetzt an das Werk und versuch mich an bspw. der Mittelwertbildung usw. von den Signalen.
Hätte gerne die Daten in einer Art Schleife eingelesen aber das hab ich nicht hin bekommen.
Das wäre jetzt eine Frage, bei der man ggf. recht gut unterstützen kann.
Zitat:
Ja ich wollte nicht alle 20 Messdaten hochladen, aber wenn es dich interessiert, kann ich das gerne noch machen. Ich weiß halt nur nicht, wie viel MB ich hier hochladen kann, möchte das Forum nicht zumüllen.
Ich würde eher den umgekehrten Weg gehen: den Code vorübergehend so anpassen, dass er mit einer Datei funktioniert.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
das mit der Dateneinleserei hat wahrscheinlich nicht funktioniert, da ich die Messdaten nicht in dem Ordner gespeichert habe, indem auch der Matlab-Code gespeichert wird.
-> bin aber für jede Hilfe diesbezüglich dankbar, denn es ist sehr mühsam die ganzen Pfade manuell zu kopieren und einzufügen. Eine Verschiebung der Messdaten oder ähnliches ist machbar.
Ich hab jetzt mal noch eine Testversion hochgeladen, die mit den zwei hochgeladenen Messdaten funktionieren sollte.
Wie im Workspace zu erkennen gibt es 3 Segmente für die FFT (16384x3 bzw. 8192x3). Der plot (stem) der Frequenzspektrums ist lediglich bei 16384x1, daher wird das Spektrum nur einmal anstatt dreimal geplottet.
Jedoch versuche ich mich gerade daran, in dieser verkürzten Version, den Mittelwert der drei Spektren zu bekommen und diesen dann zu plotten. Denn ich habe mich dazu entschieden, den Mittelwert zu verwenden, da mit großer Sicherheit bei jedem einzelnen der drei Spektren etwas anderes raus kommt.
Hast du Harald mir hierfür eine kleine Hilfestellung? Ich weis nämlich nicht, wie ich auf die anderen beiden Spektren kommen kann um überhaupt mit einer Mittelwertsberechnung anzufangen und zu plotten.
Vielen Dank
Gruß
raupid
Gomatlab_Testversion.m
Beschreibung:
Testversion, die mit einer bzw. den beiden Messdaten funktioniert
das mit der Dateneinleserei hat wahrscheinlich nicht funktioniert, da ich die Messdaten nicht in dem Ordner gespeichert habe, indem auch der Matlab-Code gespeichert wird.
Das sollte kein Problem sein. Bei dir kannst du ein Verzeichnis mit angeben.
Zitat:
Ich hab jetzt mal noch eine Testversion hochgeladen, die mit den zwei hochgeladenen Messdaten funktionieren sollte.
Jep, läuft.
Zitat:
Wie im Workspace zu erkennen gibt es 3 Segmente für die FFT (16384x3 bzw. 8192x3).
Du erzeugst viele Variablen mit diesen Dimensionen. Um welche geht es denn?
Zitat:
Jedoch versuche ich mich gerade daran, in dieser verkürzten Version, den Mittelwert der drei Spektren zu bekommen und diesen dann zu plotten.
Du willst also den zeilenweisen Mittelwert einer Matrix mit 3 Spalten? Das wäre
Generell: je kleiner und kompakter das Beispiel, desto leichter ist es, die Frage zu verstehen. Wenn wie bei dir über 100 Variablen und 6 Plots erzeugt werden, muss man ja erst mal herausfinden, worum es überhaupt geht.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Im Anschluss die FFT durchführen und bei Bedarf noch mitteln, so wie es bei mir notwendig war:
Code:
%% Beschleunigungssensor - Darstellung im Bildbereich % --------------------------------------------------- % x-Achse - standard Lüfter % -------------------------
X = fft(xb_win, nfft);% FFT mit Fensterfunktion Signal xa
Xabs = abs(X);% Absolutzahlen von xa
Xfin = fftshift(Xabs/nfft);% Verschiebung der Null-Frequenz-Komponente zur Mitte des Spektrums
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.