一个非常简单的MATLAB实验:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  


输出结果是:


现在,对上面的内容进行了较小的更改代码段;将时间减少了仅1个采样,如下所示:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 


相位频谱变得非常疯狂:



问题:


在第一个图中,我希望在bin 700处看到一个零相位,在本示例中该相位对应于200的正频率。
其次,我不了解图1中图形的线性部分。我确实理解由于所谓的数字噪声而可能存在的相位分量,但是那么噪声在相位上怎么会如此“线性”呢?
在第二个图中,为什么只去除一个样本会对相位图产生如此大的影响?
我在这里做错什么吗?


#1 楼

您没有做错任何事情,但是您也没有仔细考虑您应该看到的结果,这就是为什么您对结果感到惊讶的原因。对于问题1,您的猜想接近,但实际上情况有些倒退;是数字噪音困扰着您的第二个,而不是您的第一个。

图片可能会有所帮助。这是第一次试验的幅值和相位图:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]






一个:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]






那么这是怎么回事?第二个最容易解释。首先,第二个FFT的FFT除幅度谱中可见的两个峰值外,其他所有位置的振幅均为零。这是因为使用1000个数据点定义FFT会以$ k / leq k \ leq 999 $的形式返回$ k / 1000 $形式的频率,因此您的信号恰好落在频率仓上。结果,在其他998个点上,您的信号完全是由于浮点误差引起的机器噪声,因此相位频谱是无意义的,因为它实际上就是伪随机数的相位。

但是,第一个FFT的定义包含$ 0 \ leq k \ leq 1000 $形式的$ k / 1001 $频率,而您的信号频率为$ 200/1000 $,而不是$ k / 1001形式$。结果,您的信号会因频谱泄漏而变宽,并且几乎在任何地方都不为零。我不会评论相图的物理形式,但我会说它接受了封闭的分析形式。

总的来说,正是出于这个原因,我认为仅凭相位角图就无法传达信息。首先,您无法确定是在查看低振幅垃圾信号还是实际信号的相位,其次,它不是平移不变的,而且对于简单的输入来说,很容易产生令人困惑的图形。更好的是,如果您仍在寻找传达相位信息的东西,那是一张以相同的视觉方式同时描绘相位和幅度信息的图,例如将相位编码为色相而幅度编码为亮度的图。 br />
附录:这是Mathematica的两张图片,它们说明了我在上一段中所述的原理:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]










所有三个图像都是相同输入信号的2D傅里叶变换($ 11 \乘以11 $的平方用0补齐1的长度为$ 500 \乘以500 $),但是输入已循环旋转5、4、0和200个数据点。幅度谱(由像素亮度编码)相同,但相位谱完全不同!完成相位编码,以便1映射为红色,$ i $映射为绿色,$-1 $映射为青色,$-i $映射为紫色。这就是我说相位谱是非位移不变的,因此不适合人类视觉理解时的意思。例如,以200个数据点的循环移位,由于看起来像是静态的,因此完全不可能知道阶段中发生的事情,但是输入信号并不比其他输入情况复杂。

#2 楼

如果您想改变信号的频率或FFT长度,以使信号在FFT孔径中在正好周期性和不正好周期性之间变化,并且不想看到该信号变化的峰值幅度仓的相位,如果FFT孔径而不是起点,则可以将信号的初始相位参考到中心(对于生成的sin(t),将t = 0置于FFT阵列的中心)。

#3 楼

高斯波站点详细介绍了有关相位及其类似随机行为的部分:就像DumpsterDoofus所说的那样,只是浮点误差的问题