#matlab #frequency-analysis
#matlab #частотный анализ
Вопрос:
Предполагая, что у меня есть сигнал x (t), смогу ли я обнаружить пик в частотном спектре (то есть частоту с наибольшим содержанием энергии) без использования FFT?
* PS — я видел что-то в вейвлет-разложении, называемое scale2freq(). Я просмотрел это на странице справки MATLAB, и это привело меня в замешательство. Имеет ли функция какое-либо отношение к частотным представлениям? Если да, как мне найти пиковые частоты с его помощью?
Ответ №1:
То, что вы, вероятно, хотите, называется алгоритмом определения высоты тона, и их существует множество во временной или частотной области (или в обоих случаях). Пожалуйста, найдите в Google «алгоритмы определения высоты тона» для получения дополнительной справки или проверьте выбранные ссылки для быстрого обзора:
- http://en.wikipedia.org/wiki/Pitch_detection_algorithm
- http://sound.eti.pg.gda.pl/student/eim/synteza/leszczyna/index_ang.htm
Во временной области простой подход заключается в поиске пиков автокорреляционной функции. Действительно, автокорреляция максимальна при t = 0, а затем следующие пики дают оценку основного периода:
ncount = 10000;
Ts = 0.0001; % Sampling period
t = (1:ncount) * Ts; % Sampling times
f = sin(2*pi*60*t) 0.1*sin(2*pi*200*t) 0.01 * randn(1, length(t)); % Signal
R = xcorr(f);
[~, locs] = findpeaks(R);
meanLag = Ts * mean(diff(locs));
pitch = 1 / meanLag; ===> Will be around 60 Hz
Этот подход подходит для очень простых сигналов, вам, вероятно, придется уточнить его в зависимости от ситуации (уровень шума, периодичность, многотональный и т. Д.). Более точные алгоритмы см. В приведенных выше ссылках.