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