【问题标题】:Finding the phase from FFT on MATLAB在 MATLAB 上从 FFT 中找到相位
【发布时间】:2014-02-18 13:53:16
【问题描述】:

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

【问题讨论】:

    标签: matlab fft


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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 应包含复数。然后你可以计算每个复数的角度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2014-10-09
      • 1970-01-01
      • 2012-02-08
      • 2021-05-25
      • 2013-03-10
      • 2013-11-23
      相关资源
      最近更新 更多