Вашу задачу ИМХО лучше решить немного иначе...
Чтобы не делать лишнюю работу по фильтрации предлагаю сделать следующее:
1. Сделать децимацию входного сигнала (см. приложение
). Поскольку такой частоты дискретизации (50 кГц) не нужно для 50 Гц. Вполне достаточно 500 Гц. Т.е. нужно взять каждый сотый входной отсчёт (собственно, децимация). Просто так их брать нельзя, могут возникнуть "зеркальные" частоты благодаря эфекту "элайзинга" (aliasing). Чтобы от него избавится, нужно профильтровать антиэлайзинг фильтром. Этой фильтрацию можно свести к нахождению среднего (в нашем случае из 100 отсчётов).
В случае, если вы уверены в отсутствии во входном сигнале частот (аналоговый ФНЧ на 250 Гц стоит перед АЦП ), больше чем новая fs/2, то достаточно просто взять каждый 100-ый отсчёт.
Без децимации, ИМХО, здесь не обойтись: слишком много памяти и ресурсов потребуется для обработки.
2. Реализовать схему квадратурной обработки (см. приложение
).
Все операции ведуться для окна длиной в 10 отсчётов (при частоте дискретизации 500 Гц), которое идёт с перекрытием (двигается по одному отсчёту вдоль входной последовательности). Хотя можно сделать и больше, всё зависит от "степени реалтайма обработки".
X на схеме обозначает поэлементное умножение.
Каждый из 2-ух сигналов проходит такую обработку, определяется начальная фаза, а затем тупо 2 числа вычитаются.
Нужно, конечно, сделать atan, но это затабличить можно.
В общем, пойдёт такая схема, или Вы настаиваете на полосовом фильтре? )
PS
*ой, кажись в расчёте длины окна обшибся для квадратурной обработки. T - количество отсчётов окна.
Оно должно равняться двум периодам опорной частоты, т.е. 2*fs/f0 = 200 отсчётов, при fs = 500 Гц.
Сообщение отредактировал Vasiliy Rufitskiy - Oct 24 2007, 15:26