Похоже, вы уже понимаете, как получить спектр БПФ, верно?
http://flic.kr/p/7notw6
Но если вы ищете фундаментальную (зеленая точка), вы не можете просто использовать самый высокий пик. Это не обязательно фундаментально. В моем примере фактическая частота составляет 100 Гц, но самый высокий пик составляет 300 Гц.
Есть много разных способов найти истинный фундамент, и каждый работает лучше в разных контекстах. Один поток на comp.dsp упоминает «БПФ, кепстр, авто / взаимная корреляция, AMDF / ASDF».
Для простого примера каждая из красных точек находится на расстоянии 100 Гц от своего соседа, поэтому, если вы использовали алгоритм нахождения пика, а затем усреднили вместе расстояние между каждой гармоникой и следующей, вы найдете основную, но это потерпит неудачу, если какой-либо из пиков будет пропущен или включены дополнительные пики, или если сигнал будет симметричным и содержит только нечетные гармоники (1f, 3f, 5f). Вам нужно будет найти режим и затем выбросить выбросы, а затем усреднить. Это, вероятно, подверженный ошибкам метод.
Вы также можете выполнить автокорреляцию исходного сигнала. Концептуально это означает скольжение копии формы волны за собой и поиск задержки, с которой он лучше всего согласуется с самим собой (что будет одним полным циклом). В обычной реализации мы используем БПФ, чтобы ускорить его . Автокорреляция в основном
- ОБПФ (FFT (сигнал) ⋅FFT (сигнал) *)
где * означает комплексное сопряжение, или обращение времени. В Python, например :
correlation = fftconvolve(sig, sig[::-1], mode='full')
и источник для fftconvolve () относительно прост: https://github.com/scipy/scipy/blob/master/scipy/signal/signaltools.py#L133