在matlab中通过非整数移位移动向量的元素

时间:2014-02-17 13:52:28

标签: matlab fft interpolation shift

我想通过非整数移位移动矢量,线性插值似乎不是很准确所以我试图通过以下使用傅里叶变换的代码使用 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)

如何克服这个问题,还有其他准确的方法吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

假设您正在转移3.5。弄清楚过采样值是什么(即什么值会将转换变为整数 - 在这种情况下它是2)。

ov = 2;
a = 3.5*ov;
y = downsample(circshift(interp(s,2).', -a),ov);

这仍然有一些边缘响起,但比你的sinc方法要少得多。我不确定这是否是由于gibbs现象,因为你基本上是截断或泄漏,如评论中所述。

答案 1 :(得分:0)

您可以使用fourier shift theorem执行此操作,但添加了过滤功能。我问了一个类似的问题here。结果看起来“错误”的原因是因为输入向量不连续。你得到的结果确实是'正确'(或者至少是 true )。

您看到的问题称为Gibbs Ringing。你可以通过使用低阶滤波器(this维基百科链接解释解决方案很好)使其不那么极端,它的阶跃响应没有振铃。尝试使用和不使用gaussian filter的代码。这种人工制品经常出现在MRI成像(以及许多其他信号处理情况)中,有时通过过滤得到缓解。