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

Rafael Guerra jrafaelbguerra at hotmail.com
Sat Jun 2 15:23:33 CEST 2018


The previous fractional shift code was still not handling properly the endpoints.
Herein an improvement.
Fourier is still used but the sample laying between end and start points is interpolated.

// START OF CODE
// Circular fractional shift (R.Guerra, rev1, 02-Jun-2018)

function v=cfshift(y, s)
    // y: 1D series 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);
    xi = s - n0;
    yi = y(1) + xi*(y($)-y(1)); //interpolates sample between end and start
    if n0>=0 then
       v = [v0(N0+1:N0+n0) yi v0(n0+2:N0)];
    else
       v = [v0(1:N0+n0) yi v0(N+n0+2: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); // input series, 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 (black), 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

Regards,
Rafael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fractional_circular_shifts_1d_rev1.png
Type: image/png
Size: 40010 bytes
Desc: fractional_circular_shifts_1d_rev1.png
URL: <https://lists.scilab.org/pipermail/users/attachments/20180602/f1434345/attachment.png>


More information about the users mailing list