annotate 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
rev   line source
dan@0 1 function [features,F,M] = lpc2spec(lpcas, nout)
dan@0 2 % [features,F,M] = lpc2spec(lpcas,nout)
dan@0 3 % Convert LPC coeffs back into spectra
dan@0 4 % nout is number of freq channels, default 17 (i.e. for 8 kHz)
dan@0 5 % 2003-04-11 dpwe@ee.columbia.edu part of rastamat
dan@0 6
dan@0 7 if nargin < 2
dan@0 8 nout = 17;
dan@0 9 end
dan@0 10
dan@0 11 [rows, cols] = size(lpcas);
dan@0 12 order = rows - 1;
dan@0 13
dan@0 14 gg = lpcas(1,:);
dan@0 15 aa = lpcas./repmat(gg,rows,1);
dan@0 16
dan@0 17 % Calculate the actual z-plane polyvals: nout points around unit circle
dan@0 18 zz = exp((-j*[0:(nout-1)]'*pi/(nout-1))*[0:order]);
dan@0 19
dan@0 20 % Actual polyvals, in power (mag^2)
dan@0 21 features = ((1./abs(zz*aa)).^2)./repmat(gg,nout,1);
dan@0 22
dan@0 23 F = zeros(cols, floor(rows/2));
dan@0 24 M = F;
dan@0 25
dan@0 26 for c = 1:cols;
dan@0 27 aaa = aa(:,c);
dan@0 28 rr = roots(aaa');
dan@0 29 ff = angle(rr');
dan@0 30 % size(ff)
dan@0 31 % size(aaa)
dan@0 32 zz = exp(j*ff'*[0:(length(aaa)-1)]);
dan@0 33 mags = sqrt(((1./abs(zz*aaa)).^2)/gg(c))';
dan@0 34
dan@0 35 [dummy, ix] = sort(ff);
dan@0 36 keep = ff(ix) > 0;
dan@0 37 ix = ix(keep);
dan@0 38 F(c,1:length(ix)) = ff(ix);
dan@0 39 M(c,1:length(ix)) = mags(ix);
dan@0 40 end