Jump to content

    

DisplayName

Участник
  • Content Count

    17
  • Joined

  • Last visited

Community Reputation

0 Обычный

About DisplayName

  • Rank
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Какое преимущество даёт такая замена?
  2. Почитал про CORDIC. У него есть 2 режима работы: вращение и векторизация. С помощью режима вращения можно получить по заданному углу значения различных функций (синус, косинус и т.д.). Режим векторизации превращает прямоугольные координаты в полярные. То есть на выходе из CORDIC'а в режиме векторизации получается угол и длина вектора sqrt(x**2 + y**2). Оба режима, как я понял, просто проводят вычисления из исходных данных, которые и так можно посчитать на микроконтроллере/процессоре. Предположим, что измерили со сдвигом 90 и получили два одинаковых измерения (попали в 45 и 135 градусов простой функции sin x). Тогда напрашивается сразу ответ на задачу следующим образом. Получаем систему уравнений: 1. Asin(alpha) = y1 2. Acos(alpha) = y2 Делим одно на другое (A уходит, sin на cos даёт тангенс) и через арктангенс получаем alpha. Затем подставляем одно в другое и находим A. Но так как это есть аналитическое решение задачи, то шумы здесь будут вносить свои нехорошие коррективы. Так вот вопрос. Что я упускаю? :) Чем помогает CORDIC в нахождении амплитуды?
  3. Хм, такой способ что ли завязан на фазу сигнала? Как будто бы (смотрю по моделированию ситуации на питоне) если фаза сигнала равна 45 градусов, то получается слишком большая ошибка в ответе. Если фаза, например, 0, то такой спсооб даёт 100% правильный ответ. Но шумы в сигнале наверняка будут, поэтому такой способ всё равно, как вы говорите, не подходит. О, а этот способ уже, похоже, не зависит от фазы. И более-менее толерантен к шумам в сигнале. Что дают два остальных алгоритма, если они сводятся к нахождению максимума и минимума?
  4. Если честно, то не очень понятно картину в целом с двумя триггерами. Разве не достаточно иметь компаратор, один D-триггер и МК (ну и аналоговый ключ)? Компаратор работает по пересечению условного нуля и задаёт клок D-триггеру. МК подключен к D входу триггера и задаёт значение для фиксации. Когда МК выставляет, например, 0, аналоговый ключ отключает сигнал от пикового детектора. Когда МК выставляет 1, сигнал подключается к пиковому детектору. Эти все переключения сигнала происходят по фазе сигнала. Попробовал поиграть с окнами на ардуине с генератором сигналов. Да, без окна дела хуже обстоят, чем с окнами типа косинусного или окном Гаусса.
  5. Раз уж расчехлил свой питон, то добавил ещё и Герцеля с выравненной фазой. Позапускав несколько раз и просмотрев глазами результаты, можно заключить следующее. Вариант с косинусным окном, бывает, даёт отклонение аж в 2. В то время как вариант без окна не даёт отклонения > 1. Герцель по результатам, в целом, схож с вариантом без окна (хоть иногда и даёт на порядок лучше результат, но иногда и несколько хуже). Так что для решения изначальной задачи можно попроовать обойтись вычислением среднеквадратичного отклонения.
  6. А, так я неправильно шумы подаю... Ну вот, если начать правильно генерировать шумы: - noise = (np.random.rand(1) - 0.5) * 0 + noise = (np.random.rand(100) - 0.5) * 0 Тогда случай "без окна" даёт лучше результат, чем с косинусным окном. Косинусное, например, окно даёт отклонение в 1.49, в то время как без окна отклонение всего 0.31. PS. Конечно, * 0 в шумах надо убрать, если надо генерировать шум. Хотя бывает и в обратную сторону, когда косинусное окно даёт результат лучше, чем без окна.
  7. Воспроизвёл это на питоне: window = 0.5 * (1 - np.cos(2 * np.pi * np.arange(0, 100) / 100)) for i in range(0, 10): A = 2048 * np.random.rand(1) phi = 2 * (np.random.rand(1) - 0.5) * np.pi noise = (np.random.rand(1) - 0.5) * 0 f = (A + noise) * np.sin(2 * np.pi * 0.05 * np.arange(0, 100) + phi) res = 2 * np.pi / np.e * np.std(window * f) res2 = np.sqrt(2) * np.std(f) print(A, res, res2, res - A, res2 - A) Для амплитуды 1 для косинусного окна (res) получились схожие результаты. А вот без окна (res2) у меня наоборот - наилучший результат, почти идеально точное (ну прямо совсем реально почти идеальное, лучше чем с косинусным окном) попадание в исходную амплитуду. Не понимаю, в чём разница между wolfram'ом и питоном. Если начать подавать амплитуду как будто бы с 12-ти битного АЦП для центрированного сигнала, тогда с косинусным окном разность с эталонным ответом достигает 1.8, в то время как без косинусного окна снова почти идеальное попадание в ответ. А вот если включить шум на амплитуду (+- 2), а ещё если амплитуду сделать типом int, то оба метода уже достаточно сильно начинают отклоняться от эталонного результата - на 2 или даже на 3. Ну, наверное, ничего удивительного, ведь при расчётах никакого знания про синусоподобный сигнал вообще нет.
  8. Нашлась реализация на питоне. Но из-за какой попало фазы невозможно оценить насколько хорошо оно подходит. Да, что-то считает. Да, когда плюс-минус считывается одинаковый сигнал, то и значения амплитуды получаются близкими, но недостаточно. Для таких исследований, похоже, надо сначала сделать аппаратную синхронизацию АЦП и сигнала. Хм, интересно, да. На словах выглядит просто :) Интересно, что даже есть STM32G4 с CORDIC accelerator.
  9. Соорудить аналоговый пиковый детектор и считать показания. Или считать несколько точек синусы и далее по формулам. И да, можно просто считывать на большой скорости весь сигнал синуса и оттуда получать максимальное значение. Вот и надо бы понять, по какому пути идти, какой лучше подходит под требования и т.д. У меня просто есть сомнения, что можно получить повторяемые цифры для фиксированной амплитуды сигнала. Например, запустили АЦП у XMC4xxx на некоторое время с получением максимального числа. Получили это число. Пусть оно будет 2304. Затем, ничего не меняя, снова запустили АЦП. И уже получили 2307 просто потому что АЦП не попал в ту же фазу, что делал на предыдущем замере. Это уже выходит за рамки допустимого. Если этого не будет, то остаётся проблема добывания XMC4xxx по доступной цене - бюджет, можно считать, ограничен 500 рублями. Если и это не проблема, то всё ок. Да, я плохо написал пункт про точность. Лучше бы я его не писал вовсе :) Сейчас поправлю пункт. Важна повторяемость результатов при одной и той же амплитуде.
  10. Да, возможно. Но мне надо в виде микросхемы. А если заказывать в digikey, то как быстро оттуда присылают в ту же, например, Москву?
  11. Если я правильно вас понял, то я представил лишь частную проблему, когда точно известно, что амплитуда одна и её надо измерить. Если приоткрыть завесу, то там есть ещё мультиплексоры и к ним подключены антенны. Есть источник синуса, который наводит сигнал на антенны. Антенны переключаются и получается разная амплитуда. В каждое такое переключение надо считать амплитуду. Получается, там просто оно само делает считывания и запоминает максимальное или минимальное значение. Такой подход мне не очень нравится в виду того, что это на удачу - если АЦП поймает пик, тогда он его запомнит. Да, большая скорость АЦП увеличивает шансы его поймать. Но тут вопрос в повторяемости результатов. Может, с этим всё ок и я сильно заморачиваюсь. Раз эта функция есть, значит она работает. Если с этим всё ок, то остаётся вопрос его доступности для покупки. Быстрый гуглёж не дал положительных результатов.
  12. Ох, я неправильно описал сигнал. У него DC 1.6 В, а амплитуда сигнала от 0 до 1.6 В. В таком же случае не надо иметь двуполярное питание? А что за калибратор и для чего он? Что является эталоном? По эталонному синус сигналу определяется "поведение" пикового детектора, а дальше при измерении уже настоящего сигнала производится его замер с поправками, полученными от эталонного сигнала? Это да, верно подмечено.
  13. А отсюда же можно сделать так, чтобы АЦП снимал показания только с пиков синуса. И тогда никакие формулы не нужны будут, а просто голое считанное значение из АЦП и будет ответом... Но здесь же должен быть в чём-то подвох? Например, скорости АЦП может не хватить, если сигнал будет слишком быстрый. Но в виду того, что частота сигнала может быть хоть 50 кГц, а скорость АЦП 1 Msps, то, вроде, такой способ тоже должен работать. Ещё какое соображение. Вот у АЦП внутри есть сэмплирующий конденсатор. Если на вход АЦП подключить диод, то получится пиковый детектор. Диод не будет давать разряжаться встроенному конденсатору и в итоге в нём окажется только максимальное значение. Надо только запрограммироват АЦП на достаточное время сэмплирования. При таком подходе есть что-то плохое?
  14. Добрый день. Помогите, пожалуйста, советом. Есть сигнал в виде синусоиды. Частота известна (её, в принципе, можно иметь любую в диапазоне 50-500 кГц). Амплитуда сигнала может быть в диапазоне от 0 до 3.3 В. Исправление: Сигнал центрирован на 1.6 В (DC составляющая сигнала). Амплитуда может быть в диапазоне от 0 до 1.6 В. Есть микроконтроллер и 12 бит АЦП. Надо найти амплитуду для последующей обработки на микроконтроллере. Есть некоторые ограничения: 1. операция получения амплитуды должна уложится в 100 мкс (в принципе, можно подвинуться до 200 мкс, 300, 400 и т.д. но 1 мс уже нежелательный потолок). Если меньше, то вообще хорошо. 2. скорость АЦП максимум 1 Msps (в принципе, можно чуть-чуть увеличить за счёт поиска либо внешнего АЦП, либо микроконтроллера с более высокой скоростью АЦП) 3. значение должно быть как минимум 12-ти битным, если можно больше, то вообще хорошо. 4. точность амплитуды в абсолютных величинах не так важна, сколько важна повторяемость полученных значений для одной входящей амплитуды. То есть после операции получения амплитуды, если провести эту операцию заново, то должно получится такое же значение, ну или +- 1. 5. надо учесть, что бюджет этого должен быть в районе 500 рублей при неоптовой закупке. Ну +-. 500 рублей - это лишь рамка, чтобы сразу отбросить вариант приобретения какого-нибудь АЦП за тысячу рублей. Но если есть веская причина, то бюджет можно и расширить. Я сейчас рассматриваю 2 варианта. Первый - это пустить сигнал через аналоговый пиковый детектор, а дальше на АЦП + усреднить, если надо. Второй - это просто пустить сигнал на АЦП. Здесь пишут https://stackoverflow.com/a/24161088, что достаточно иметь 2-3 сэмпла, чтобы получить параметры сигнала, в том числе и амплитуду. Фаза сигнала неизвестна, но при желании её можно синхронизировать с АЦП и в итоге сделать её известной. По итогу из той формулы можно знать всё, кроме амплитуды и получится простое вычисление y / sin. Или здесь не всё так просто? В принципе, первый вариант достаточно простой, если пиковый детектор состоит из двух операционных усилителей, а между ними диод и RC. Но в виду того, что на цифровом уровне можно делать продвинутые вычисления и не надо заморачиваться с подбором компонент для пикового детектора, то есть подозрение, что второй вариант может дать по итогу лучший результат. Что лучше всего ляжет под выданные ограничения? Как лучше получить амплитуду сигнала? Есть ли фатальные недостатки второго способа из-за возможной неидеальности чистоты сигнала по частоте и амплитуде? Стоит ли рассмотреть вариант первого способа, но взять какой-нибудь сигма-дельта АЦП, чтобы получить надёжное как минимум 12-ти битное значение с первого раза?
  15. Я, например, видел демонстрацию на ютубе и оттуда есть ссылка на бету: https://forum.lvgl.io/t/v0-1-beta-is-out/4818 Насколько оно юзабельно - не знаю. Я ручками писал.