Mercurial > hg > adaptinstrspec
diff functions/dceps.m @ 0:b4e26b53072f tip
Initial commit.
author | Holger Kirchhoff <holger.kirchhoff@eecs.qmul.ac.uk> |
---|---|
date | Tue, 04 Dec 2012 13:57:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/functions/dceps.m Tue Dec 04 13:57:15 2012 +0000 @@ -0,0 +1,47 @@ +function c = dceps(X, w, numCoeffs, lambda) +% computes the discrete cepstral coefficients of a sequence of partials X. +% +% c = dceps(X, w, numCoeffs) +% +% w contains the normalized frequencies of the partials. Normalized +% frequencies should be in the range [0 .. pi] +% X and w must be column vectors. +% numCoeffs specifies the number of cepstral coefficients. +% +% Further details can be found in: +% [1] Diemo Schwarz. Spectral envelopes in sound analysis and synthesis. +% Master's thesis, Universitaet Stuttgart, 1998, pp. 36-38. +% [2] T. Galas and X. Rodet. An improved cepstral method for deconvolution +% of source filter systems with discrete spectra: Application to musical +% sound signals. In International Computer Music Conference, 1990. + + +p = numCoeffs-1; +n = length(X); % number of partials +S = ones(n,1); % amplitude of partials of source spectrum +%lambda = 0.0005; % regularization term + +if sum(X == 0) %if one or more element is zero + error('All elements of X must be nonzero'); +end + +% compute all r_i (i from 0 to 2p) +r = .5 * sum(cos(w * (0:2*p))); + +% compute matrix A +A = zeros(p+1); +B = zeros(p+1); +for i = 0:p + for j = 0:p + A(i+1,j+1) = r(i+j+1) + r(abs(i-j)+1); % +1 because 1st idx in r is 0! + end + B(i+1,i+1) = 8 * (pi*(i-1))^2; +end + +A = A + lambda * B; + +% compute b +b = sum( repmat(log(X./S),1,p+1) .* cos(w *(0:p)) )'; + +% compute c +c = A \ b; % equals inv(A) * b \ No newline at end of file