3

Мне нужен алгоритм для определения частоты и фазы чистого синусоидального сигнала. Частота входного сигнала изменяется от 0 до 100 Гц.Простой и эффективный алгоритм для определения частоты и фазы синусоидального сигнала

Значение сигнала фиксируется с частотой 20 кГц (поэтому я получаю 20 000 значений в секунду) - это задано и не может быть изменено. Мне нужно определить частоту и фазу этого входного сигнала и использовать PWM для генерации прерываний MCU с той же частотой, что и входной сигнал.

Может ли кто-нибудь предложить, какой алгоритм использовать, чтобы сделать это простым и эффективным? Может быть, алгоритм Герцеля?

+1

http://dsp.stackexchange.com или http://electronics.stackexchange.com/ – user2485710

+0

Быстрое преобразование Фурье. –

+2

@HotLicks Предлагая БПФ для такой простой проблемы, это не очень хороший совет. Это похоже на предложение алгоритмов грубой силы для других простых задач. –

ответ

3

Алгоритм Goertzel хорош для обнаружения заданной частоты (или нескольких частот).
Чтобы найти неизвестную частоту синусоидальной волны, вы можете использовать Fourier transform.

Пик с наибольшей амплитудой соответствует синусоидальной частоте, а фаза этих гармоник - к ее фазе.

Фаза, полученная из результата FT, может быть восприимчивой к шуму. Более надежный подход - использование кросс-корреляции с нулевой фазовой синусоидальной волной (с той же частотой) для получения сдвига фазы.

Существует много реализаций FFT на C. Быстрое является fftw.org (переносимость для любого компилятора C), но я сомневаюсь, что вам действительно нужна такая сложная библиотека для микроконтроллера. Возьмите любые 40 строк кода хорошего исполнения Кули-Туки, например this one

P.S. Если ваш сигнал действительно идеальный синус с одиночной частотой без значительного шума, то метод ноль-пересечения, предложенный в параллельной теме, будет лучше.

+1

тем временем этот вопрос получил перекрестный пост/дубликат http://dsp.stackexchange.com/questions/19057/simple-and-efficient-algorithm-to-detect-frequency-and-phase-of-a-sine- signal – user2485710

+0

@ user2485710 Когда я начал писать свой ответ, не было ни вашего комментария к перенаправлению, ни перекрестного дублирования вопроса :-) – MBo

+0

@MBo Спасибо! Вы знаете какую-либо конкретную быструю и простую реализацию для моего случая? – jurij