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

时间:2017-08-24 15:18:07

标签: r time signal-processing fft phase

我试图将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");

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

enter image description here

我做错了什么?

关于傅立叶相移定理的问题我可以找到:

real 2d signal in python

real 2d signal in matlab

real 1d signal in python

math question about what fourier shift does

但这些并不是复杂的信号。

1 个答案:

答案 0 :(得分:0)

<强>答案

正如史蒂夫在评论中所说,我检查了第6个元素的阶段。

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

因此,唯一具有幅度(至少比EPS高一个数量级)的元素确实具有我期望的相位。

TL; DR 问题中原始方法的结果已经正确,我们看到Gibbs现象滑动了。

只丢弃低幅度元素?

如果元素的阶段应为零将成为问题,我可以运行t.out[Mod(t.out)<epsfactor*.Machine$double.eps] = 0,在这种情况下,epsfactor必须10才能摆脱'0'数量元素。

在绘图之前添加该行会得到以下结果,这是我预期得到的结果。但是,在大多数情况下,“加扰”阶段实际上可能是准确的,我将在下面解释。

enter image description here

原始结果确实是正确的

仅将低幅度元素设置为0并不会使移位信号的相位更直观。这是我应用4.5样本移位的情节,相位仍然是“乱码”。

enter image description here

应用等值的傅立叶移位移位傅里叶插值

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

enter image description here

Gibbs Ringing

它恰好位于相位不良的不连续点,并且小的舍入误差可能在重建阶段引起大的误差。因此,与低幅度无关,但与输入矢量的定义不明确的傅里叶变换无关。这称为Gibbs Ringing,我可以使用带有filtering过滤器的低通gaussian来减少它。

enter image description here

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

symbolic approach in R to estimate fourier transform error

non integer signal shift by use of linear interpolation

downsampling complex signal

fourier interpolation application

estimating sub-sample shift between two signals using fourier transforms

estimating sub-sample shift between two signals without interpolation