Перейти к содержанию
    

Выделить фазы из сигнала

2 часа назад, Aleх сказал:

По методике измерения - у меня чтото вроде дальнометра - я сам формирую исходный сигнал, а потом принимаю его отражение. Т.е. я могу запускать АЦП одновременно с запуском генератором исходного сигнала, и надеюсь что БИХ фильтр посчитает мне фазовый сдвиг.

Смотрите в сторону синхронного детектирования...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Самурай

Спасибо! Попробую частоты подвигать, чтобы точно в бин попасть. И, я правильно понял, что фазу все же можно вычислить - если запускать дискретизатор синхронно с источником сигнала?

 

И еще вопрос. Что точнее для вычисления фазы -БИХ фильтр по алгоритму Герцеля, или КИХ фильтр? 

Изменено пользователем Aleх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/14/2020 at 3:10 PM, Aleх said:

Разбираюсь с ЦОС, возник вопрос по БИХ фильтру и алгоритму Герцеля.

1. Есть набор данных с АЦП - 4096 отсчетов. Сигнал - косинус с частотой 20кГц, начальной фазой 0 и амплитудой 1, дискретизация с частотой 2МГц. Загрузил в эксель, там же разместил формулы БИХ фильтра ( воспользовался статьей https://ru.dsplib.org/content/goertzel/goertzel.html ). Получилось, что 20КГц соответствует 41й спектральной составляющей. БИХ фильтр для k=41 выдал некое комплексное число на выходе. Я ожидал увидеть Re=1 Im=0, но получилось что то совершенно не похожее. Далее, я взял набор входных данных и подвигал вперед-назад на входе БИХ фильтра: результат на выходе (почти) не поменялся, тот же самый комплексный вектор, хотя я рассчитывал что он будет крутиться вместе с входными данными.

2. Я решил, что ошибся в формулах БИХ фильтра.  По ссылке https://ru.dsplib.org/content/goertzel/goertzel.html в конце есть пример фильтра на 8 точек, перепечатал в эксель и убедился что формулы были забиты верно. Но - попробовал циклически прокрутить входные данные из примера, и снова на выходе фильтра - тот же вектор.

Вопрос. Что за вектор на выходе у БИХ фильтра, почему его фаза (почти) не меняется от циклической прокрутки входных данных?

Я планировал применить этот фильтр именно для вычисления фазы сигнала: снимать данные с ацп, грузить в БИХ фильтр и наблюдать относительное изменение фазы сигнала.

 

 

Герцель работает как резонатор. Выходной сигнал похож на входной, только много больше. Если в какой-то момент перестать подавать ненулевые числа на вход (занулить вход), получите генерацию частоты, на которую фильтр настроен, с амплитудой, которую фильтр успел накопить, пока шёл не ноль. Если что-то не работает, учитесь смотреть внутрь. Ошибки бывают самые разные. Если понимаете явление, - быстро найдёте косяк.

  

On 9/2/2020 at 5:13 PM, Aleх said:

Сигнал выглядит как периодический, той же частоты, но с кривой формой. Если вручную сложить несколько синусов, то форма подбирается. Ниужели нельзя это сделать алгоритмически, программой?

Либо нелинейное искажение (возникли кратные гармоники), либо Вы неверно считаете сигнал "кривым". Он "прямой".

8 hours ago, Aleх said:

@Самурай

Спасибо! Попробую частоты подвигать, чтобы точно в бин попасть. И, я правильно понял, что фазу все же можно вычислить - если запускать дискретизатор синхронно с источником сигнала?

 

И еще вопрос. Что точнее для вычисления фазы -БИХ фильтр по алгоритму Герцеля, или КИХ фильтр? 

 

 

Не надо попадать точно в бин. Любой фильтр, включая герцелевский (и вообще любой КИХ и БИХ) задержит фазу входа при заданной частоте всегда на одну и ту же константу. Если на входе одна частота, то для определения её фазы фильтр вообще не нужен. Чем фаза сигнала на выходе фильтра лучше фазы на входе? Фильтр интересен тем, что отчищает сигнал от шумов. Если требуется именно почистить, то вопрос исключительно в АЧХ. У Герцеля она строго задана. У КИХ может быть довольно разной в пределах возможности при заданной длине. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уточнение/дополнение про фазу и частоту "бина". Если Герцель настроен точно на принимаемую частоту, то фаза на выходе равна фазе на входе. Иначе резонатор будет спешить или отставать, и в итоге фаза съедет. Чем больше расстройка, тем сильнее съедет. 

21 hours ago, Aleх said:

По методике измерения - у меня чтото вроде дальнометра - я сам формирую исходный сигнал, а потом принимаю его отражение. Т.е. я могу запускать АЦП одновременно с запуском генератором исходного сигнала, и надеюсь что БИХ фильтр посчитает мне фазовый сдвиг.

При отражении фаза может опрокинуться. Свистите как минимум две частоты и смотрите соотношение фаз. Иначе не будет никакой дальности и даже псевдодальности))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо!

