fCWT icon indicating copy to clipboard operation
fCWT copied to clipboard

STFT Matlab code in the article

Open whip123 opened this issue 3 years ago • 5 comments

Hi, I am currently trying to replicate the comparison in the article. But I couldn't get the same result as the Benchmark results for synthetic data showed. Could you post the STFT code in the article here? Thanks a @fastlib @lschneiderbauer @felixdollack . (URGENT)

whip123 avatar Mar 05 '23 03:03 whip123

Hi @whip123,

I am not associated with this project. Just having a personal interest in it. You also posted commented here that you could not build the library for Matlab on Windows. In case you managed, could you comment in the other issue how you managed?

Best, Felix

felixdollack avatar Mar 05 '23 08:03 felixdollack

Dear @whip123,

The article in Nature Computational Science should have all the details about the parameters used for the STFT. Can you show me in which way you cannot match the benchmark results?

fastlib

fastlib avatar Mar 15 '23 19:03 fastlib

Dear @fastlib

For now, I couldn't normalize my result as shown in the article. Could you tell me how? Below is my Matlab code to replicate the results in the article

tic [s,f,t] = stft(signal,fs,Window=blackman(250,'period'),OverlapLength=200,FFTLength=512); STFTtime = toc sdb = mag2db(abs(s)); mesh(t,f,sdb); cc = max(sdb(:))+[-50 0]; ax = gca; ax.CLim = cc; view(2) ylim([0 120]) ylabel("Frequency (Hz)"); xlabel("Time (s)"); colorbar; image

Thank you. whip123

whip123 avatar Mar 23 '23 06:03 whip123

We normalized every time-frequency matrix to a [0,1] range. As such, the power scale is transformed to an arbitary power unit that allows a fair comparison for the ridge extraction analysis we did subsequently. I hope this answers your question. For completeness I pasted the code below:

`function [res,ts,frqs] = stftwrapper(times,tstep,data,fs,f0,f1,tit,fftlength)

[s,freqs,t] = stft(data,fs,'Window',blackman(round(fs*0.5)),'OverlapLength',round(fs*0.40),'FFTLength',fftlength);

[v,s0]=min(abs(freqs-f0));
[v,s1]=min(abs(freqs-f1));

image(t,freqs(s0:s1,:),normalizeMatrix(abs(s(s0:s1,:))),"CDataMapping","direct")
res = normalizeMatrix(abs(s(s0:s1,:)));
set(gca, 'ydir', 'normal');
colormap jet;

ts = t;
frqs = freqs(s0:s1,:);

xlabel("Time (s)");
ylabel("Frequency (Hz)");

xticks(min(times+30):tstep:(max(times+30)))
xticklabels(min(times):tstep:(max(times)))

ttl = title(tit);
ttl.Units = 'Normalize'; 
ttl.FontSize = sp(6);
ttl.Position(1) = 0; % use negative values (ie, -0.1) to move further left
ttl.HorizontalAlignment = 'left';  
ttl.Color = 'white';

return`

fastlib avatar Mar 24 '23 18:03 fastlib

Hi @fastlib

Thanks for the code, could you give me all the parameters as well, such as fft length, f0, f1 and times.

Furthermore, I would also like to apologize for the mistakes in my previous post, as I found that I posted the wrong spectrogram after applying the code. Below shows the spectrogram I got after applying the code with 500ms Blackman window, and 400ms overlap. image However, in the spectrogram, there are 2 white lines, do u have any idea what I should change in the code? in order to get the same graph as the article shown

Thank you.

whip123 avatar Mar 25 '23 13:03 whip123