Гильбертово преобразование и мгновенная частота

Гильбертово преобразование оценивает мгновенную частоту сигнала для сигналов монокомпонента только. Сигнал монокомпонента описан в плоскости частоты времени одним "гребнем". Набор сигналов монокомпонента включает одну синусоиды и сигналы как щебеты.

Сгенерируйте щебет, выбранный на уровне 1 кГц в течение двух секунд. Задайте щебет, таким образом, его частота - первоначально 100 Гц и увеличивается до 200 Гц после одной секунды.

fs = 1000;
t = 0:1/fs:2-1/fs;
y = chirp(t,100,1,200);

Оцените спектрограмму щебета с помощью кратковременного преобразования Фурье, реализованного в функции pspectrum. Сигнал хорошо описан одной пиковой частотой в каждом моменте времени.

pspectrum(y,fs,'spectrogram')

Вычислите аналитический сигнал и дифференцируйте его фазу, чтобы измерить мгновенную частоту. Масштабированная производная приводит к значимой оценке.

z = hilbert(y);
instfrq = fs/(2*pi)*diff(unwrap(angle(z)));

clf
plot(t(2:end),instfrq)
ylim([0 fs/2])

Функция instfreq вычисляет и отображает мгновенную частоту за один шаг.

instfreq(y,fs,'Method','hilbert')

Метод перестал работать, когда сигнал не монокомпонента.

Сгенерируйте сумму двух синусоид частот 60 Гц и 90 Гц, выбранных на уровне 1 023 Гц в течение двух секунд. Вычислите и постройте спектрограмму. Каждый момент времени показывает присутствие этих двух компонентов.

fs = 1023;
t = 0:1/fs:2-1/fs;
x = sin(2*pi*60*t)+sin(2*pi*90*t);

pspectrum(x,fs,'spectrogram')
yticks([60 90])

Вычислите аналитический сигнал и дифференцируйте его фазу. Увеличьте масштаб области, заключающей частоты синусоид. Аналитический сигнал предсказывает мгновенную частоту, которая является средним значением частот синусоиды.

z = hilbert(x);
instfrq = fs/(2*pi)*diff(unwrap(angle(z)));

plot(t(2:end),instfrq)
ylim([60 90])
xlabel('Time (s)')
ylabel('Frequency (Hz)')

Функция instfreq также оценивает среднее значение.

instfreq(x,fs,'Method','hilbert')

Чтобы оценить обе частоты как функции времени, используйте spectrogram, чтобы найти степень спектральной плотностью и tfridge, чтобы отследить эти два гребня. В tfridge задайте штраф за изменение частоты как 0,1.

[s,f,tt] = pspectrum(x,fs,'spectrogram');

numcomp = 2;
[fridge,~,lr] = tfridge(s,f,0.1,'NumRidges',numcomp);

pspectrum(x,fs,'spectrogram')
hold on
plot3(tt,fridge,abs(s(lr)),'LineWidth',4)
hold off
yticks([60 90])

Смотрите также

|

Похожие темы