On the use of spectrogram function in matlab
from http://stackoverflow.com/questions/19161304/on-the-use-of-spectrogram-function-in-matlab
Consider the following example:
Fs=40;% sampling frequency
x =0:(1/Fs):4;% time domain
y =[sin(2* pi *5* x(x <=2)), sin(2* pi *10* x(x >2))];% signal
N = length(x);%Length of signal
NFFT =2^nextpow2(N);%Next power of 2from length of y
Y = fft(y,NFFT)/N;
f =Fs/2*linspace(0,1,NFFT/2+1);%Generate the plot, title and labels.
fh = figure(1);%set(fh,'color','white','visible','off');
subplot(311);
plot(x,y,'k');
xlabel('Time (s)','FontName','Times New Roman','fontsize',10);
ylabel('Amplitude','FontName','Times New Roman','fontsize',10);set(gca,'FontName','Times New Roman','fontsize',10);%# Frequency domain plots
subplot(312);
plot(f,2*abs(Y(1:NFFT/2+1)))
xlabel('Frequency (cycles/second)','FontName','Times New Roman','fontsize',10);
ylabel('Amplitude','FontName','Times New Roman','fontsize',10);set(gca,'FontName','Times New Roman','fontsize',10);
subplot(313);
window = x(1:10:end);[S,F,T]= spectrogram(y,window);
pcolor(T,F,abs(S));shading interp;
xlabel('Time (s)');
ylabel('Frequency (cycles/second)');
The STFT (short-time Fourier transform) here does not demonstrate what I expected. I would have expected the y axis to be the same as the xaxis in subplot(312) and the xaxis to be the same as the xaxis in subplot(311).
edited Oct 3 '13 at 14:30
Luis Mendo
asked Oct 3 '13 at 14:01
KatyB
1 Answer
The issue with the x axis is because you are not specifying the
sample frequency when
calling spectrogram
. Try
[S,F,T]= spectrogram(y,window,[],[],Fs);
Also, I think you are misinterpreting
the window
argument.
It refers to window shape (by the way you define it, maybe you are
thinking it defines the window positions?). So I would use
something like
window = ones(1,10);
(or try window shapes other than rectangular).
As for the y axis, in 313 the y axis is (instantaneous) frequency, whereas in 312 it is spectral amplitude. So they are not comparable. In principle, you could compare the color (z axis) of 313 with the y axis of 312, as both are spectral amplitude; however, their normalization is probably different.
edited Oct 6 '13 at 18:55
answered Oct 3 '13 at 14:24
Luis Mendo
修改
subplot(313);
% window = x(1:10:end);
window = ones(1,80);
[S,f,t,p] = spectrogram(y,window,[],[],Fs);
surf(t,f,10*log10(abs(p)),'EdgeColor','none');
axis xy; axis tight; colormap(jet); view(0,90);
xlabel('Time');
ylabel('Frequency (Hz)');