为了探索相位对 DFT 输出的影响,我还是用原来的输入函数,但是每次只修改正弦曲线的相位:
\[f(t)=sin(4t \times 2\pi + r)\]
上面的 \(r\) 即为每次设置的相位值。
为了方便对比实验结果,有必要回顾一下之前的 DFT 输出:
第一次,我们加上一个比较小的相位偏移:\(0.25\pi\),即 45 度角对应的弧度。
这一次实数部分不在全为 0 了,这推翻了之前的结论,之前我们一直以为实数基本没有什么意义,以为他们都是 0。现在看来,实数已经不能随便忽略了。
而且,这一次输出的实数和虚数是相同的。和相位 0 的输出对比,只有尖尖的高度发生了变化,不过现在还不容易看出了高度上的规律。不着急,我们再去修改相位看看。
这一次,修改相位为 90 度:
哈——这一次换成虚数全为 0 了。
接着,用 180 度相位:
180 相位几乎和 0 相位一模一样,只是尖尖的正负相反。
现在来看,尖尖的高度似乎在随着相位的变化,在虚数和实数部分之间‘游荡’:45 度相位时,高度的有一部分跑到了实数部分,相位再偏移 45 度时,所有高度都跑到实数去了。那再偏移个 90 度呢?高度又回到虚数了,只是这次是正的。
为了直观看出实数和虚数的关系,不能再把实数和虚数放到单独的图表里了。所以下面我就以实数为横轴,虚数为纵轴,重新绘制四个不同相位的输出:
相位(度) | 输出 |
---|---|
0 | |
45 | |
90 | |
180 |
注意在原点位置实际有很多个数据,只是都重合了。而且只统计前 50 个输出数据(回顾前面,输出存在对称关系)。
可以看到,随着相位的变化,尖尖实际在逆时针旋转,而且旋转的角度就是相位。所以现在看来,要表达输入函数的完整特性(频率、振幅和相位),必须得用完整的复数才行。
奇怪的是,为什么 0 相位的时候,复数在虚数轴的负半轴。一般描述角度的时候,都以横轴的正半轴为准。而现在 0 相位的时候,角度是 -90 度,或者说 0 度时相位是 90 度。这是因为输入函数是个正弦函数,而正弦函数偏移 90 度相位,实际就变成了一个余弦函数了:\(cos(x) = sin(x + \pi / 2)\)。
最后,可以总结:对于 N 个全是实数输入的 DFT 的前一半输出,每个复数实际都代表一个余弦函数。而且其频率、振幅和相位都可以从输出的复数计算出来。
让 \(C_n\) 为第 \(n\) 个输出(为复数),这个输出代表的余弦函数的频率 \(f\)、振幅 \(a\) 和相位 \(p\) 可以表示为:
\[f = n\]
\[a = \frac{2|C_n|}{N}\]
\[p = arg(C_n)\]
\(|C_n|\) 代表复数的模,\(arg\) 代表取复数的幅角(和实数轴正方向的夹角)。