[Scilab-users] circshift() : Scilab Enhancement Proposal
Rafael Guerra
jrafaelbguerra at hotmail.com
Fri Jun 1 17:56:18 CEST 2018
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fractional_circular_shifts_1d.png
Type: image/png
Size: 32779 bytes
Desc: fractional_circular_shifts_1d.png
URL: <https://lists.scilab.org/pipermail/users/attachments/20180601/62775e2c/attachment.png>
More information about the users
mailing list