Please Help, I have a white noise signal that I created and need help to apply the Short-time fourier transform to my code so that it can do the bandpass filtering. I am trying to put it in the code so that I don't have to use the FDA tool. Also be able to plot the graphs from the output of the STFT being applied.

L = 5000; %Sample length for the random signal
Pause = 10000; %Sample Pause Gap
mu = 0;
sigma = 2;

%Need to see left signal is not displaying
Left_signal = sigma*randn(L,1) + mu;
Right_signal = sigma*randn(L,1) + mu;

Long_signal = [Left_signal zeros(L,1); zeros(Pause,2); zeros(L,1) Right_signal];

%Plots subplots in graph
plot(Left_signal, 'b'); grid on;
plot(Right_signal, 'r'); grid on;
  • $\begingroup$ need to be able to learn how to window off "frames" of data using a complementary window (like the Hann). then you need to be able to, without (yet) using any FFT, recombine the frames to get your original signal back. once you can do that, then the STFT is simply the DFT (a.k.a. FFT) of each frame. $\endgroup$ Commented May 27, 2014 at 18:14
  • $\begingroup$ how would I do that @robertbristow-johnson because I using the FDA tool for filtering at first then come to find out that was wrong for my class project and professor is killing me for it $\endgroup$
    – Asau7610
    Commented May 27, 2014 at 18:16
  • $\begingroup$ well, i don't know the FDA tool. i'll post a very skeletal piece of MATLAB. it might help. $\endgroup$ Commented May 27, 2014 at 19:12
  • $\begingroup$ Basically, STFT is Discrete Fourier Transform of the signal multiplied by the windowing function. $\endgroup$
    – Vinod
    Commented May 28, 2014 at 14:21
  • $\begingroup$ I suggest you to also refer to this answer. $\endgroup$
    – jojeck
    Commented May 30, 2014 at 7:58

1 Answer 1


this is very simplistic, but it

  1. inputs a wav file and uses only one channel of it
  2. breaks it up into windowed frames,
  3. transforms it to the frequency domain,
  4. does nothing to it in the frequency domain,
  5. transforms back to the time domain,
  6. overlap-adds that frame back into a time-domain array, and
  7. eventually writes it back out to a different .wave file.

try it out. can't guarantee there ain't typos.

if ~exist('inFile')
    inFile = 'input.wav';

if ~exist('outFile')
    outFile = 'output.wav';

if ~exist('frameWidth')
    frameWidth = 4096;          % size of FFT frame, better be a power of 2
frameHop = frameWidth/2;

analWindow = hanning(frameWidth);

[inBuffer, Fs] = wavread(inFile);

x = [inBuffer(:,1); linspace(0, 0, frameWidth)'];                   % use left channel only, zeropad one frame at the end

clear inBuffer;

numSamples = length(x);

numFrames = floor((numSamples-frameWidth)/frameHop);

y = linspace(0, 0, numSamples)';

n = 0;                              % init sample pointer.  unlike MATLAB, i like counting from 0

for frameIndex = 1:numFrames

     xWindowed = x(n+1:n+frameWidth) .* analWindow;     % get and window the input audio frame

     X = fft(fftshift(xWindowed));              % do the FFT

     Y = X;                         % copy the input spectrum to output

                                % do whatever processing to Y that you like

     yWindowed = fftshift(real(ifft(Y)));           % convert back to time domain, toss the imaginary part

     y(n+1:n+frameWidth) = y(n+1:n+frameWidth) + yWindowed;

     n = n + frameHop;

wavwrite(y, Fs, outFile);
  • $\begingroup$ what size is "size" referring from numsamples = wavread(inFile, 'size'); $\endgroup$
    – Asau7610
    Commented Jun 2, 2014 at 19:34
  • $\begingroup$ i think it's a text literal argument that tells wavread to return the number of samples of the file with file name in inFile. with that argument, it doesn't actually read in the file. not yet. $\endgroup$ Commented Jun 3, 2014 at 6:34
  • $\begingroup$ with the new edit in the code I keep getting this error "Index exceeds matrix dimensions. Error in soundRecord (line 43) xWindowed = x(n+1:n+frameWidth) .* analWindow; % get and window the input audio frame" and i tried to look it up because I wanted to plot the outcome as well just didn't get that far since kept getting an error @robert bristow-johnson $\endgroup$
    – Asau7610
    Commented Jun 3, 2014 at 18:12
  • $\begingroup$ i guess we should change it back to numFrames = floor(numSamples/frameHop) - 1; $\endgroup$ Commented Jun 4, 2014 at 3:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.