[Scilab-users] circshift() : Scilab Enhancement Proposal

Samuel Gougeon sgougeon at free.fr
Wed Jun 6 21:21:40 CEST 2018


Hello Rafael,

I did not remember this symetrization trick that you use to restore 
continuous boundaries and so avoid the noise-making jump.
It is very efficient. Great!

I don't see any reason that could make this trick failing with complex 
numbers:
Making the signal even makes its spectrum even, whatever is the signal, 
real or complex.
So, the very same algorithm shall work as well for complex data.

Extension to N-Dimension should be OK as well with the fft(., ., 
selection) syntax, and a loop other the selected direction.

May be because the slope is still discontinuous, there is still a tiny 
artefact after shifting.
This may invite to still try with a damping window, in comparison with 
the symetrization.
Damping makes the signal and its derivative continuous across limits.

I am answering to your next message by replying to it.

Best regards
Samuel

Le 01/06/2018 à 17:56, Rafael Guerra a écrit :
> Hi Samuel,
>
> The implementation below of the circular fractional shift function seems to suffer from less endpoints’ artefacts.
>
> // START OF CODE
> // Circular fractional shift (R.Guerra, 01-Jun-2018)
>
> function v=cfshift(y, s)
>      // y: 1D series of real values
>      // s: shift, decimal number of samples
>      // v: y series shifted by s samples
>      N0 = length(y);
>      y2 = [y y($:-1:1)]; // make input even and continuous
>      N = length(y2);
>      m = N/2;
>      dw = -%i*2*%pi/N;
>      ix1 = 1:m;
>      ix = [0, ix1, -ix1(m-1:-1:1)];
>      s = modulo(s,N0);
>      lph = exp(ix*dw*s);
>      v0 = real((ifft(fft(y2).*lph)));
>      n0 = floor(s);
>      if n0>=0 then
>         v = [v0(N0+1:N0+n0) v0(n0+1:N0)];
>      else
>         v = [v0(1:N0+n0) v0(N+n0+1:N)];
>      end
> endfunction
>
> clf
> n = 30;  // number of input samples
> x = 1:n;  // domain of the series, with unit sampling rate
> sn = -33;  // ex.1: negative integer shift (modulo(sn,n) = -3)
> sp = 10.5; // ex.2: positive fractional shift
> y = cos(1.8*%pi*(x-10)/n); // ex. of input series with discontinuous at endpoints
> vi = cfshift(y, sn);
> vf = cfshift(y, sp);
> plot(x,y,'blacko',x,y,'black--',x,vi,'bo',x,vi,'b--',x,vf,'ro',x,vf,'r--');
> xgrid
> title("Original series with circular integer shift = " + string(sn) + " (blue) and circular fractional shift = " + string(sp) +" (red)", "fontsize",4);
> gca().data_bounds = [0.5,-1.1;n+0.5,1.1]
> gca().tight_limits="on";
>
> // END OF CODE
>
>
> Not sure if this is the best way to implement this.
> Also, it requires generalization to complex numbers and multi-dimensions.
>
> Regards,
> Rafael
>
>
> _______________________________________________
> 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/20180606/e9a842b3/attachment.htm>


More information about the users mailing list