Одной из самых распространённых задач является выявление в спектре сигнала составляющих. Делается это для того чтобы отфильтровать сигнал. Ведь иногда по одной линии передаётся далеко не один сигнал, в то время как обрабатывать каждый из них нужно по разному.
Рассмотрим простейший случай такого анализа в 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Гц. Что подтверждается частотами, которые мы задали.
Отмечу ещё раз, что это идеальная ситуация, которой в жизни никогда не бывает. В настоящем сигнале постоянно присутствуют помехи с самыми разными частотами, что существенно зашумляет спектр и делает его менее наглядным.
Почему "Имеем 512 отсчётов"? Массив для времени состоит из 600 шагов, т.е. 601 точку отсчета. Я не прав?
Все верно, указав меньшую величины можно «обрезать» массив.
поясните эти две строчки. Что это и для чего
>> f = 1000*(0:256)/512;
>> plot(f,Pxx(1:257))
таким образом генерируюся отсчеты по оси частот и выводиться кривая графика