-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathISTFT.m
55 lines (39 loc) · 944 Bytes
/
ISTFT.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
46
47
48
49
50
51
52
53
54
55
function [ y ] = ISTFT( Yw, wFn, L, S, zeroPhase, varargin )
%STFT Short-Time Fourier Transform
%
% Input
% Yw - STFT{yw}
% wFn - window function
% L - [samples] - size of each frame
% S - [samples] - hop
% zeroPhase -
%
% Return
% y - ISTFT{Yw}
if(S < 1)
%error
end
pad = [0 0];
if nargin > 5
pad = varargin{1};
end
%frames and fft size
[N, M] = size(Yw);
NFFT = (N - 1)*2;
%Total length
n = (M-1)*S + L;
y = zeros(n, 1); %zero-padding x
yw = zeros(NFFT,M);
%Calling window function size L
%w = wFn(L, S, zeroPhase);
%Windowing and FFT
for m=1:M
yw(:, m) = real(ifft([Yw(:, m); conj(Yw(end-1:-1:2, m))], NFFT));
y((1:L) + (m-1)*S) = y((1:L) + (m-1)*S, 1) + yw(1:L, m).*wFn;
end
w_square_sum = sum(wFn.^2);
y = y .*S/w_square_sum;
%Cutting the edges for perfect reconstruction
y(1:pad(1)) = [];
y((end-pad(2)+1):end) = [];
end