Получил два результата. 1. Герцель на 128 точек заработал (в экселе). Амплитуда, фаза - все четко работает. 2. На 4096 точек расчет синуса в экселе немного плывет по фазе (из-за округлений, или я криворуко закодил таблицу), и действительно - результат тоже дает неверную фазу. Впрочем, может быть еще найду у себя ошибку.

 

@dragonfly

Резонатор мне не нужен, совсем. А КИХ фильтр так же себя ведет?

 

Сигнал мне чистить не надо, просто измерить фазу-амплитуду на интересующей частоте. Желательно, как можно точнее. Синхронный детектор, как я слышал - что то примитивное и не точное, поэтому я и обратился к БПФ/КИХ/БИХ.

Изменено пользователем Aleх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Aleх said:

Сигнал мне чистить не надо, просто измерить фазу-амплитуду на интересующей частоте.

Если частота (гармонического) сигнала известна, то можно просто посчитать два коэффициента a и b разложения сигнала в Ряд Фурье на интервале кратном периоду сигнала:

{\displaystyle f(x)={\frac {a_{0}}{2}}+\sum _{n=1}^{\infty }(a_{n}\cos nx+b_{n}\sin nx),} (1)

Зная коэффициенты a и b сможете посчитать фазу и амплитуду сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Герцель = резонатор. Почему не нужен? Что смущает? Фильтр, построенный по формуле резонатора.

Если коэффициенты Герцеля настроены точно под принимаемую частоту, то фаза на выходе будет той же, что и на входе. В симметричном КИХ фильтре фаза будет скорее всего смещена на ненулевую константу. Берёте любой фильтр, измеряете эту константу (или считаете теоретически), далее будете всегда её вычитать из результата, будто её нет. Искать фильтр, в котором фаза на выходе обязательно совпадает с фазой на входе - по сути бессмысленное дело. Но если уверены, что сигнал на входе чист, то снова спрашиваю: зачем вообще его чем-то фильтровать? Фильтр не фазу мерит. Фильтр фильтрует. Разность фаз между входом и выходом фильтра при заданной частоте  константна. Фазу можно смотреть как до, так и после фильтра. Почему после фильтра смотреть лучше? 

БПФ по природе своей - тоже набор фильтров. Чтобы рассуждать, какой фильтр лучше, надо определиться, зачем вообще фильтровать? Отсутствие фильтра - тоже фильтр. С коэффициентом 1. Может, его достаточно?

С учётом ответа другого участника - может, весь вопрос в том, как из действительного сигнала (без фазы) получить комплексный (с фазой)?

Тогда универсальный ответ - преобразование Гильберта. КИХ фильтр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@blackfin
Спасибо! Так вот сходу даже не знаю с какой стороны подойти к этой формуле, но буду разбираться. Главное, чтобы этот алгоритм хорошо ложился на stm32 c fpu. С ПЛИС связываться не хочется, все же это хоббийная разработка.

@Dragon_Fly

Меня сначала смутило, что при наличии нулей на входе фильтр может выдать левые данные. Но, подумал, если данные с АЦП не выравнивать по уровню относительно ноля, то такой ситуации не возникнет. Значит, можно использовать.

По поводу остального - задача считать фазу, как можно точнее. И, сигнал конечно же приходит зашумленный. А фильтр или БПФ или разложение в ряд - мне без разницы, главное результат. Я почему то решил, что мне нужен БИХ. Но, попробую Гильберта если он окажется точнее, спасибо!

Изменено пользователем Aleх

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 minutes ago, Aleх said:

Так вот сходу даже не знаю с какой стороны подойти к этой формуле, но буду разбираться.

Вспоминаем школьную тригонометрию:

f(x) = A*sin(n*x+phase) = A*cos(n*x)*sin(phase) + A*sin(n*x)*cos(phase) = a*cos(n*x) + b*sin(n*x),

 

