我想移動一個向量非整數移位,線性插值似乎不是很準確,所以我試圖用sinc插值由以下使用傅里葉變換的代碼。在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)
如何克服這個問題,有沒有其他準確的方法?
其實我並不感到驚訝。對我來說,它看起來像預期的。我不確定是否有更好的方法來做到這一點,因爲我不能對此做出發音。然而,當你做一個整數移位時,你將有一個整數部分的頻率點,也就是's = 3的'f * s = -3:0.1:2.9',那麼你可以確定每個樣本' x'(函數x)確實匹配一個bin。然而,當's'是一個分數(或一個實數)時,分箱變爲非分數,這意味着'x'中的每個值都不適合分箱。這意味着你將有泄漏,這就是你在圖表中看到的。 – patrik