Mercurial > hg > dcase2013_sc_rnh
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 |