2016-04-11 18 views
1

Ich habe einen sehr großen Datensatz von lokalen Feldpotentialen (Rohspannungen), die ich vorverarbeitet habe, um Rauschen und Ausreißer zu entfernen. Ich ordnete die Daten so an, dass jede Zeile 30 Sekunden lang Samples repräsentiert. Ich habe Leistungsspektren erzeugt wird, wie folgt:Erzeugen von Heatmap aus dem Leistungsspektrum, Matlab

Fs = 1024 
LFP = 1075x30720 double 
pxx = 1075x4097 double 

for k = 1:1075; 
    pxx(kk,:) = pwelch(LFP(k,:)); 
end 

Ziel: heatmap erzeugen, so dass jede Zeile der Pxx einer Spalte auf erzeugten heatmap ist, so sollte ich 1075 Bins auf der X-Achse haben, und ich möchte Die Y-Achse ist auf Frequenzen von 0 - 120 Hz begrenzt. Ich habe versucht, Bilderc zu verwenden, aber habe Schwierigkeiten, danke.

+0

Was * sind * deine Schwierigkeiten mit 'imagesc'? (siehe [fragen]) – zeeMonkeez

Antwort

0

das Ergebnis zeichnen Sie ein paar Dinge tun müssen, wäre:

  1. wählen Sie Spalten auf Frequenzen bis zu 120 Hz entspricht;
  2. transponieren pxx, um die Zeilen pxx als Spalten des generierten Bildes erscheinen zu lassen;
  3. spiegeln Sie die Daten mit flipud auf den Kopf, wenn Sie möchten, dass die höchste Frequenz oben mit imagesc angezeigt wird;
  4. optional in logarithmische Dezibel skalieren;
  5. Plot unter Verwendung von imagesc oder pcolor;
  6. Wählen Sie den dynamischen Wertebereich, der mit caxis angezeigt werden soll, so dass Sie eine angemessene Verteilung des Werts in der Farbkarte erhalten.
  7. wählen Sie eine Colormap wie colormap(hot) für eine Heatmap-Stil.

    % 1) Compute maximum frequency index 
    Fmax = 120; % Hz 
    M = 1 + round(Fmax/(0.5*Fs/(size(pxx,2)-1))); 
    % select displayed section 
    pxx_select = pxx(:,1:M); 
    
    % 2) transpose matrix 
    pxx_reshape = transpose(pxx_select); 
    
    % 3) flip data upside down for imagesc 
    pxx_reshape = flipud(pxx_reshape); 
    
    % 4) convert to decibel scale 
    pxx_dB  = 10*log10(pxx_reshape); 
    
    % 5) generate plot 
    figure(1); 
    imagesc(pxx_dB); 
    
    % 6) choose dynamic range 
    % assign e.g. 80dB below peak power to the first value in the colormap 
    %    and the peak power to the last value in the colormap 
    caxis([max(max(pxx_dB))-80 max(max(pxx_dB))]); 
    
    % 7) select colormap 
    colormap(hot); 
    

    Oder, wenn Sie die Kontrolle über die angezeigte Achse haben wollen:

Dies kann mit gemacht werden

% 1) Compute maximum frequency index 
Fmax = 120; % Hz 
M = 1 + round(Fmax/(0.5*Fs/(size(pxx,2)-1))); 
% select displayed section 
pxx_select = pxx(:,1:M); 

% 2) transpose matrix 
pxx_reshape = transpose(pxx_select); 

% 3) flipud not needed with pcolor, instead set t & f axis: 
t = (size(LPF,2)/Fs)*[0:size(LPF,1)]; 
f = [0:M]*Fmax/(M-1); 

% 4) convert to decibel scale 
pxx_dB  = 10*log10(pxx_reshape); 

% 5) generate plot 
figure(2); 
% Note: extend by one row & column since pcolor does not show the last row/col 
P2 = [pxx_dB pxx_dB(:,end); pxx_dB(end,:) pxx_dB(end,end)]; 
pcolor(t,f,P2); shading flat; 

% 6) choose dynamic range 
% assign e.g. 80dB below peak power to the first value in the colormap 
%    and the peak power to the last value in the colormap 
caxis([max(max(pxx_dB))-80 max(max(pxx_dB))]); 

% 7) select colormap 
colormap(hot); 

xlabel("time (s)"); 
ylabel("frequency (Hz)"); 

Als Illustration, würden Sie ein Diagramm ähnlich erhalten

sample graph

für einen einfachen langsam frequenzveränderlichen Ton erzeugt mit:

T = size(LPF,1)-1; 
phi = 0; 
n = [0:size(LPF,2)-1]; 
for k=1:size(LPF,1) 
    f = 0.5*(fmin+fmax) + 0.5*(fmax-fmin)*sin(2*pi*k/T); 
    LPF(k,:) = sin(2*pi*f*n/Fs + phi); 
    phi = mod(phi + 2*pi*f*size(LPF,2)/Fs, 2*pi); 
end 
+0

Ok, großartig! Das ist sehr nah an dem, was ich brauche, also werde ich akzeptieren und werde den geänderten Code veröffentlichen, wenn ich ihn eingestellt habe. Eine Sache jedoch - für Abbildung 1 ist die Y-Achse immer noch umgedreht, wenn ich den Code ausführe, aber in Abbildung 2 korrigiert. – tekkkkkkk

+0

Vielleicht möchten Sie die Figur zurücksetzen (indem Sie es schließen), wenn Sie mit den Grafikattributen gespielt haben (zB 'set (gca, ...') – SleuthEye

+0

das ist wirklich toll, danke – tekkkkkkk