Как я могу использовать FFT, чтобы найти максимальную частоту периодического сигнала? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь найти максимальную частоту периодического сигнала в Matlab, и, как я знаю, когда вы преобразуете периодический сигнал в частотный спектр, вы получаете только дельта-функции, однако я получаю несколько кривых между полученными дельта-функциями. Вот код:

 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 голосов
/ 15 января 2019

Вот фрагмент кода, который поможет вам понять, как получить частотный спектр, используя fft в matlab.

Что нужно помнить:

  1. Вам необходимо выбрать частоту дискретизации, которая должна быть достаточно высокой, согласно критерию Найквиста (вам нужно количество выборок, по крайней мере, более чем в два раза выше самой высокой частоты, иначе у нас будет псевдоним). Это означает, что fs в этом примере не может быть ниже 2 * 110. Лучше иметь его еще выше, чтобы лучше видеть сигнал.

  2. Для реального сигнала вам нужен спектр мощности, полученный в виде квадрата абсолютного значения выходного сигнала функции fft (). Мнимая часть, которая содержит фазу, не должна содержать ничего, кроме шума. (Я не планировал фазу здесь, но вы можете сделать это, чтобы проверить сами.)

  3. Наконец, нам нужно использовать fftshift, чтобы сместить сигнал так, чтобы мы получили зеркальный спектр вокруг нулевой частоты.
  4. Пики будут на правильных частотах. Теперь, рассматривая только положительные частоты, как вы можете видеть, у нас самый большой пик при 100 Гц и еще два пика около 100Hz +- 10Hz, то есть 90 Гц и 110 Гц.

Очевидно, 110 Гц - самая высокая частота, в вашем примере.

код:

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. Смещенный сигнал БПФ enter image description here
...