我试图将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");
正如您所看到的,信号的幅度很好地移动了,但相位被扰乱了。我认为负频率是我的错误所在,但我看不到它。
我做错了什么?
关于傅立叶相移定理的问题我可以找到:
math question about what fourier shift does
但这些并不是复杂的信号。
答案 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'数量元素。
在绘图之前添加该行会得到以下结果,这是我预期得到的结果。但是,在大多数情况下,“加扰”阶段实际上可能是准确的,我将在下面解释。
原始结果确实是正确的
仅将低幅度元素设置为0
并不会使移位信号的相位更直观。这是我应用4.5样本移位的情节,相位仍然是“乱码”。
应用等值的傅立叶移位移位傅里叶插值
我想到,应用非整数个元素的相移相当于对信号进行傅立叶内插,然后在原始元素之间的点处对内插信号进行下采样。由于用作输入的矢量是脉冲函数,因此傅立叶内插信号表现不佳。那么应用傅里叶相移定理后的信号可以预期恰好具有傅立叶内插信号所具有的相位,如下所示。
Gibbs Ringing
它恰好位于相位不良的不连续点,并且小的舍入误差可能在重建阶段引起大的误差。因此,与低幅度无关,但与输入矢量的定义不明确的傅里叶变换无关。这称为Gibbs Ringing,我可以使用带有filtering过滤器的低通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