-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstft.m
46 lines (42 loc) · 1.06 KB
/
stft.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function TF = stft(f,wd)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% short-time Fourier transform with Guassian window
%
% Input:
% f - signal (real or complex)
% wd - std. deviation (sigma) of the Gaussian function
% Output:
% TF - time-frequency distribution
%
% By V.C. Chen
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cntr = length(f)/2;
sigma = wd;
fsz = length(f);
z = exp(-([1:fsz]-fsz/2).^2/(2*sigma^2))/(sqrt(2*pi)*sigma);
for m=1:fsz
mm = m-cntr+fsz/2;
if (mm <= fsz & mm >= 1)
gwin(m) = z(mm);
else
if (mm > fsz)
gwin(m) = z(rem(mm,fsz));
else
if(mm < 1)
mm1 = mm+fsz;
gwin(m) = z(mm1);
end
end
end
end
winsz = length(gwin);
x = zeros(1,fsz+winsz); % zero padding
x(winsz/2+1:winsz/2+fsz) = f;
for j = 1:fsz
for k = 1:winsz
X(k) = gwin(k)*x(j+k);
end
TF(:,j) = fft(X).';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%