measure time from fft spectrogram

7 visualizzazioni (ultimi 30 giorni)
LO
LO il 12 Mag 2019
Commentato: LO il 13 Mag 2019
trying to convert the time scale of a signal visualized on a spectrogram in sec/msec.
the spectrogram has been calculated using known values of
1) sampling frequency (20k)
2) window size (in samples) (1024)
3) overlap (0.9)
4) total duration of the recording in samples (tspec = 11755)
5) total duration of the recording in seconds (60)
calculation of the total duration in seconds: total duration (samples) / total duration (seconds)
-> length(tspec)/60 = 195.9167
calculation of the signal duration in sec = duration of signal in samples / 195.9167
is this correct or is there any smearing of the signal time units due to nfft and overlap ?

Risposta accettata

Greg Dionne
Greg Dionne il 13 Mag 2019
You can extract the time vector from the third output of the spectrogram function.
[S,F,T,Pxx] = spectrogram(X,...)
F is the frequency vector corresponding to the rows in S and Pxx.
T is the time vector corresponding to the columns of S and Pxx.
The time and frequencies correspond to the center of each estimate in S and Pxx; the resolution of the estimates in time and frequency are governed by the choice of window and overlap used. If there aren't enough samples to complete a full FFT at the end of the input signal, X, then the result is truncated.
  3 Commenti
Greg Dionne
Greg Dionne il 13 Mag 2019
That sounds right... but perhaps an example would work better to explain how the NFFT and overlap affect the location of the time estimates:
If you load an audio clip and take a spectrogram with settings comparable to yours (1024 size FFT 90% overlap (921 samples), you can inspect the output for more information on the time and frequencies that correspond to the spectral estimates in Pxx.
First, load the sample file and view its length.
>> load mtlb.mat
>> size(mtlb)
ans =
4001 1
>> Fs
Fs =
7418
So the signal is 4001 samples / (7418 samples/second) = 0.5394 seconds.
If you choose an FFT length of 1024 samples, that means you are inspecting 0.138 seconds worth of data in each FFT. An overlap of 90% (921 samples) means that you obtain estimates every 1024 - 921 = 103 samples or 0.0139 seconds.
Let's take the spectrogram now with those settings:
[S,F,T,Pxx] = spectrogram(mtlb,kaiser(1024,10),921,1024,Fs,'power');
>> size(Pxx)
ans =
513 29
>> size(F)
ans =
513 1
>> size(T)
ans =
1 29
So you have 29 estimates in time. If you inspect the time vector you will see:
>> T
T =
Columns 1 through 11
0.0690 0.0829 0.0968 0.1107 0.1246 0.1384 0.1523 0.1662 0.1801 0.1940 0.2079
Columns 12 through 22
0.2218 0.2356 0.2495 0.2634 0.2773 0.2912 0.3051 0.3190 0.3328 0.3467 0.3606
Columns 23 through 29
0.3745 0.3884 0.4023 0.4161 0.4300 0.4439 0.4578
You will see that the first estimate is centered within your FFT window (0.069 = 0.138/2). The next estimate is a difference of 0.0829 - 0.069 = 0.0139, which matches the time interval between estimates. These estimates continue until the last time where a complete FFT can be made. This is the last estimate (0.4578) which contains data up to 0.4578 + 0.138/2 = 0.5268 seconds. The last 12.6 milliseconds of data from (0.5268 to 0.5394 seconds) are discarded since it does not comprise a complete FFT record.
Hope this helps.
-Greg
LO
LO il 13 Mag 2019
absolutely! thanks for clarifying all this. I know these are basics. but it helped :)

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by