Спектральный анализ сигнала в Matlab

Одной из самых распространённых задач является выявление в спектре сигнала составляющих. Делается это для того чтобы отфильтровать сигнал. Ведь иногда по одной линии передаётся далеко не один сигнал, в то время как обрабатывать каждый из них нужно по разному.

Рассмотрим простейший случай такого анализа в Matlab.

Сформируем временную сетку:

>> t = 0:0.001:0.6;

Теперь зададим сигнал для тренировок:

>> x = sin(2*pi*50*t) + sin(2*pi*120*t);

Изображение сигнала

Как видите это всего навсего 2 синусоиды. одна на частоте 50Гц, другая на 120Гц. В жизни такого конечно же нет. Это всего навсего математическая абстракция, которая поможет понять как всё происходит.

Выведем сигнал для наглядности:

>> plot(1000*t(1:50),x(1:50))
>> title('Сигнал')
>> xlabel('Время (мс)')

Теперь делаем преобразование Фурье для нашего сигнала.

Имеем 512 отсчётов. Примем это во внимание для нахождения цифрового преобразования:

>> X=fft(x,512);

Домножим на комплексно сопряженное и нормализуем:

>> Pxx=X.*conj(X)/512;

Теперь задаём сетку частот и выводим спектр:

>> f = 1000*(0:256)/512;
>> plot(f,Pxx(1:257))
>> title('Спектр сигнала');
>> xlabel('Частота (Гц)');

Изображение спектра

Как видно на рисунке, в спектре имеется 2 выброса на частотах 50 и 120Гц. Что подтверждается частотами, которые мы задали.

Отмечу ещё раз, что это идеальная ситуация, которой в жизни никогда не бывает. В настоящем сигнале постоянно присутствуют помехи с самыми разными частотами, что существенно зашумляет спектр и делает его менее наглядным.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий

  1. Николай

    Почему "Имеем 512 отсчётов"? Массив для времени состоит из 600 шагов, т.е. 601 точку отсчета. Я не прав?

    Ответить
  2. lamazavr

    Все верно, указав меньшую величины можно «обрезать» массив.

    Ответить
  3. Андрей

    поясните эти две строчки. Что это и для чего

    >> f = 1000*(0:256)/512;

    >> plot(f,Pxx(1:257))

    Ответить
    1. lamazavr

      таким образом генерируюся отсчеты по оси частот и выводиться кривая графика

      Ответить