在MATLAB上从FFT中寻找相位

时间:2014-02-18 13:53:17

标签: matlab fft

我知道信号的基频,因此我也知道谐波的其他频率,我使用FFT命令计算前5个谐波(我知道它们的频率)。我有可能找到这个可用信息的阶段吗?

请注意我无法确定我的信号只有一个周期,因此需要通过已知频率值计算相位。


代码似乎正在运作:

 L = length(te(1,:));               % Length of signal
 x = te(1,:); 
 NFFT = 2^nextpow2(L);              % Next power of 2 from length of y
 Y = fft(x,NFFT)/L;
 f = linspace(1,5,5);   
 Y(1) = [];                          % First Value is a sum of all harmonics
 figure(1);
 bar(f,2*abs(Y(1:5)), 'red') 
 title('Transmission Error Harmonics')
 xlabel('Harmonic')
 ylabel('|Y(f)|')
 figure(2);
 bar(f,(angle(Y(1:5))))
 title('Transmission Error Phase')
 xlabel('Harminic')
 ylabel('Angle (radians)')

2 个答案:

答案 0 :(得分:1)

一般来说,你的傅里叶变换是复杂的。因此,如果您想知道某个频率的相位,则用tan(ImaginaryPart(Sample)/ RealPart(Sample))计算它。这可以通过使用angle()来完成。 在你的情况下你

1-计算fft()

2-计算所有FFT样本或您感兴趣的样本的角度()(即基频/谐波样本)

编辑:一个例子是

t = [0 0 0 1 0 0 0];
f = fft(t);
phase = angle(f);
phase = angle(f(3)); % If you are interested in the phase of only one frequency

EDIT2:你不应该将一个真正有价值的光谱[基本上是abs(fft())]与一个复杂的傅里叶变换混合[只有fft()]。但正如你写的那样,你自己计算了fft,我猜你有复杂数字的'原始'FFT。

答案 1 :(得分:1)

请注意,如果您的基频在fft长度上不是完全周期性的,那么由于fft末端之间的不连续性(或由于fft,因此得到的相位(atan2(xi,xr))将在相邻的bin之间翻转符号。矩形窗口卷积),使相位插值有趣。因此,您可能希望通过执行ffthift(前置,通过移位/旋转元素,或通过翻转fft结果中的符号来重新引用相位估计到fft的中心),使相位插值看起来更合理。 / p>