【发布时间】:2014-03-16 20:31:26
【问题描述】:
我想通过非整数移位来移动向量,线性插值似乎不是很准确,所以我试图通过以下使用傅里叶变换的代码使用 sinc 插值。
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)确实匹配一个箱。但是,当s是分数(或实数)时,bin 变为非分数,这意味着x中的每个值都不适合bin。这意味着您将有泄漏,这就是您在图表中看到的。
标签: matlab fft interpolation shift