где a и b - коэффициенты разложения функции f(x) в ряд Фурье вычисляются по формулам:

a_n= \frac{1}{\pi}\int\limits_{-\pi}^{\pi}f(x)\cos(nx)dx,

b_n= \frac{1}{\pi}\int\limits_{-\pi}^{\pi}f(x)\sin(nx)dx.

Откуда получаем систему уравнений:

A*sin(phase) = a

A*cos(phase) = b

Решая эту систему, находим "A" и "phase".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос возник. Частный случай БПФ для одного спектрального отсчета, и алгоритм коррелятора - это случаем не одно и то же? 

Поясню. Прочитал статью "МЕТОДЫ ПОВЫШЕНИЯ ТОЧНОСТИ ИЗМЕРЕНИЯ ДАЛЬНОСТИ В ЛАЗЕРНЫХ ФАЗОВЫХ ДАЛЬНОМЕРАХ" и попробовал посчитать в экселе, сравнить с Герцелем. Результат получился очень близок к Герцелю, но что смутило - у меня вышло, что БПФ на один бин и коррелятор - одно и то же, одинаковые умножения на синус и косинус, и последующее накопление. Все одинаково и результат одинаков. Либо я где то что то не понял, либо ... почему тогда называются по разному? Назвали бы коррелятор частным случаем БПФ, и все.

 

p.s. Разложение в ряд пока не осилил. За совет большое спасибо, разберусь, но пока в экселе не работает.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 hours ago, Aleх said:

Вопрос возник. Частный случай БПФ для одного спектрального отсчета, и алгоритм коррелятора - это случаем не одно и то же? 

Да. Те же яйца с разных сторон.

 

Фурье = набор фильтров. Коррелятор = один конкретный фильтр. Если БПФ используется с окном, то просто чуть другой (более правильный) набор.

23 hours ago, Aleх said:

Результат получился очень близок к Герцелю, но что смутило - у меня вышло, что БПФ на один бин и коррелятор - одно и то же, одинаковые умножения на синус и косинус, и последующее накопление.

 

Результат близкий, потому что чудес не бывает. Селективность КИХ фильтра определяется его длиной.

Если накопление на одной и той же длине, то есть вовлекает одинаковое число отсчётов, получаем даже в случае Герцеля (формально, БИХ) одинаковую длину эквивалентных КИХ фильтров. 

Операции в Герцеле и в Фурье не одинаковые, хоть и схожие. Идентичный результат с одним бином Фурье не получится. 

On 12/23/2020 at 2:13 PM, Aleх said:

почему тогда называются по разному? Назвали бы коррелятор частным случаем БПФ, и все.

Коррелятор часто называют согласованным фильтром. Фильтр в виде одной гармоники - частный случай (согласованного) фильтра, а значит, и коррелятора.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@dragonfly
Спасибо огромное!  Стало намного понятнее.

Кажется, я перебрал все что бывает для вычисления сдвига фазы. Кроме разложения в ряд, но и там наверное то же самое. Если сравнивать БПФ на одну частоту и Герцеля, то у Герцеля явно меньше констант надо хранить, и меньше умножений. Выходит, Герцель сильно проще в реализации (на мк с плавающей точкой). Вопрос исчерпан

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Aleх

Стало намного понятнее.

Не стало. Лучше учебник почитайте. Коррелятор - это не фильтр. Фильтр инвариантен к сдвигу во времени, коррелятор нет. А у самой функции синуса есть такое важное свойство, что она инвариантна к сдвигу с точностью до фазового поворота.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@petrov
У меня задача - отправить сигнал, и принять отражение, а потом вычислить сдвиг фазы в отражении. Вот я и перебрал все варианты вычисления фазы: Герцеля, БПФ на одну частоту, и корелятор. Т.е. я искал вовсе не фильтр, а способ посчитать фазу. И выбор не в пользу коррелятора/БПФ - как написал выше, Герцель проще, а результат вроде бы той же точности (не знаю как оценить точность, и вообще сравнивать алгоритмы, кроме сложности их реализации).

 

Хотя, по идее, фильтр мне тоже полезен, поскольку приемный сигнал слегка зашумлен, и шум предположительно только белый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, Aleх said:

У меня задача - отправить сигнал, и принять отражение, а потом вычислить сдвиг фазы в отражении.

а если так:

dif = tx * conj(rx) - комплексное умножение с сопряжением

phase_dif = phase(dif) - вычисление фазы результата через cordic

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...