[英]Finding the phase from FFT on MATLAB
我知道我的信号的基本频率,因此我也知道谐波的其他频率,我使用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)')
通常,您的傅立叶变换是复杂的。 因此,如果您想知道某个频率的相位,可以使用tan(ImaginaryPart(Sample)/ RealPart(Sample))进行计算。 这可以通过使用angle()完成。 就你而言
1-计算fft()
2-为FFT的所有样本或您感兴趣的样本(即基频/谐波的样本)计算angle()
编辑:一个例子是
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。
请注意,如果您的基本频率在fft长度上不是完全周期性的,则由于fft两端之间的不连续性(或由于矩形窗卷积),结果相位(atan2(xi,xr))将在相邻仓之间翻转符号),使相位插值变得有趣。 因此,您可能希望通过执行fftshift(通过fft结果中的前/后/移位/旋转元素或后置,通过翻转符号)来将相位估计重新引用到fft的中心,从而使相位插值看起来更加合理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.