Compute PSD from fft compared with spectrogram
    5 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
Hi there,
Recently I am working on translating some Matlab code to Java, as I want to do some pattern recognition in mobile phones. In the Matlab code from my teammate, he used this function "spectrogram" to get PSD, which I couldn't find a complete open-source implementation online. Therefore I have to do it by my own.(who doesn't!!)
I got some algorithms from the forum such as:
y = data;
Fs = 90;
L = length(y);
y  = y(:) - mean(y);
NFFT = 2^nextpow2(L);
Y = fft(y,NFFT);
f = Fs/2*linspace(0,1,NFFT/2+1);
psd = abs(Y(1:NFFT/2+1)).^2/L;
psd = psd/Fs;
which has the same result with
   periodogram
But NONE of them has the same result as the spectrogram. Would any one help me out here? Thank you very much.
0 Commenti
Risposta accettata
  Wayne King
    
      
 il 3 Dic 2012
        
      Modificato: Wayne King
    
      
 il 3 Dic 2012
  
      spectrogram optionally returns the short-time periodogram estimates. I'll show you how to establish the correspondence for the default Hamming window used in spectrogram. I'll establish the correspondence only for the 1st segment in the following example, but it is straightforward to extend it over the entire data record with the proper overlap.I'll just use a noise vector and assume a sampling rate of 1 kHz.
   x = randn(1000,1);
   [y,f,t,p] = spectrogram(x,256,250,256,1000);
   % now to create an equivalence between the column vectors
   % in p
   win = hamming(256);
   xdft = fft(x(1:256).*win);
   psdx = abs(xdft(1:length(xdft)/2+1)).^2;
   psdx = 1/(1000*norm(win,2)^2)*psdx;
   psdx(2:end-1) = 2*psdx(2:end-1);
   % now compare
   subplot(211)
   plot(psdx)
   subplot(212)
   plot(p(:,1))
3 Commenti
  Brandon  Madsen
      
 il 8 Giu 2017
				
      Modificato: Brandon  Madsen
      
 il 8 Giu 2017
  
			This is a very helpful explanation, but I am unsure about the purpose of a certain line of code, namely: psdx = 1/(1000*norm(win,2)^2)*psdx; . Could someone explain what this part is doing and why it is needed?
EDIT: Oh, nm, it's for normalization to Hz I assume.
  HYZ
 il 15 Ott 2021
				If I want to plot for different frequencies, let's say 0 to 300Hz in the y-axis [y,f,t,p] = spectrogram(x,256,250,1:300,1000); how can I change the below? 
   win = hamming(256);
   xdft = fft(x(1:256).*win);
   psdx = abs(xdft(1:length(xdft)/2+1)).^2;
   psdx = 1/(1000*norm(win,2)^2)*psdx;
   psdx(2:end-1) = 2*psdx(2:end-1);
Più risposte (1)
  Vieniava
      
 il 2 Dic 2012
        Spectrogram is time-frequency (3D=time vs freq. vs amplitude) representation of a signal and periodogram/fft is frequency only (2D= freq vs amplitude) representation. Spectrogram shows how the frequency spectrum is changing over the time. Spectrogram is a set of consecutive fft's. Spectrogram is a matrix and fft/peridogram is a vector.
Vedere anche
Categorie
				Scopri di più su Multirate Signal Processing in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




