how do I get the STFT inverse

6 views (last 30 days)
Igor
Igor on 26 Apr 2013
Commented: Antoine Liutkus on 24 Oct 2013
I am using this this code to obtain the short time fourier transform:
function y = STFT(x, sampling_rate, window, window_length, step_dist, padding)
%
% y = STFT(x, sampling_rate, window, window_length, step_dist, padding)
%
% STFT produces a TF image of "x".
% The output is also stored in "y".
%
% For "window", use one of the following inputs:
% rectangular = 1
% Hamming = 2
% Hanning = 3
% Blackman-Tukey = 4
%
% The time scale is associated with the center of the window,
% if the window is of odd length. Otherwise, the window_length/2
% is used. "Step_dist" determines the stepping distance between the number
% of samples, and is arranged to maintain the proper time index
% provided by "sampling_rate" in seconds. "Padding" is the
% total length of the windowed signal before the fft, which is
% accomplished by zero padding.
%
% Developed by Timothy D. Dorney
% Rice University
% April, 1999
% tdorney@ieee.org
%
% Coded using MATLAB 5.X.X.
%
% REVISION HISTORY
%
% VERSION 1.0.0 APR. 21, 1999 TIM DORNEY
%
if (nargin ~= 6) disp('STFT requires 6 input arguments!') return; end if ((window < 1) | (window > 4)) window = 1; disp('The argument "window" must be between 1-4, inclusively. Window set to 1!'); end if ((step_dist < 1) | (round(step_dist) ~= step_dist)) step_dist = 1; disp('The argument "step_dist" must be an integer greater than 0. Step_dist set to 1!'); end if (sampling_rate <= 0) disp('The argument "sampling_rate" must be greater than 0.'); break; end if (padding < window_length) padding = window_length; disp('The argument "padding" must be non-negative. Padding set to "window_length"!'); end
if (window == 1) WIN = ones(1,window_length); elseif (window == 2) WIN = hamming(window_length)'; elseif (window == 3) WIN = hanning(window_length)'; elseif (window == 4) WIN = blackman(window_length)'; end
[m,n] = size(x); if (m ~= 1) X = x'; else X = x; end [m,n] = size(X); if (m ~= 1) disp('X must be a vector, not a matrix!'); break; end
LENX = length(X); IMGX = ceil(LENX/step_dist); if (padding/2 == round(padding/2)) IMGY = (padding/2) + 1; else IMGY = ceil(padding/2); end
y = zeros(IMGX,IMGY);
if (window_length/2 == round(window_length/2)) CENTER = window_length/2; x_pad_st = window_length - CENTER - 1; x_pad_fi = window_length - CENTER; else CENTER = (window_length+1)/2; x_pad_st = window_length - CENTER; x_pad_fi = window_length - CENTER; end
X = [zeros(1,x_pad_st) X zeros(1,x_pad_fi)];
iter = 0; for kk = 1:step_dist:LENX iter = iter + 1; XX = X(kk:(kk + window_length - 1)); YY = XX .* WIN; ZZ = abs(fft(YY, padding)); y(iter,:) = ZZ(1:IMGY); end
freq = (1/sampling_rate)/2; imagesc([0:(step_dist*sampling_rate):(sampling_rate*(LENX-1))], ... [0:(freq/(IMGY-1)):freq],y'); xlabel('Time (seconds)'); ylabel('Frequency (Hz)'); axis('xy')
How can I get the inverse stft to the one I am using?

Answers (1)

Bjorn Gustavsson
Bjorn Gustavsson on 26 Apr 2013
Edited: Bjorn Gustavsson on 26 Apr 2013
Why not try the generic first step: LOOK AT THE FILE EXCHANGE?
I found:
HTH
  2 Comments
Igor
Igor on 26 Apr 2013
I dont understand this file, its very complex. I tried their exaple, but I use a signal, not a wav. file, so I dont know if it works. Anyhow, I would like to have the inverse to the stft code I use...
Antoine Liutkus
Antoine Liutkus on 24 Oct 2013
Edited: Antoine Liutkus on 24 Oct 2013
You can use this class with a vector instead of a wav file through mysigobject = Signal(data,samplingrate);
all the rest is the same
cheers

Sign in to comment.

Categories

Find more on Time-Frequency Analysis in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!