Matlab fft 在一个周期的正弦波 returns 阶段 -pi/2。为什么?

Matlab fft on one period of sinewave returns phase of -pi/2. Why?

在尝试理解快速傅里叶变换时,我遇到了相位问题。我已将其分解为下面的简单代码。计算 50Hz 正弦波的一个周期,并应用 fft 算法:

    fs = 1600;
    dt = 1/fs;
    L  = 32;      
    t=(0:L-1)*dt; 
    signal  = sin(t/0.02*2*pi); 

    Y = fft(signal);
    myAmplitude = abs(Y)/L *2 ;
    myAngle     = angle(Y);

    Amplitude_at_50Hz = myAmplitude(2);
    Phase_at_50Hz     = myAngle(2);

虽然幅度还可以,但我不明白相位结果。为什么我得到 -pi/2 ?由于只有一个纯正弦波,我预计相位为 0。我的数学错误,或者我对 Matlab 的使用,或者两者都有......(自制的 fft 给了我相同的结果。所以我想我是被我的数学绊倒了。)

这里有一个类似的post:MATLAB FFT Phase plot。但是,建议的 'unwrap' 命令无法解决我的问题。

谢谢并致以最诚挚的问候,

丹克

这是应该的。如果您使用余弦,您会发现相位为零。

暂时忽略数值傅里叶变换,取 sin(x) 的一个很好的旧傅里叶变换,我懒得走一遍,我们得到一对纯虚构的增量。

至于一个直观的原因,回想一下,离散傅立叶变换是在以您正在计算的 bin 的 angular 频率转动时,对复平面中曲线上的一堆点进行平均对应于样本的振幅。如果您在以其自己的频率转动时对正弦曲线进行采样,则您得到的形状是一个以虚轴为中心的圆(见下文)。其平均值当然会在虚轴上。

用 wolfram alpha 制作的图。

正弦函数的傅立叶变换,例如 A*sin((2*pi*f)*t),其中 f 是频率,将在频域中产生 2 个幅度为 A/2 的脉冲 +f和 -f 其中关联的阶段分别是 -pi/2 和 pi/2。 你可以在这里看看它的证明: http://mathworld.wolfram.com/FourierTransformSine.html

所以代码运行良好。

FFT 相位角为零的默认波形是余弦波,它在 FFT window 中开始和结束于 1.0(不是正弦波在 FFT window 中开始和结束于0.0,或其零交叉点。)这是因为常见的命名法是将 FFT 基向量(复指数)的余弦函数分量称为 "real" 分量。正弦函数基分量称为 "imaginary",因此推断出非零复相位。