fft相谱令人困惑!


9

一个非常简单的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)))); 

而且相位频谱变得非常疯狂:

在此处输入图片说明

问题:

  1. 在第一个图中,我希望看到仓700处的零相位,在此示例中,该相位对应于200的正频率。事实并非如此。其次,我不理解图1中图形的线性部分。我确实理解由于所谓的数字噪声而可能存在的相位分量,但是该噪声如何在相位上如此“线性”呢?

  2. 在第二个图中,为什么只删除一个样本会对相图产生如此大的影响?

  3. 我在这里做错什么吗?

Answers:


18

您没有做错任何事情,但是您也没有仔细考虑您应该看到的结果,这就是为什么您对结果感到惊讶的原因。对于问题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]

在此处输入图片说明

在此处输入图片说明

ķ/10000ķ999

对于第一个,然而,FFT的定义包括所述形式的频率为,而你的信号频率为,这是不形式的。结果,您的信号会因频谱泄漏而变宽,并且几乎在任何地方都不会为零。我不会评论相图的物理形式,但是我会说它承认是封闭的分析形式。ķ/10010ķ1000200/1000ķ/1001

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

附录:这是来自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]

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

11×11500×500一世-1个-一世映射为紫色。这就是我说相位谱是非位移不变的,因此不适合人类视觉理解时的意思。例如,在200个数据点的循环移位下,完全看不出该阶段发生了什么,因为它看起来像是静态的,但是输入信号并不比其他输入情况复杂。


0

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


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.