基于MATLAB的FFT相位提取

基于MATLAB的FFT相位提取,matlab,fft,Matlab,Fft,我知道信号的基频,因此我也知道谐波的其他频率,我使用FFT命令计算前5个谐波(我知道它们的频率)。我是否可以用这些可用信息找到阶段 请注意,我不能确定我的信号只有一个周期,因此需要通过已知频率值计算相位 代码似乎正在运行: L = length(te(1,:)); % Length of signal x = te(1,:); NFFT = 2^nextpow2(L); % Next power of 2 from length o

我知道信号的基频,因此我也知道谐波的其他频率,我使用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(imaginalypart(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。

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

谢谢您的快速回复,但如何计算角度?我在上面编辑了我的帖子。您的FFT应该包含复数。然后您可以计算每个复数的角度。