如何使用fft查找周期信号的最大频率?

时间:2019-01-15 15:34:41

标签: matlab max fft frequency

我正在尝试在Matlab中查找周期信号的最大频率,并且我知道当您将周期信号转换为频谱时,您只会得到delta函数,但是在生成的delta函数之间却得到了一些曲线。这是代码:

 t=[-0.02:10^-3:0.02];
 s=5.*(1+cos(2*pi*10*t)).*cos(2*pi*100*t);
 figure, subplot(211),    plot(t,s);
 y=fft(s);
 subplot(212), plot(t,y);

enter image description here

1 个答案:

答案 0 :(得分:1)

以下代码段可帮助您了解如何使用matlab中的 fft 获得频率频谱。

要记住的是:

  1. 您需要根据奈奎斯特准则确定一个采样频率,该频率应该足够高(您需要采样数量,至少要大于最高频率的两倍,否则我们将产生混叠)。这意味着,本例中的fs不能低于2 * 110。最好让它更高,以便看到更好的信号外观。

  2. 对于真实信号,您想要的是作为fft()函数输出的绝对值的平方得到的功率谱。包含相位的虚部应该只包含噪声。 (我没有在此处绘制阶段,但是您可以这样做检查一下自己。)

  3. 最后,我们需要使用fftshift来移位信号,以便获得零频率附近的镜像频谱。
  4. 峰值将在正确的频率上。如您所见,现在只考虑正频率,我们在100Hz处有一个最大的峰值,在100Hz +- 10Hz附近还有两个波瓣,分别是90Hz和110Hz。

显然,在您的示例中, 110Hz 是最高频率。

代码:

fs = 500; % sampling frequency - Should be high enough! Remember Nyquist!

 t=[-.2:1/fs:.2];
 s= 5.*(1+cos(2*pi*10*t)).*cos(2*pi*100*t);
 figure, subplot(311),    plot(t,s);

 n = length(s);
 y=fft(s);


 f = (0:n-1)*(fs/n); % frequency range
 power = abs(y).^2/n;
 subplot(312), plot(f, power);

 Y = fftshift(y);
 fshift = (-n/2:n/2-1)*(fs/n); % zero-centered frequency range

 powershift = abs(Y).^2/n;
 subplot(313), plot(fshift, powershift);

输出图:

  1. 第一个图是时域中的信号
  2. 频域中的信号
  3. 移位的fft信号 enter image description here