Verfasst am: 14.07.2008, 19:22
Titel: specgram, komisches Ergebnis, was mach ich falsch
Ich möchte meine FFT in einem Spektrogramm darstellen. Leider kommt nicht das raus, was ich erwartet hätte (siehe Bild). Nämlich 3 Frequenzbänder (hier bei f1, f2, f3). Was mich auch wundert ist das ich bis 1,1ms einen fetten roten Balken habe.
Kann mir da jemand was zu sagen. Ich grübel schon den ganzen Tag darüber. Ich versteh das alles noch nicht so richtig, was Schwingungsanalysen angeht bzw. was man aus dem Spektrogramm wirklich alles rauslesen kann.
Hier mein m-File:
Code:
clearall; %resetet Workspace, alle Variablen werden auf null gestetzt
clc %löscht alte Fehlermeldungen im commando window
f3=110;
f2=10; % eine Oberschwingungsfrequenz
f1=50; % Grundschwingungsfrequenz des Testfunktion.
T1=3/f1 % Anzahl der Periodendauer, des Testsignals
fa=2*f1*100; % freie Wahl einer Abtastfrequenz unter berücksichtigung des Abtasttherorems;
%N=100 Stützstellen pro Periode
ta=1/fa; %Abtastdauer
N=T1/ta; %Anzahl der Stützstellen pro periode, je größer N, desto besser die Auflösung (weniger leckeffekt)
% FFT
Y=fft(x,N);
Pyy=abs(Y)./(N/2); %.*Betrag von Y bzw. cn Koeffizient,
%durch N/2 weil nur hälfte der Punkte geplottet wird (wegen symetrie) und N weil Periodendauer
%gleich Messdauerperiodendauer der Abtastung ist.
f=fa/N.*(0:(N/2)); %frequenzvektor
subplot(3,1,2) stem(f,Pyy(1:(N/2+1)));
hold on
plot(f,Pyy(1:(N/2+1)));
axis([02000max(Pyy)+1]);
grid on;
hold off
macht es denn Sinn, das Spektrogramm der Fourier-Tansf. (Pyy) darzustellen?
Willst Du vielleicht stattdessen das Spektrogramm des Signals (x)?
_________________
Also nur die erste Hälfte vom Spectrum übernehmen? Das fix kannst du in deinem Fall weglassen aber wenn die Zahl mal ungerade ist gibts sonst Probleme.
Ein anderes Problem sehe ich darin, dass du die specgram funktion über das spectrogram machst. Wie gesagt ich weiß nicht was das für eine funktion ist. Aber wenn es eine STFT ist erwartet sie eigentlich ein zeitdiskretes Signal.(siehe Nschlange) Ich würde dir sogar empfehlen die STFT auch noch selbst zu bauen. Da kann man noch einiges lernen wenn man das so macht.
Danke Oli und NSchlange. Hab die Fehler berichtigt. Trotzdem zeigt mir mein Spektrogramm nicht die richtigen Frequenzen an. Immerhin ist schon mal der rote Balken weg.
Den Code habe ich hier nochmal überarbeitet:
Code:
clearall; %resetet Workspace, alle Variablen werden auf null gestetzt
clc %löscht alte Fehlermeldungen im commando window
%--- Variablen und Konstanten
f2=120; % Oberschwingungsfrequenz der Testfunktion
f1=50; % Grundschwingungsfrequenz der Testfunktion.
T1=3/f1 % Anzahl der Periodendauer, des Testsignals
fa=2*f1*100; % freie Wahl einer Abtastfrequenz unter berücksichtigung des Abtasttherorems;
ta=1/fa; % Abtastdauer
N=T1/ta; % Anzahl der Stützstellen pro periode, je größer N, desto besser die Auflösung (weniger leckeffekt)
%--- Messreihe der Testfunktion
t=0:ta:T1; %Zeitvektor
y=40.*sin(2*pi*f1.*t)+10.*cos(2*pi*f2.*t);
%--- Aufstellen der FFT
X_n=fft(y,N);
% Entspricht: sum(x(k)*exp(-j*2*pi*n*k/N)) % über die Indizes k=0..N-1, für die Ordnung (n) -inf<n<inf; 1/N=ta/T_m
c_n=abs(X_n)./N;
% Matlab löst die FFT nummerisch. Unter der Voraussetzung, das Mess- und % Grundschwingungsperiodendauer übereinstimmen (T_m=T_1, sog. % synchronisierte Messdauer oder kohärente Abtastung), lässt sich die % Koeffizientenberechnung annähern zu c_n=1/N*sum(x(k)*exp(-j*2*pi*n*k/N)) % über die Indizes k=0..N-1, für die Ordnung (n) -inf<n<inf; 1/N=ta/T_m
Y=c_n.*2;
% Die Amplitude(Y) entspricht für Ordnungen(n)=!0 zwei mal den Koeffizienten 2*c_n; % (für A_n=0=c_n)
%--- Plotten der FFT, des Testsignals
%Frequenzvektor, es reicht nur die Hälfte des Ergebnisvektors der FFT darzustellen,
% aufgrund von Symetrie
f=(1/T1).*(0:(N/2));
subplot(3,1,2) stem(f,Y(1:(N/2+1)));
hold on
plot(f,Y(1:(N/2+1)));
axis([02000max(Y)+1]);
grid on;
hold off
Also es ist so: du hast 3 sehr tiefe Frequenzen, die du analysieren möchtest. Dann machst du deine FFT die sieht ganz gut aus. Allerdings siehst du da auch schon das du erst reinzoomen must um alle 3 Frequenzen zu erkennen. Und das mit der höchstmöglichen Frequenzauflösung, nämlich über die gesamte Zeit. Wenn du die größe des Zeitfensters verringerst, verringerst du auch die Frequenzauflösung. Ich gehe mal davon aus das deine specgram funktion zuerst eine Fensterfunktion benutzt zb. Hamming und auch überlappende Fenster. Aufjedenfall ist das Ergebnis (der rote Balken ganz unten) das zu erwartende Ergebnis. Also wenn du das darfst würde ich höhere Frequenzen nehmen. Wenn nicht könntest du es zb. bei der ersten FFT belassen.
ich hab jetzt nicht viel verstanden.
So sicher sitzt das mit den ganzen Fensterfunktionen, Filtern, FFT nicht bei mir. Überlappende Fenster sagen mir garnichts. Hab aber deshalb nochmal in die Hilfe zu specgram geguckt. Also es ist ein Hanning Fenster. Und wenn ich Fensterbreite, länge der FFT (NFFT) und Noverlap angebe im Befehl, dann gehts. Vorallem wenn ich für Fs=fa/2 einsetze.
PS: Kann man irgendwie auch einstellen, das das Spektrogramm erst ab 0ms losgeht? Warum ist die Frequenz bei 50Hz so fett bzw. verschmiert trotz Hanningfenster? Was ist Z bzw. NFFT, Window und Noverlap? Was stelle ich damit ein? Durch ein großes Z wird die darstellung feiner, naja ...
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.