[Scilab-users] filter(): How to use the last zi argument <= Re: vector operation replacing for loop

Samuel Gougeon sgougeon at free.fr
Wed Nov 7 20:57:58 CET 2018


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
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20181107/7f0022ac/attachment.htm>


More information about the users mailing list