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