SergeyVas 0 22 августа Опубликовано 22 августа · Жалоба Какой алгоритм лучше использовать?, для измерения разности фаз двух гармонических сигналов 10Кгц сигналы не сильно зашумлены разница меду сигналом и шумом примерно 30дб . Амплитуда меняется от 10в до 2в на обоих сигналах плавно но не одинаково (это датчик расстояния) зависит от расстояния. Амплитуду не нужно учитывать. Нужно измерять только разницу фаз , частота стабильная +-10гц. Задача измерить насколько можно точно и быстро 10мс. и не дорого ) Так же есть сигнал постоянный амплитудного значения этих сигналов от 0 до 10в. Так как сигнал низкочастотный то думал преобразовать его в меандр и завести на таймер микроконтроллер stm32h723 у этого мк. таймеры работаю на Мгц использовать один сигнал как старт а другой как стоп счета. Второй вариант зависти сигналы на ацп. Этот вариант больше ресурсов займет точность увеличиться или нет не знаю ? сомнения то что это сложнее и больше ресурсов мк. будет расходовать это точно. Третий вариант использовать первый и второй вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 3 22 августа Опубликовано 22 августа (изменено) · Жалоба можно в меандр, но потом свернуть оба сигнала с комплексным синусом, получатся два комплексных числа - разность фаз между которыми и есть результат Изменено 22 августа пользователем gridinp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 22 августа Опубликовано 22 августа · Жалоба Если таймером посчитать период импульсов после 360 разделить на результат это будет значение одного отсчета а потом измерять через xor 2 сигналы и умножить на один отсчет будет угол. Какой способ будет точнее мне хочется найти способ который будет точнее сначала теоретически а потом я проверю на железке ) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 22 августа Опубликовано 22 августа · Жалоба 37 минут назад, SergeyVas сказал: Если таймером посчитать период импульсов после 360 разделить на результат это будет значение одного отсчета а потом измерять через xor 2 сигналы и умножить на один отсчет будет угол. Какой способ будет точнее мне хочется найти способ который будет точнее сначала теоретически а потом я проверю на железке ) ? Теоретически точно фазу меряют перенося сигнал на низкую ПЧ где это дслеать просто. Т.е. домножаем на 10001Гц и получаем 1 Гц с той же фазой. Которую уже можно легко и просто измерять. но у вас ограничение по времени. Мол нужен ответ 100 раз в секунту. Т.е. переносить вниз можно лишь до 100 гц... что тоже неплохо :)) Но можно без переноса. Просто интегреровать xor двух сигналов. В результате аналоговый уровень будет пропорционален фазе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 223 22 августа Опубликовано 22 августа · Жалоба 53 минуты назад, SergeyVas сказал: Если таймером посчитать период Похоже, Вы ни разу этого не делали. Берётся постоянно работающий таймер на максимальной частоте, затем, для измерения его защёлками (capture), т.е. две одного и того же, на их входы (у каждой он свой) подаются сигналы с двух компараторов, причём, заведомо смещённых от нуля, в данном случае, порядка +500 мВ, тогда три перепада дают частоту, фазу и полярность сигналов — каждая меньшая разность двух перепадов это положительная полуволна, далее вычисляете среднее каждых двух перепадов, это будут 90° и 270°, одноимённые разности которых это фаза, которую затем усредняете, т.е. этот способ даёт результат каждый полупериод. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spirit_1 5 22 августа Опубликовано 22 августа · Жалоба On 8/22/2024 at 3:32 PM, Plain said: Похоже, Вы ни разу этого не делали. Берётся постоянно работающий таймер на максимальной частоте, затем, для измерения его защёлками (capture), т.е. две одного и того же, на их входы (у каждой он свой) подаются сигналы с двух компараторов, причём, заведомо смещённых от нуля, в данном случае, порядка +500 мВ, тогда три перепада дают частоту, фазу и полярность сигналов — каждая меньшая разность двух перепадов это положительная полуволна, далее вычисляете среднее каждых двух перепадов, это будут 90° и 270°, одноимённые разности которых это фаза, которую затем усредняете, т.е. этот способ даёт результат каждый полупериод. я бы сделал только не просто компараторы а усилители ограничители. При двух разных плавающих сигналах по амплитудету будут плавать разность фаз , а с усилителями ограничителями будет наиболее точный вариант Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 223 22 августа Опубликовано 22 августа · Жалоба 11 минут назад, spirit_1 сказал: не просто компараторы а усилители ограничители Это уничтожит амплитуду, тогда как с компараторами она видна в виде Кзап ШИМ, плюс она у автора есть в явном виде, хотя он не сказал, на какой момент. Похоже, у автора синус двуполярный, а у МК питание однополярное, тогда преобразовать ±10 В можно посредством BAW56 — аноды через резистор на +3,3 В, на катод сигнал, второй катод на вход компаратора и резистор на общий провод. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 22 августа Опубликовано 22 августа · Жалоба Да не приходилось делать. Синус двух полярный, сигнал амплитуды есть с отдельного операционного усилителя он соответствует амплитудному значению сигналов. В любой момент можно считать. Есть две ацп ads8681 могу на них завести в микроконтроллере есть cordic только с ацп думаю вариант дороже, сильнее будет грузить проц , программно сложнее, а точность значительно не увеличиться по сравнению с компараторами. Поправте если ошибаюсь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 22 августа Опубликовано 22 августа · Жалоба 6 hours ago, SergeyVas said: Второй вариант зависти сигналы на ацп. Этот вариант больше ресурсов займет точность увеличиться или нет не знаю ? сомнения то что это сложнее и больше ресурсов мк. будет расходовать это точно. точность от АЦП конечно зависит, но я много раз такие вещи считал в цифре и хочу вас склонить к этому методу 🙂 Вам надо оцифровать два сигнала длительностью больше, чем одна амплитуда, и на основе этого набора чисел можно посчитать сдвиг фаз. Вычислительная стоимость будет несколько синусов/арктангенсов + сколько-то (константное число около полусотни) арифметических операций + 7*n умножений и 7*n сложений, где n - число оцифрованных точек. В вашем случае, если оцифровывать на частоте 500кГц, скажем примерно 5 периодов, то есть 0.5мс, то должно хватить с очень большим запасом да и процессор, как а понимаю, должен справиться. Что именно делать могу рассказать, но будет заумно. Если решитесь, могу запрограммировать (вытащив из своих наработок) и здесь выложить. Ключевая идея в следующем: у вас есть два сигнала, f(x), g(x), каждый из которых есть сумма синуса и косинуса с одной и той же частотой. Вы к этому всему добавляете еще пару сигналов f(x+dx), g(x+dx), где dx - шаг оцифровки, и получаете уже набор из 4 таких сумм. На них надо набросить сингулярное разложение и вытащить две самые "численно яркие" функции, которые как раз соответствуют этим синусам и косинусам. Если не добавить f(x+dx), g(x+dx) - вы получите только линейную комбинацию с шумами, и это вас тотально запутает. Получив синусы и косинусы надо только посчитать МНК каждого из сигналов в терминах этих синусов и косинусов, а потом по коэффициентам выполнить тригонометрическую формулу и посчитать фазу. Если у вас есть эти два оцифрованных сигнала, и вы готовы их здесь выложить, могу прогнать на своем софте и посчитать фазу, если понравится, преобразую свой софт под эту задачу и выложу полученную софтину здесь. EDIT: то, что я предлагаю относится к классу алгоритмов Generalized pencil-of-function method и метода Прони, ссылки на эти методы конечно же гуглятся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 22 августа Опубликовано 22 августа · Жалоба 55 minutes ago, SergeyVas said: Есть две ацп ads8681 могу на них завести в микроконтроллере есть cordic только с ацп думаю вариант дороже, сильнее будет грузить проц , программно сложнее, а точность значительно не увеличиться по сравнению с компараторами. Поправте если ошибаюсь? встроенных АЦП для 10кГц и 30дБ вроде как должно хватить с запасом. при известной частоте косинусное преобразование делается парой целочисленных умножений на отсчёт. см. "Алгоритм Гёрцеля" с компараторами ухудшение точности от уровня шума зависит, так как весь период превращается в одну единственную точку (перехода через 0), и соответственно все шумы делённые на производную сигнала прямиком попадают как ошибка фазы для всего периода. если же фаза считается умножением на синус/косинус через ДПФ, то шумы заметно давятся им как узкополосным фильтром и на фазу влияния оказывают меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 22 августа Опубликовано 22 августа · Жалоба 12 minutes ago, _pv said: при известной частоте косинусное преобразование делается парой целочисленных умножений на отсчёт. см. "Алгоритм Гёрцеля" а у ТС частота известна точно, или нет? Если точно, то да, Герцелем тоже можно, но ИМХО, еще проще и понятнее вообще через МНК оба сигнала по синусу, косинусу и константе разложить и по полученным коэффициентам посчитать фазу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 22 августа Опубликовано 22 августа · Жалоба для дальномера частоту ТС скорее всего сам себе и генерирует, так что должна быть известна. при неизвестной частоте МНК делать как-то совсем не проще, а частота если известна, то вроде как вообще без разницы - результат будет одинаковый, но Гёрцель тригонометрию всю через одно единственное умножение считает. а если частота известна "примерно", можно тем же Гёрцелем несколько точек вокруг посчитать, через них какую-нибудь параболу провести, найти где у неё максимум на самом деле и на этой частоте уже считать фазу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 22 августа Опубликовано 22 августа · Жалоба 3 minutes ago, _pv said: для дальномера частоту ТС скорее всего сам себе и генерирует, так что должна быть известна. по идее да, я тоже так вначале подумал, но если ТС аналогом где-то не в МК это делает и там еще какой-нибудь Доплер над ней шаманит, там может быть не все так просто. Но, дождемся ответа ТС. 4 minutes ago, _pv said: а если частота известна "примерно", можно тем же Гёрцелем несколько точек вокруг посчитать, через них какую-нибудь параболу провести, найти где у неё максимум на самом деле и на этой частоте уже считать фазу. ох от там глюков наловит, и данные все хранить надо. Там проще Фурьем грохнуть сразу и на спектральной части параболу строить, по крайней мере из коробки Фурье для STMов думаю, найти можно. Не спорю, что через сингулярное разложение посложнее для понимания, но арифметическая сложность совсем копеешная получается, и всегда во Фробениусовой норме все как-то надежнее и точнее вычисляется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 79 22 августа Опубликовано 22 августа · Жалоба 3 hours ago, iiv said: и данные все хранить надо. Там проще Фурьем грохнуть сразу для нескольких определённых частот ДПФ будет быстрее ФФТ, да и как раз на лету считается без буферизации вообще, в отличии от. И того же Гёрцеля можно попробовать скрестить с примитивным БИХ фильтром, чтобы он старые отсчёты "забывал" экспоненциально и просто на каждом новом отсчёте за нескольких умножений уточнять значение фазы за последние N милисекунд. сигнал узкополосный и вычислять весь пустой спектр через ффт, а не на 2-3 частотах около единственного максимума, чтобы найти фазу смысла особого нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 29 22 августа Опубликовано 22 августа · Жалоба 2 hours ago, _pv said: сигнал узкополосный и вычислять весь пустой спектр через ффт, а не на 2-3 частотах около единственного максимума, чтобы найти фазу смысла особого нет. согласен, что смысла нет, но Герцель-то тоже не бесплатно считается. Для последовательности из n чисел ему надо 6n операций, а ФФТ (при n=1024) потребует только 25n, то есть от 5-ой частоты ФФТ будет быстрее. Да и для Герцеля основное преимущество - работа на дробной частоте, но если она заранее не известна и подбирается, то тоже хранить все придется. То есть будь я на месте ТС примерно с его уровнем знаний, и если бы частота точно известна была бы, то да, Герцелем или МНК, а если частота известна только прикидочно - тут все будет зависеть от того, что проще где-то утянуть, чтобы самому не отлаживать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться