[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