Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/ngsetup_vpa.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ao/ngsetup_vpa.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,170 @@ +function [Tinit,Tprop,E] = ngsetup_vpa(den,fs, ndigits) + + % ALGONAME = mfilename; + % VERSION = '$Id: ngsetup_vpa.m,v 1.2 2008/08/01 13:19:42 ingo Exp $'; + digits(ndigits) + fs = sym(fs); + den = sym(den,'d'); + den=den'; + dt = vpa(1/fs); + + n = length(den)-1; + % digits(d); + + %% setting up matrix Aij + m_a = vpa(zeros(n,n)); + for i = 1:n + for j = 1:n + if j == i+1 + m_a(i,j) = 1; + end + if i == n + m_a(i,j) = -den(j); + end + end + end + + %% Matrix exponential E + a = m_a*dt; + E = expm(a); + + + %% setting up matrix Bij + B = vpa(zeros(n,n)); + for i=1:n + if rem(i,2) ~= 0 + j0 = (i+1)/2; + s = (-1)^(j0+1); + j = j0; + for k=1:2:(n+1) + d1 = den(k); + d2 = s*d1; + B(i,j) = d2; + s = -s; + j = j+1; + end + end + if rem(i,2) == 0 + j0 = i/2+1; + s = (-1)^j0; + j = j0; + for k=2:2:(n+1) + d1 = den(k); + d2 = s*d1; + B(i,j) = d2; + s = -s; + j = j+1; + end + end + end + + %% solve B * m = k + m_k = vpa(zeros(n,1)); + m_k(n) = 0.5; + m_m = vpa(B\m_k); + + %% filling covariance matrix Cinit + % Cinit = vpa(zeros(n,n)); + % for i=1:n + % for j=1:n + % if rem((i+j),2) == 0 % even + % d1 = (-1)^((i-j)/2); + % d1 = subs(d1) + % d2 = vpa('m_m((i+j)/2)'); + % d2 = subs(d2) + % d3 = vpa(ctranspose(d2)); + % d3 = subs(d3) + % d4 = vpa('d1 * d3'); + % d4 = subs(d4) + % Cinit(i,j) = d4; + % else + % Cinit(i,j) = 0; + % end + % end + % end + + Cinit = vpa(zeros(n,n)); + for i=1:n + for j=1:n + if rem((i+j),2) == 0 % even + d1 = (-1)^((i-j)/2); + d2 = (i+j)/2; + Cinit(i,j) = d1 * m_m(d2); + % else + % Cinit(i,j) = 0; + end + end + end + %cholesky decomposition + + % Tinit = chol(double(Cinit),'lower'); %lower triangular matrix + Tinit = ao.mchol(Cinit); + + %% setting up matrix D + N = n*(n+1)/2; + + m_d = vpa(zeros(N)); + g = zeros(n); + for i=1:n + for j=1:n + if i>=j + g(i,j) = (i*i-i)/2+(j); + else + g(i,j) = (j*j-j)/2+(i); + end + end + end + + for i=1:n + for j=i:n + for k=1:n + m_d(g(i,j),g(j,k)) = m_d(g(i,j),g(j,k)) + m_a(i,k); + m_d(g(i,j),g(i,k)) = m_d(g(i,j),g(i,k)) + m_a(j,k); + end + end + end + + + %% setting up q from D * p = q + m_q = vpa(zeros(1,g(n,n))); + for i=1:n + for j=i:n + if i==n + m_q(g(i,j)) = (E(n,n))*(E(n,n))-1; + else + m_q(g(i,j)) = (E(i,n)*E(j,n)); + end + end + end + + m_p = m_d\m_q'; + + Cprop = vpa(zeros(n)); + for i=1:n + for j=1:n + Cprop(i,j) = m_p(g(i,j)); + end + end + + Tprop = ao.mchol(Cprop); + Tprop = double(Tprop); + E = double(E); + Tinit = double(Tinit); + + % Tprop = chol(Cprop,'lower'); + + % Tprop = chol(double((Cprop)),'lower'); + % Tprop = mchol(Cprop); + + % %% writing the generator + % r = randn(n,1); + % y = Tinit * r; + % x = zeros(Nfft,1); + % for i=1:Nfft + % r = randn(n,1); + % y = E * y + Tprop * r; + % x(i) = a*y; + % end + +end +