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

Rafael Guerra jrafaelbguerra at hotmail.com
Wed Jun 6 22:18:36 CEST 2018


Samuel,

The idea and the implementation of the end-points interpolation is that this is done on the input data (big slope), not on the FFT output. Maybe be it needs some further work. Tbc.

Regards,
Rafael

From: users [mailto:users-bounces at lists.scilab.org] On Behalf Of Samuel Gougeon
Sent: Wednesday, June 06, 2018 9:35 PM
To: Users mailing list for Scilab <users at lists.scilab.org>
Subject: Re: [Scilab-users] circshift() : Scilab Enhancement Proposal

Rafael,

To me, this attempt looks not legitimate.
Indeed, the true original signal HAS a steep jump across its edges.
So, the best algorithm should  shift the signal and keep this big slope
from one sample to the next. The jump is at least as steep as from
one sample to the next (and likely steeper). It must not be broadened.
There is no reason to interpolate and then decrease the slope.
Is there?

IMO, hybridating DFT and interpolation is not promising, and
DFT looks more powerful. So, to me, now the question is mainly:
with symetrization, versus with damping.

Read you soon
Samuel

Le 02/06/2018 à 15:23, Rafael Guerra a écrit :



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




_______________________________________________

users mailing list

users at lists.scilab.org<mailto: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/b9509ab6/attachment.htm>


More information about the users mailing list