1. Требовалось измерить изменение скорости звука в некотором объеме. Для этого была собрана схема на баз dsPIC33F (далее МК). Генератор звуковых сигналов состоит из DDS AD9834 и усилителя мощности. Клоки на МК и на DDS приходят от одного источника, т.е. у них единая точка отсчета времени. Синусоидальный сигнал с DDS идет на динамик, который возбуждает звуковые колебание в интересующем объеме, колебания принимаются микрофоном, затем усилитель, фильтр и АЦП на борту МК. Частота звуковых сигналов в районе нескольких кГц. В МК заранее сформированы 2 массива значений синуса и косинуса, с количеством отсчетов равным количеству выборок на период принимаемого сигнала. Для того, чтобы жестко привязать выборки к началу периода посылаемого сигнала от DDS на МК заведен сигнал прямоугольной формы, при «+» полуволне он имеет знач-е 1, а при «-» 0. От этого сигнала настроено прерывание.
Ну так вот, затем вычисляю корреляцию принимаемого сигнала s(n) с таблицами синуса и косинуса (SUMn – это сумма по n):
Re = SUMn( s(n) * cos(n) )
Im = SUMn( s(n) * sin(n) )
это сделано на ассемблере, чтобы побыстрей.
Затем, вычисляю сдвиг фазы в радианах с помощью библиотечной ф-ции:
Arg = atanf(Im, Re)
Сдвиг фазы в микросекундах
deltaT = Tus * 180 *Arg / PI
Tus – период возбуждающего сигнала в мкс.
PI это Пи

Ф-ция atanf возвращает значения в диапазоне от –PI до +PI. А фаза принимаемого сигнала может уменьшаться или возрастать на несколько периодов. Если скорость изменения фазы не превышает PI за период, это не проблема, у меня предусмотрена переменная, накапливающая значение фазы и суммирующаяся с результатом. Но иногда фаза меняется быстрей. Хотя это происходит редко и в ходе нормальной эксплуатации изделия вообще происходить не должно, к тому же в изделии предусмотрена специальная кнопка, сбрасывающая накопленную ошибку, если таковая возникнет, все-таки на душе как-то не спокойно. Вот и решил обратиться к многоуважаемым матерым ЦОСникам DSPшникам – поделитесь соображениями, как решить эту задачу поизящней.
Это был первый вопрос, теперь второй.
2. Сначала я пытался вычислить изменение скорости звука посылая в звуковой тракт одиночный импульс, принимал его, и, имея в памяти МК образ (набор отсчетов), этого импульса, искал максимум ф-ции взаимной корреляции принимаемого в течении некоторого времени сигнала с этим образом. Скорость АЦП на борту 1Мвыб, мне нужно принимать 2 одинаковых канала, соответственно 500 квыб., отсюда точность определения времени пробега 200нс (или +- 100). И это если брать выборки с максимальной частотой, а памяти в dsPICе в обрез. Заказчик прости «чем точней тем лучше», и 200нс его не устраивает. Применил изложенный выше способ – получилось значительно точней, даже при кол-ве выборок на период порядка 80. По крайней мере, создалось впечатление, что получилось точней. Результат-то получается не в виде номера отсчета, т.е. целочисленного значения, как при поиске максимума в ф-ции взаимной корреляции, а аргумент atanf() в виде числа с плавающей точкой. Так вот собственно вопрос – как оценить точность метода, описанного в первом вопросе?