Предыстория и введение
Как уже описывалось в предыдущей статье, в процессе переделки игрушки-осциллографа DSO138 возникла идея в DSO303 попробовать фокус с удвоением частоты дискретизации. В самом деле для STM32F303 теоретически максимально достижимая скорость дискретизации с точки зрения входа АЦП, а это определяется минимальным временем открытия УВХ, которое в нашем случае 1,5 такта х (1 / 72 МГц), или примерно 20,8 наносекунд, что дает 48 MSPS (миллионов отсчетов в секунду). Однако при параллельной работе 4-х АЦП на 6 МГц получается достичь только 24 MSPS из-за ограниченного быстродействия АЦП.
Представим себе, что мы рассматриваем правильно-периодический сигнал, который при этом еще и постоянен, т.е. не испытывает флуктуаций по частоте и амплитуде во времени. Возможно ли как-то оцифровывать его не в один, а в несколько проходов, тем самым увеличив эффективную частоту выборки?
Оцифровка в три прохода – идея
Обратимся к Рис.1., на котором собственно и отображена идея многопроходной оцифровки. Предположим, что каждый АЦП запускается своим сигналом от таймера, который работает с удвоенной тактовой частотой микроконтроллера и АЦП (для 32F303 – 72 и 144 МГц соответственно). При этом цикл оцифровки занимает 12 тактов АЦП (24 такта таймера) при разрешении 10 бит. Поделим этот цикл на 8 слотов по 3 такта таймера (1,5 такта АЦП), что как раз соответствует времени открытия УВХ.
Каналы АЦП 1 и АЦП 3 сделаем референсными, они будут срабатывать всегда в одно и то же время цикла, а время срабатывания каналов АЦП 2 и АЦП 4 будем двигать внутри цикла в зависимости от прохода. Вот собственно и все, после выполнения 3-х проходов такой оцифровки мы получим конечный результат.
«Однако», - скажет внимательный читатель: «но позвольте, почему вы предполагаете, что ваш цикл оцифровки в следующем проходе будет находиться в неизменном положении по отношению к сигналу? Ведь старт процесса оцифровки происходит в случайный момент времени…». И, конечно же, он будет совершенно прав.
Но для этого у нас есть два референсных канала из четырех имеющихся, и время, чтобы запускать процесс оцифровки неограниченное количество раз. Надо просто запускать очередной проход много раз до того момента, когда положение цикла оцифровки относительно сигнала не окажется достаточно близким к тому, которое было при первом проходе, проверяя корреляцию по референсным каналам. Таким образом наш процесс оцифровки будет выглядеть следующим образом:
Оцифровали и записали данные Прохода 1;
Оцифровали данные Прохода 2;
Посчитали корреляцию референсных каналов, если она достаточно хорошая, то записали данные Прохода 2, если нет, то повторяем п.2;
Оцифровали данные Прохода 3;
Посчитали корреляцию, если все хорошо, то записали данные и приступили к итоговой сборке и обработке данных оцифровки и отображению полученной картинки, если нет, то повторяем оцифровку Прохода 3.
Результаты
Да, в итоге иногда процесс занимает довольно длительное время, и оцифровка может повторяться десятки тысяч раз, прежде чем достигается результат; да, далеко не для всех сигналов такой способ подходит; да, результат бывает не без искусственных артефактов как на Рис.2., но достаточно часто получается и как на Рис.3. На обеих рисунках на вход подан меандр частотой 1 МГц.
При этом хуже всего результаты получаются для сигналов с быстрыми изменениями формы и резкими фронтами (меандр), а наилучшие результаты наблюдаются для плавных сигналов (синусоида). Для иллюстрации на Рис.4 приведена также картинка синусоидального сигнала частотой 200 кГц. Сигнал там «немножко» шумный, с небольшими помехами, что сразу же приводит, к сожалению, к довольно большим искажениям в виде такой своеобразной "бороды", так как одним из условий корректной картинки при таком способе оцифровки, которое было уже упомянуто выше, является постоянство и отсутствие флуктуаций сигнала во времени, что эта картинка также и иллюстрирует.
Период сигнала для правильной работы алгоритма корреляции теоретически не может быть меньше цикла оцифровки, практически приемлемый результат получается только при периодах сигнала больших 3-х циклов, т.е. >500 наносекунд. Таким образом рассматривать сигналы с частотами более 2-х МГц, к сожалению, все равно не получится. Но при этом хотя бы такие сигналы можно увидеть достаточно подробно, что несомненно будет полезным.
Вот так DSO303 получил времена развертки 500 и 200 наносекунд на клетку. В режиме 500 наносекунд на клетку изображение – это честный результат оцифровки, каждая точка = отсчет. Далее я подумал, что неплохо бы было это изображение еще и растянуть, так появился режим 200 наносекунд на клетку. Для него используются ровно те же данные, что и для развертки 500 наносекунд на клетку, только они растянуты так, что один отсчет = 3 точкам на экране. Это оказалось довольно удобно и получило свое право на жизнь.
Все приведенное выше является экспериментальной идеей. Автор не претендует на полную работоспособность этого экспериментального способа оцифровки, и не несет ответственности за результат. Любые вопросы, замечания и предложения приветствуются.
Комментарии (3)
aamonster
04.08.2021 19:47+1А может, добавить ещё немного математики (не ждать совпадения, а оценивать сдвиг) и не так долго оцифровывать? Или так же долго – но накопить данные для уменьшения шума?
Математику, как вариант, можно поискать в проектах работы с фото (multi-image super-resolution: берём пачку фоток, снятых чуть дрожащей камерой, и сливаем их в одну фотографию более высокого разрешения).
GarryC
05.08.2021 10:31+1Это называется "стробоскопический режим", но выдвигает очень высокие требования к стабильности задержки.
VelocidadAbsurda
Вполне имеет право на жизнь. Осциллографы на таком принципе выпускаются серийно (в основном ради частот в десятки ГГц), поищите “sampling oscilloscope”.