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

Kurzzeit-FFT , Mittelung der FFT-Segmente, Darstellung in 3D

 

Greg
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2015, 17:09     Titel: Kurzzeit-FFT , Mittelung der FFT-Segmente, Darstellung in 3D
  Antworten mit Zitat      
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 Question )

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
                           
%k=floor(N/NFFT);          % ohne overlap
 
   
================================================

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

%Fenster
% ================================================

window=hamming(NFFT);

%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)
 


Zeitvektor (T): 186x1 (Y-Achse)(von 0-2 sec)

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.

Spectr.PNG
 Beschreibung:
und Waterfall

Download
 Dateiname:  Spectr.PNG
 Dateigröße:  74.77 KB
 Heruntergeladen:  600 mal
spec1.PNG
 Beschreibung:
Diese grafische Dartellung bräuchte ich.

Download
 Dateiname:  spec1.PNG
 Dateigröße:  380.83 KB
 Heruntergeladen:  613 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: 10.02.2015, 17:38     Titel:
  Antworten mit Zitat      
Es gibt bereits eine fertige Funktion in Matlab, welche dies bietet:

Code:

specgram % in älteren Matlab version
spectrogramm
 


Außerdem findest du hier eine eigene Version auf Seite 2 des Threads: http://www.gomatlab.de/spektrogramm.....spectrogram,start,15.html
Private Nachricht senden Benutzer-Profile anzeigen
 
Greg
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 08.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2015, 20:55     Titel:
  Antworten mit Zitat      
Hallo Forum-Meister,

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


surf(f_for,T,Y);% reine Amplitude

surf(f_for,T,20*log10(Y));% Leistundsdichtespektrum darstellen (db)

colorbar;
axis xy, colormap(jet)
zlabel('Amplitude ')
xlabel('Frequenz [Hz]');
ylabel('Zeit [s]');
axis([0, T(end), 0, f_for(end), -70, 30]) % Leistundsdichtespektrum
axis([0, f_for(end), 0, T(end), -1,10]) % Amplitude
 


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?

Danke

Surf-Amplitude.PNG
 Beschreibung:
Amplitude ohne Einheiten

Download
 Dateiname:  Surf-Amplitude.PNG
 Dateigröße:  65.4 KB
 Heruntergeladen:  612 mal
SURF_[db].PNG
 Beschreibung:
Amplitude in [db]

Download
 Dateiname:  SURF_[db].PNG
 Dateigröße:  92.36 KB
 Heruntergeladen:  591 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: 12.02.2015, 16:43     Titel:
  Antworten mit Zitat      
Ich denke du willst ein Wasserfall-Diagramm, wie im ersten Post angegeben? Dann wäre die Darstellung so:

Code:

% Spektrogramm darstellen
imagesc(t,f,20*log10(H_pos0))
axis xy, colormap(jet)
ylabel('Frequenz [Hz]');
xlabel('Zeit [s]');
 


Wenn dir die 3D Darstellung nicht gefällt, kannst du mal statt surf

Code:


verwenden.

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

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.