1

我正在测试一个正弦信号和一个余弦信号的 fft 的相位输出。下面的脚本创建信号并对它们执行 FFT。幅度低于阈值的 bin 将相位谱归零,因为我只对信号的相位感兴趣。

% 10khz 10 second long time interval
t = 0:1 / 10000:10;

%1khz cos
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);

%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

%magnitude and phases of ffts
CA = abs(C); %cos magnitude
SA = abs(S); %sin magnitude

Cthresh = max(CA) * 0.5;
Sthresh = max(SA) * 0.5;

%find all indeces below the threshold
Crange = find(CA < Cthresh);
Srange = find(SA < Sthresh);

%set the indeces below the threshold to 0 - phase will be meaningless for
%noise values
CP = angle(C);
CP(Crange) = 0;
SP = angle(S);
SP(Srange) = 0;

如果您绘制 CP - cos 的相位 - 您将在与 cos 信号频率相对应的 bin 中获得 0.3142 的相位,而在其他地方则为零。这是 pi/10。我期待得到pi。为什么是这样?

如果你绘制 SP,你会得到 1.2566 的值。我期待得到 pi/2 或 1.5708。预期值的 80%。是什么导致了这些错误?

4

2 回答 2

1

如果您的输入信号在 FFT 孔径长度(完整周期的精确整数)中不是完全周期性的,则正弦曲线将在 FFT 孔径的两端不连续。因此,您将获得一个相位,该相位是 FFT 输入向量两端的两个不同相位的平均值。

如果您想要更合理的相位,请将正弦曲线的相位参考 FFT 输入向量的中心,并在 FFT 之前进行 fft 移位。这将在零相位参考位置产生连续的正弦曲线,具有单相而不是奇怪的平均值。

另请注意,matlab 可能会将相位引用到采样正弦曲线中的第二个点,例如 vectorElement[i=1],而不是第一个,vectorElement[i=0]。对于周期 = 20 个样本的正弦曲线,这将具有 pi/10 的相位。

于 2011-10-31T16:53:57.570 回答
0

您遇到的问题正是 hotpaw2 所说的。您在 t 中有 100001 个样本,因此您没有完美的周期性信号,因此您有泄漏。这意味着您从隐式矩形窗口中获得了与您的解决方案卷积的 sin()/sin() 函数。这就是改变你相位的原因。

相反,如果您尝试以下操作:

t = 0:1 / 10000:9.9999;
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);
%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

你会发现余弦的相位为零(这是你所期望的)并且正弦的相位是 pi/2。

在时域中执行线性移位(使用 fftshift)只会在频域中引入线性相位项,不会解决原始问题。

在实践中,如果要在频域中检查信号,则应该应用加窗,而不是试图精确地设置序列的长度以匹配信号的周期。在这种情况下,您确实应该确保您的信号适当对齐,以便窗口衰减端点,从而消除不连续性。这具有加宽 FFT 主瓣的效果,但它也控制了泄漏。

于 2016-09-14T16:26:22.697 回答