X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fm%2Fsignal%2Fsynthesis.m;fp=octave_packages%2Fm%2Fsignal%2Fsynthesis.m;h=49357ece90cdb126ba180cfc2ef5d0fdc42a1a5d;hp=0000000000000000000000000000000000000000;hb=1c0469ada9531828709108a4882a751d2816994a;hpb=63de9f36673d49121015e3695f2c336ea92bc278 diff --git a/octave_packages/m/signal/synthesis.m b/octave_packages/m/signal/synthesis.m new file mode 100644 index 0000000..49357ec --- /dev/null +++ b/octave_packages/m/signal/synthesis.m @@ -0,0 +1,72 @@ +## Copyright (C) 1995-2012 Andreas Weingessel +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} synthesis (@var{y}, @var{c}) +## Compute a signal from its short-time Fourier transform @var{y} and a +## 3-element vector @var{c} specifying window size, increment, and +## window type. +## +## The values @var{y} and @var{c} can be derived by +## +## @example +## [@var{y}, @var{c}] = stft (@var{x} , @dots{}) +## @end example +## @end deftypefn + +## Author: AW +## Description: Recover a signal from its short-term Fourier transform + +function x = synthesis (y, c) + + if (nargin != 2) + print_usage (); + endif + + [nr, nc] = size (c); + if (nr * nc != 3) + error ("synthesis: C must contain exactly 3 elements"); + endif + + w_size = c(1); + inc = c(2); + w_type = c(3); + + if (w_type == 1) + w_coeff = hanning (w_size); + elseif (w_type == 2) + w_coeff = hamming (w_size); + elseif (w_type == 3) + w_coeff = ones (w_size, 1); + else + error ("synthesis: window_type must be 1, 2, or 3"); + endif + + z = real (ifft (y)); + st = fix ((w_size-inc) / 2); + z = z(st:st+inc-1, :); + w_coeff = w_coeff(st:st+inc-1); + + nc = columns(z); + for i = 1:nc + z(:, i) = z(:, i) ./ w_coeff; + endfor + + x = reshape(z, inc * nc, 1); + +endfunction