Hello,

Is there anyone here that uses to use the last filter() optional argument?

In the example of the thread reminded below:

V = Z;
for i=2:n
   V(i) = a*V(i-1) + b*Z(i);
end

the input is Z, the output is V, a and b are fixed parameters.
The filter() description tells:

Syntax
------
 [y,zf] = filter(B, A, x [,zi])

Parameters
----------
B : real vector : the coefficients of the filter numerator in decreasing power order, or
       a polynomial.
A : real vector : the coefficients of the filter denominator in decreasing power order,
       or a polynomial.
  x  : real row vector : the input signal
zi : real row vector of length max(length(a),length(b))-1: the initial condition relative to a "direct form II transposed" state space representation. The default
       value is a vector filled with zeros.

So here i assume that zi is V(0) (so actually Z(1)). Then, how to get
[Z(1) V(2:n)]
as from the above loop? I have tried the following, without success:
y = filter(b, [1 -a], Z);
or
y = [Z(1) filter(b, [1 -a], Z(2:$), Z(1))];
or
y = filter(b, [1 -a], Z, Z(1)*(1-b)/a);

The zi option has no example, and unless filter() is bugged, the way zi works/is taken into account is unclear.

Any hint (before analyzing its hard code..)?

Regards
Samuel


Le 01/11/2018 à 15:16, Samuel Gougeon a écrit :
Le 01/11/2018 à 13:40, Samuel Gougeon a écrit :
Hello,

Le 01/11/2018 à 09:27, Heinz Nabielek a écrit :
Sorry, Scilab friends, I am still not fluid with vector operations.
Can someone rewrite the for loop for me into something much more efficient?

n=1000;
Z=grand(1,n,'nor',0,1);
r=0.9;
V=Z;
for i=2:n;
        V(i)=r*V(i-1)+sqrt(1-r^2)*Z(i);
end;

The transformation generates an autocorrelated (here rho=0.9) normal 
distribution V from an uncorrelated normal distribution Z and eventually I will 
need it for very much larger n values....

You may use filter(), with a feedback component (since V(i) depends on the previous state V(i-1) computed at the previous step). However, as shown below, a quick trial shows an initial discrepancy between filter() result and yours with the explicit loop. I don't know why. May be the setting for the initial condition should be carefully considered/tuned...

This is certainly the reason. For i=1, V(i-1) is unknown and must be somewhat provided. The last filter() option zi is not really documented (i have no time to go to the reference to get clear about how "the initial condition relative to a "direct form II transposed" state space representation." works. Trying to provide a value V(0) such that V(1)==Z(1) decreases the initial discrepancy by a factor 10. But it is still non zero.
y  =  filter(sqrt(1-r^2), [1  -r],  Z,   Z(1)*(1-sqrt(1-r^2))/r);



_______________________________________________
users mailing list
[email protected]
http://lists.scilab.org/mailman/listinfo/users


_______________________________________________
users mailing list
[email protected]
http://lists.scilab.org/mailman/listinfo/users

Reply via email to