[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