Ich habe aus meinen ganzen Daten nun endlich eine FFT (Absolutwerte, logarithmisch) drüberlaufen lassen (siehe angehängte Dateien). In dieser Darstellung lässt sich auch der erhoffte Peak bei 4 Hz. erkennen, was auch die Erwartung war. Also der Erreger hat mit 4 Hz. erregt und im Boden ist das so auch angekommen.
Nun dachte ich mir es macht Evtl Sinn das Signal vor der FFT zu fenstern. Kann mir da jemand helfen was die Fensterung angeht? Ehrlich gesagt kenne ich mich damit gar nicht aus... :-/
Ich weiß, dass dadurch die Werte am Anfang und Ende auf Null gesetzt werden und dazwischen steigt die Funktion an und fällt wieder ab. Aber wie gehe ich da vor? Was muss ich ändern? Ist es hilfreich ein Hann-Fenster zu nutzen?!
ich habe dir doch in diesem Thread bereits eine Funktion zur Erstellung des Amplitudenspektrums als m-file gepostet. Diese Funktion kann auch eine Fensterung mit Hanning durchführen, so fern man den 3. Inputparameter auf 1 setzt. Also...
Hab jetzt trotzdem nochmal ein Problem.Und zwar habe ich mir das automatisiert, also so dass ich für meine verschiedenen Sensoren (16) und die verschiedenen Erregerstufen (2 meine FFT durchläuft. Und er mir dann die Bilder abspeichert.
Jetzt würde ich jedoch gerne immer 3 miteinander vergleichen. Kann ich darunter einen subplot reinbauen? Ich kriege das nicht wirklich hin.. :-/ Kann mir evtl jmd helfen? Tipp geben oder nen Link?!
lenplist=length(plist);
for np=1:lenplist;% Bearbeitungsschleife über mehrere Unterordner??
pfad=plist{np};
cd(pfad);
list=dir(strcat(pfad, '\','*.mat'));% schreibt alle uff Dateien in eine Liste
fname={list.name};
N=length(list);% Anzahl von Dateinamen
for NR=1:N;% Bearbeitungsschleife über alle Dateien
A=fname{NR};
dat=strrep(A,'.mat', '');
load(A);
str = ['xx = ',dat,';'];
evalin('base',str);
% newfolder=['Auswertung ' num2str(dat)]; % f1=fullfile(pfad,newfolder); % if (exist(f1) == 0) % mkdir (f1); % end % Zeit ermitteln
% ------------------------------------------------------------------------- % FFT berechnen Einzelsignal
%1.Spalte gekürzt
%NFFT = 2^nextpow2(LL); % Next power of 2 from length of y
%Y = fft(xx,NFFT)/LL;
%fff = fs/2*linspace(0,1,NFFT/2+1);
%ampl = 2*abs(Y(1:NFFT/2+1));
%y=xx;
%FS=1000;
%L=length(y);
%fft_tmp=fft(y); %fft-Ergebnis ist ein Array aus komplexen Zahlen, wobei der Realteil die Amplitude und der Imaginärteil die Phase darstellt
%fft_ampl=2*abs(fft_tmp(1:L/2+1))/L; %Phase interessiert nicht und komplexe Zahlen lassen sich schwer darstellen, deswegen wird der Absolutwert(Realteil) bestimmt und dann noch normiert
%fff=linspace(0,FS/2,L/2+1);
%semilogx(fff,fft_ampl);
Und ja das wollte ich. Aaaaaber mir wurde vor einiger Zeit gesagt, dass es wichtig ist die kleinen Sequenzen zunächst auszuschneiden und dort den Peak, der erwartet wird rauszusuchen mittels einer FFT.
Es wurde ja mit kleinen Frequenzen angeregt. Also es wurde in 28 Schritten von 1 Hz auf 4 Hz erregt. Und die erwarten und hoffen, dass sich diese Peaks auch im Boden wiederfinden und vielleicht sogar ein gewisses Muster (linear/nichtlinear) wiederfindet. Deswegen bin ich derzeit dabei alle Zeitsequenzen rauszuschneiden und jeweils eine FFT darüber laufen zu lassen. Und jetzt würde ich einfach gerne einige miteinander vergleichen und sehen ob da so schon mal etwas zu erkennen ist....
Wäre es dann aber nicht sinnvoller die Spektren in einen plot zu legen und jeder Messung eine andere Farbe zu geben? So in etwa...
Code:
clear
Fs = 1000; % Abtastfrequenz in Hz
T = 1/Fs; % Sampling period
L = 1000; % Length of signal
t = (0:L-1)*T; % Time vector
signal_1 = 1*sin(2*pi*4*t);
signal_2 = 2*sin(2*pi*5*t);
signal_3 = 3*sin(2*pi*6*t);
Das erste Skript hat auch schon geklappt gerade.... Leider sind halt manche Sensoren hin und zeigen nicht das Erwünschte. Aber jedenfalls danke für deine Tipps
Ehrlich gesagt, nein. Bei mir funktioniert der Code. Steht bei dir in der ersten Zeile auch das
clear
, so dass das Workspace vor dem Ausführen gelöscht wird? Auf welche Codezeile bezieht sich denn die Fehlermeldung? So etwas bitte immer möglichst genau angeben
Evtl. legst du deinen Daten nicht als Zeilenvektor wie hier an
Aber ich muss doch in meinem Workspace zumindest die Signale haben oder nicht? Also die drei sensoren mit den jeweiligen Messwerten.
Deswegen habe ich das clear rausgenommen. Sonst habe ich nichts verändert....
Also entweder du testest den Code wie oben mit dem Testsignal oder du musst eben deine Signale entsprechend umwandeln. Der Fehler kommt bestimmt daher, dass y ein Spalten und kein Zahlenvektor ist, wie in meinem Bsp.
Und bitte gib in Zunkunft deine genaue Fehlermeldung an und was du an gegebenen Codebsp. selbst geändert hast. So hätte ich mir schon einige Fragen sparen können
Es tut mir leid für die Umstände :-/ War nicht meine Absicht... Bin halt echt etwas unwissend und noch nicht so lange mit Matlab und dem Forum beschäftigt. Ich merke mir das
Also bis jetzt hat alles soweit ganz gut geklappt. Zumindest für eine Zeitsequenz von mir Soeben wollte ich eine andere Sequenz beginnen und mit der Spektren-Funktion von dir meine Plots erstellen.
Kam die folgende Fehlermeldung in Bezug auf das Funktionsskript was ich auf folgend reinstelle:
Error using .*
Matrix dimensions must agree.
Error in FFT_betragsspektrum (line 32)
sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur
Code:
function[mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa, window, scale) % Input: % Signal im Zeitbereich % nfft = Anzahl Messwerte für fft % wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch % fa = Abtastfreq. % window: 1 = Fensterung mit Hanning window % scale: 0 = keine Impulsantwort als Eingang, 1 = Impulsantwort % Output: % Magnitude des Spektrums linear und dB skaliert % Frequenzvektor fv in [Hz] von 0...fa/2
% un-,gerade Anzahl Messwerte? ifmod(nfft,2) == 0;
k = (nfft/2) + 1;
else
nfft = nfft + 1;
k = (nfft/2) + 1;
end
Ohne die Daten ist das schwer nachvollziehbar. Welche Dimensionen haben die Arrays mit den Messwerten?
Arbeite am besten mit dem Debugger. Setze einen Breakpoint genau in die Zeile, wo der Fehler ist und schaue dir dann beim angehaltenen Programm die Dimensionen von sig und win im workspace an. Es müssten jeweils Spalten- oder zwei Zeilenvektoren gleicher Länge sein, damit die elementweise Multiplikation sig .* win ausgeführt wird. Vermutlich liegt da der Fehler.
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.