Я хочу сместить вектор по нецелому сдвигу, линейная интерполяция кажется не очень точной, поэтому я пытаюсь использовать интерполяцию следующим образом код, который использует преобразование Фурье.смещение элементов вектора по нецелому сдвигу в matlab
function y = fshift(x,s)
% FSHIFT Fractional circular shift
% Syntax:
%
% >> y = fshift(x,s)
%
% FSHIFT circularly shifts the elements of vector x by a (possibly
% non-integer) number of elements s. FSHIFT works by applying a linear
% phase in the spectrum domain and is equivalent to CIRCSHIFT for integer
% values of argument s (to machine precision).
needtr = 0; if size(x,1) == 1; x = x(:); needtr = 1; end;
N = size(x,1);
r = floor(N/2)+1; f = ((1:N)-r)/(N/2);
p = exp(-j*s*pi*f)';
y = ifft(fft(x).*ifftshift(p)); if isreal(x); y = real(y); end;
if needtr; y = y.'; end;
нет никаких проблем в коде, когда я перекладывать меандр целочисленного сдвигом, но когда сдвиг нецелая выход страдает от значительных колебаний т.е.
s=[zeros(1,20) ones(1,20) zeros(1,20)];
b=fshift(s,3.5);
stem(b)
Как преодолеть эта проблема и есть ли какой-либо другой точный метод?
На самом деле я действительно не удивлен. Для меня это похоже на ожидаемый. Я не уверен, есть ли лучший способ сделать это, поэтому я не могу произнести про это. Однако, когда вы выполняете целочисленный сдвиг, у вас будут частотные бункеры как часть целого числа, то есть 'f * s = -3: 0.1: 2.9' для' s = 3', тогда вы можете быть уверены, что каждый образец ' x' (функция x) действительно соответствует bin. Однако, когда 's' является дробью (или реальным числом), бины становятся нечетными, дробными, что означает, что каждое значение в' x' не помещается в корзину. Это означает, что у вас будет утечка, и это то, что вы видите на графике. – patrik