将傅立叶移位定理应用于复杂信号

apply fourier shift theorem to complex signal

我正在尝试将 fourier phase shift theorem 应用于 R 中的复杂信号。但是,只有我的信号幅度如我所料发生变化。我认为应该可以将这个定理应用于复杂的信号,所以我可能在某处犯了错误。我的猜测是我计算的频率轴有误差。

如何正确地将傅立叶移位定理应用于复数信号(使用 R)?

i = complex(0,0,1)
t.in = (1+i)*matrix(c(1,0,0,0,0,0,0,0,0,0))
n.shift = 5

#the output of fft() has the mean / 0 frequency at the first element
#it then increases to the highest frequency, flips to negative frequencies
#and then increases again to the negative frequency closest to 0
N = length(t.in)
if (N%%2){#odd
  kmin = -(N-1)/2
  kmax = (N-1)/2
} else {#even
  kmin = -N/2
  kmax = N/2-1
  #center frequency negative, is that correct?
}

#create frequency axis for fft() output, no sampling frequency or sample duration needed
k = (kmin:kmax)
kflip = floor(N/2)
k = k[c((kflip+1):N,1:kflip)]
f = 2*pi*k/N

shiftterm = exp( -i*n.shift*f )

T.in = fft(t.in)
T.out = T.in*shiftterm
t.out = fft(T.out, inverse=T)/N

par(mfrow=c(2,2))
plot(Mod(t.in),col="green"); 
plot(Mod(t.out), col="red");
plot(Arg(t.in),col="green");
plot(Arg(t.out),col="red");

如您所见,信号的幅度发生了很好的偏移,但相位被扰乱了。我认为负频率是我的错误所在,但我看不到。

我做错了什么?


我能找到的关于傅里叶相移定理的题:

real 2d signal in python

real 2d signal in matlab

math question about what fourier shift does

但这些与复杂信号无关。

回答

正如史蒂夫在评论中建议的那样,我检查了第 6 个元素的相位。

> Arg(t.out)[6]
[1] 0.7853982
> Arg(t.in)[1]
[1] 0.7853982

所以唯一具有幅度(至少比 EPS 高一个数量级)的元素确实具有我预期的相位。

TL;DR 题中原方法的结果已经正确,我们看到吉布斯现象滑动


只丢弃低量级元素?

如果应该为零的元素相位会成为问题,我可以 运行 t.out[Mod(t.out)<epsfactor*.Machine$double.eps] = 0 在这种情况下 epsfactor 必须是 10 才能得到去掉“0”量级元素。

在绘图之前添加该行会得到以下结果,这是我事先期望得到的结果。然而,'scrambled' 阶段在大多数情况下可能实际上是准确的,我将在下面解释。

原来的结果果然正确

只是将低幅值元素设置为 0 并不能使移位信号的相位更直观。这是我应用 4.5 样本偏移的图,相位仍然是 'scrambled'.

应用傅里叶移位等同于降采样移位傅里叶插值

我突然想到,应用非整数个元素相移相当于对信号进行傅立叶插值,然后在原始元素之间的点对插值信号进行下采样。由于我用作输入的矢量是脉冲函数,因此傅里叶插值信号的表现不佳。然后应用傅里叶相移定理后的信号可以预期具有傅里叶插值信号所具有的精确相位,如下所示。

吉布斯振铃

它只是在相位表现不佳的不连续处,小的舍入误差可能会导致重建相位出现大的误差。因此,与低幅值并没有真正相关,而是与输入向量的定义不明确的傅里叶变换有关。这称为 Gibbs Ringing, I could use low-pass filtering with a gaussian 过滤器以减少它。

傅立叶插值和相移相关的问题

symbolic approach in R to estimate fourier transform error

non integer signal shift by use of linear interpolation

fourier interpolation application

estimating sub-sample shift between two signals using fourier transforms

estimating sub-sample shift between two signals without interpolation