Mercurial > hg > dcase2013_sc_rnh
diff rastamat/lpc2spec.m @ 0:1b2ac32f7152
import code sent by Gerard Roma
author | Dan Stowell <dan.stowell@elec.qmul.ac.uk> |
---|---|
date | Fri, 01 Nov 2013 08:48:19 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rastamat/lpc2spec.m Fri Nov 01 08:48:19 2013 +0000 @@ -0,0 +1,40 @@ +function [features,F,M] = lpc2spec(lpcas, nout) +% [features,F,M] = lpc2spec(lpcas,nout) +% Convert LPC coeffs back into spectra +% nout is number of freq channels, default 17 (i.e. for 8 kHz) +% 2003-04-11 dpwe@ee.columbia.edu part of rastamat + +if nargin < 2 + nout = 17; +end + +[rows, cols] = size(lpcas); +order = rows - 1; + +gg = lpcas(1,:); +aa = lpcas./repmat(gg,rows,1); + +% Calculate the actual z-plane polyvals: nout points around unit circle +zz = exp((-j*[0:(nout-1)]'*pi/(nout-1))*[0:order]); + +% Actual polyvals, in power (mag^2) +features = ((1./abs(zz*aa)).^2)./repmat(gg,nout,1); + +F = zeros(cols, floor(rows/2)); +M = F; + +for c = 1:cols; + aaa = aa(:,c); + rr = roots(aaa'); + ff = angle(rr'); +% size(ff) +% size(aaa) + zz = exp(j*ff'*[0:(length(aaa)-1)]); + mags = sqrt(((1./abs(zz*aaa)).^2)/gg(c))'; + + [dummy, ix] = sort(ff); + keep = ff(ix) > 0; + ix = ix(keep); + F(c,1:length(ix)) = ff(ix); + M(c,1:length(ix)) = mags(ix); +end