Verfasst am: 10.02.2015, 17:09
Titel: Kurzzeit-FFT , Mittelung der FFT-Segmente, Darstellung in 3D
Hallo zusammen,
werde versuchen mein Problem zu erklären:
Es soll eine Kurzzeit-Spektralanalyse (FFT) eines Zeitsignals durchgeführt und in 3D (surf, campbell, waterfall, spectrogram) grafisch dargestellt werden.
- Ein Zeitsignal wurde 2 sec. lang aufgenommen,
- Die Abtastfrequenz beträgt 48000 Hz, also insgesamt 96000 Samples
- Das Signal wird für die FFT in Blöcke (1024 Samples) aufgeteilt
- Das Signal wird mit dem Befehl floor auf 95744 Samples gekürzt, um eine ganze Zahl an Blöcken zu erhalten(187*1024=95744)(Mit 50% Überlappung) (macht in meinem Fall mehr Sinn das Signal zu kürzen, anstatt mit Nullen aufzufüllen)
- Nun wurde ,mein Signal, das in Form eines Vektors vorlag in eine Matrix 187x1024 umgewandelt
- 187 sich überlappende Blöcke/Segmente (Zeilen ) mit Länge von 1024 Samples (Spalten)
- Die Fensterfunktion hamming(1024) wurde verwendet
- Die Überlappung der Fenster soll 50% betragen , d.h. das FFT-Fenster wird um 512 Folgeelemente weiterverschoben
- Anschließend wird jeder der 187 Blöcke mit dem Befehl fft mit einer Schleife in den Frequenzbereich transformiert.
- Da ich die Amplitude korrekt angezeigt haben möchte, soll ja die Amplitudenachse des Frequenzganges mit 2/NFFT normiert werden. NFFT ist die Anzahl der Datenpunkte, mit denen eine FFT durchgeführt wird, in meinem Fall 1024 (bin mir nicht 100% sicher)
Bei folgenden Punkten , bräuchte ich eure Hilfe:
- Die Beträge der einzelnen Blöcke sollten nach erfolgter Transformation miteinander gemittelt werden (averaging) und anschließend grafisch dargestellt werden.(um ein sauberes Signal zu erhalten) Wie sie genau gemittelt werden, verstehe ich auch noch nicht ganz. Ist der Befehl mean der richtige?
und
Ich würde gerne die ermittelten ( 93) Teilspektren nun hintereinander im sogenannten 3 D - Waterfall-Diagramm grafisch darstellen und in 2 D, wie ein Spectrogram, mit farblichen Balkenspektren, nur Farbskala-Achse nicht in dB ausgegeben werden, sondern als Amplitude.
Bei einem Spectrogram, wie ich gelesen habe, wird das Signal automatisch nur in 8 Segmente aufgeteilt und nicht wie von mir gewollt in 187. (stimmt es )
Wenn ich mit dem Befehl surf ein 3D-Plot erstelle, ist alles leider komplett schwarz, bis auf einige bunte Punkte, die Skalierung scheint auch nicht korrekt zu sein.
Folgende Vektoren und Matrizen erhalte ich nach der Transformation:
Zeitvektor: 186x1 (Y-Achse)(von 0-2 sec)
Frequenzvektor: 1x1024 (X-Achse)(bis zur halben Abtastrate)
Die transformierten FFT-Werte bilden nun eine Matrix: 186X1024
Code:
================================================
%Parameter
===============================================
fs=48000; % Abtastfrequenz
NFFT=1024; % FFT-Blocklänge
N=length(Signal); % Länge des Signals bzw. Anzahl der Samples
OL=0.5; % 50% überlappung der FFT - Fenster
noverlap = floor(0.5*NFFT); % Überlappung
k=floor(N/(NFFT*(1-OL))); % Anzahl der Segmente (Samplepoints pro FFT_Fenster) bzw. FFT-Zeitfenster(Anzahl der FFT Spektren)(187 spektren) % floor-Abrunden, ceil-Aufrunden damit ganze Zahl wird- Anzahl an Perioden
Signal_1=zeros(1,k*NFFT*(1-OL)); % Reservierung des Specherplatzes/Definiton einer Null-Matrix mit 1 Zeile und n-Anzahl der FFT-Fenster (1x95744)
Nk=length(Signal_1); % Länge des gekürzten Signals
Signal_1=Signal(1:Nk); % Begrenzung des orig.Signals auf weniger Sample Points, damit ganze Perioden entstehen
% Zeitvektor
================================================
t=0:Nk-1; % Erstellung eines Zeitvektors mit Länge von Signal_1
t=t/fs; % Normierung der delta t , entsprechend der Abtastrate
freqs=linspace(0,fs/2,NFFT); % Frequentvektor von 0 bis zur halben Abtastrate , mit 1024 Werten
%Schleife
================================================
start=1; % Anfangswert des FFT-Fensters
stop=start+NFFT-1; % Ende des FFT-Fensters
i=0;
while stop<=length(Signal_1)% Begrenzt die Schleife
i=i+1;
YY=fft(Signal_1(start:stop).*window'); % Erstellt eine Matrix mit Transformierten Frequenzwerten inkl.Fensterung und Überlappung
Y(i,:)=abs(YY(1:NFFT));
T(i)=(t(start)+t(stop))/2; % Zeitvektor mit Durchnittswerten jedes Zeitabschnittes
start=start+NFFT*(1-OL);
stop=start+NFFT-1;
end
T=T';
Y=2*Y/NFFT; % Normierung der Amplitudenachse 1/NFFT und multipliziert mit 2 (außer bei Frequenz 0)
Y(1,1)=Y(1,1)/2; % (halbierung der Aplitude bei der Frequenz 0)
Frequenzvektor (freqs): 1x1024 (X-Achse)(bis zur halben Abtastrate)
Die transformierten FFT-Absolutwerte bilden nun eine Matrix (Y): 186X1024
Frage1: Wie werden die Werte gemittelt?(Segmentweise, spalten- oder zeilenweise)
Frage2: Grafisch korrekte darstellung als Waterfall und Campbell?Siehe die beiden angehängten Dateien, sind nur 2 Beispiele aus dem Internet.
Wäre für die Hilfe oder eure Lösungsansätze sehr dankbar.
danke für den Link, habe mir die Beiträge durchgelesen und habe gleich versucht mein Spektrum in 3D, mit Surf darzustellen: irgendwie sehen die beiden surf-plots nicht wirklich toll aus: Auf dem ersten ist die Amplitude, auf dem zweiten Plot das so genannte 'Leistungsdichtespektrum' (20*log10(Y))
Code:
f_for = [0:NFFT-1]*df;% Frequenzvektor
T = [0:k-1]*noverlap/fs;% Zeitvektor
Hättest du für mich einen Vorschlag, wie man die Farben ausgeprägter darstellen könnte, oder liegt an meinen FFT-Werten?
Könnte mir noch bitte jemand sagen, wie man die Beträge der einzelnen FFT-Blöcke nach erfolgter Transormation mitteln kann (averaging). Wie werden sie genau gemittelt, spalten- oder zeilenweise, segmentweise?
Die Frage nach der Mittelung bzw. dessen Sinn verstehe ich allerdings nicht. Erst durch die Segmentierung des Signals entsteht doch die zusätzliche Abhängigkeit zur Zeit, gegenüber einem einfachen Frequenzspektrum. Durch die Segmentlänge und das Überlappen, bestimmt man die Auflösung von Freq. und Zeitachse. Wenn ich nun alle Segmente in irgendeiner Form mittele, erhalte ich doch wieder nur ein Gesamtsegment, dass dann nur als Frequenzspektrum dargestellt werden kann. Ist das wirklich gewollt?
Das enspricht dann einem Leistungsdichtespektrum, siehe Funktion
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.