Jump to content
    

Реализация извлечения корня

Коллеги, есть две шины комплексных данных разрядностью 24 бита RE и 24 бита IM в каждой шине. После комплексного перемножения этих шин получаю результат

с 48 бит/компонента. И теперь из этого комплексного произведения хочу извлечь квадратный корень. Так как для извлечения корня компоненты нужно 

возвести в квадрат то получаем уже 96 бит/компонента. Это же будут жуткие тормоза на высоких тактовых частотах. Динамический диапазон сигнала во 

входных шинах очень широкий, максимум могу ужать на 2...3 бита, это не решит проблему. Может кому приходилось решать подобную задачу?

Как действовали?

Share this post


Link to post
Share on other sites

Насколько сильно нужно? Я делал приемник сигнала с амплитудной манипуляцией, там важна не амплитуда, а положение импульса. От извлечения корня отказался, выдавал просто сумму квадратов I и Q компонент.

Share this post


Link to post
Share on other sites

1 hour ago, _sda said:

для извлечения корня компоненты нужно возвести в квадрат

 

Зачем это ещё? Это что за алгоритм? Я такого не знаю.

Если за 1 такт не нужно, то никаких квадратов там нет, всё делается крайне просто за N/2 тактов, результат тоже длины N/2.

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

Share this post


Link to post
Share on other sites

27 минут назад, V_G сказал:

Насколько сильно нужно? Я делал приемник сигнала с амплитудной манипуляцией, там важна не амплитуда, а положение импульса. От извлечения корня отказался, выдавал просто сумму квадратов I и Q компонент.

Увы, мне такой вариант не приемлем. Мне после извлечения корня ещё фазу нужно считать.

22 минуты назад, Dr.Alex сказал:

 

Зачем это ещё? Это что за алгоритм? Я такого не знаю.

Если за 1 такт не нужно, то никаких квадратов там нет, всё делается крайне просто за N/2 тактов, результат тоже длины N/2.

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

А ваш алгоритм точно умеет извлекать корни из комплексных чисел? Или только из вещественных?

24 минуты назад, blackfin сказал:

Если нужен просто модуль комплексного числа, то корень не нужен. И перемножение "комплексных данных" не нужно.

 

CORDIC: rectangular to polar conversion

Не нужен мне "просто модуль комплексного числа", почитайте пожалуйста условие внимательней.

Share this post


Link to post
Share on other sites

6 minutes ago, _sda said:

А ваш алгоритм точно умеет извлекать корни из комплексных чисел? Или только из вещественных?

 

Из вещественных.

Про корень из комплексного числа вообще никогда не слышал.

Share this post


Link to post
Share on other sites

1 минуту назад, Dr.Alex сказал:

 

Из вещественных.

Про корень из комплексного числа вообще никогда не слышал.

Мой алгоритм умеет такое делать. Алгебра за 11-й класс.

Share this post


Link to post
Share on other sites

26 minutes ago, _sda said:

Не нужен мне "просто модуль комплексного числа", почитайте пожалуйста условие внимательней.

Для начала, перепишите свой первый пост на нормальном языке используемом в алгебре за 11-й класс. А то не понятно, "кто на ком стоял".. ))

 

Пока что, мне понятно лишь то, что есть два комплексных числа z1 и z2:

z1 = x1 + y1*i;

z2 = x2 + y2*i;

Что вам нужно с ними сделать мне пока не понятно.. 

Share this post


Link to post
Share on other sites

2 минуты назад, blackfin сказал:

Для начала, перепишите свой первый пост на нормальном языке используемом в алгебре за 11-й класс. А то не понятно, "кто на ком стоял".. ))

 

Пока что, мне понятно лишь то, что есть два комплексных числа z1 и z2:

z1 = x1 + y1*i;

z2 = x2 + y2*i;

Что вам нужно с ними сделать мне пока не понятно.. 

Давайте попробуем. Нужно вычислить SQRT(z1 * z2). Разрядность шин x1,x2,y1,y2 равна 24 бита, если бы было меньше то этот вопрос скорее всего не появился бы .

Добавлю что в матлабе алгоритм работы всего этого математического модуля уже отлажен, работает отлично. Проблему вижу в реализации.

Share this post


Link to post
Share on other sites

14 hours ago, _sda said:

Нужно вычислить SQRT(z1 * z2). Разрядность шин x1,x2,y1,y2 равна 24 бита, если бы было меньше то этот вопрос скорее всего не появился бы.

Так в чем проблема? Алгебра за 11-й класс:

SQRT(z1 * z2) = SQRT(z1) * SQRT(z2).

Оба корня справа будут иметь разрядность: 24/2 = 12 бит

Share this post


Link to post
Share on other sites

5 минут назад, blackfin сказал:

Так в чем проблема? Алгебра за 11-ый класс:

SQRT(z1 * z2) = SQRT(z1) * SQRT(z2).

Оба корня справа будут иметь разрядность: 24/2 = 12 бит

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

Share this post


Link to post
Share on other sites

5 minutes ago, _sda said:

... а как на ваш взгляд велика ли будет погрешность?

Странный вопрос.. Сколько бит оставите в вычисленных корнях, столько и будет.

Можете вычислять оба корня SQRT(z1) и SQRT(z2) с 24-х битной точностью в формате с фиксированной запятой: 12 целых + 12 дробных разрядов.

Share this post


Link to post
Share on other sites

2 минуты назад, blackfin сказал:

Можете вычислять оба корня SQRT(z1) и SQRT(z2) с 24-х битной точностью в формате с фиксированной запятой: 12 целых + 12 дробных разрядов.

Ага, и когда я перемножу эти 24р * 24р опять получу свои 48 разрядов. Но правда, их в квадрат уже возводить не придётся. Похоже что вы как всегда правы, на 48 разрядов мне таки жизнь облегчили. Покумекаю в этом направлении ещё. Большое спасибо!

Share this post


Link to post
Share on other sites

3 часа назад, petrov сказал:

Может корень и не нужно вычислять, а достаточно просто фазу на 2 поделить?

Нет, корень нужен чтобы вернуться к отсчётам "напряжения", ведь после перемножения отсчёты имеют размерность мощности. Дело в том что после перемножения отсчеты произведения участвуют ещё в нескольких блоках и им размерность мощности никак не подходит. А фазу после извлечения да, конечно буду умножать на 2, мне важна фаза после комплексного умножителя.

 

А с вычислением корня похоже рано я расслабился. Для извлечения корня из комплексного числа нужно выполнить три извлечения корня из вещественного числа. Два из них можно выполнить параллельно, поэтому нужно последовательно выполнить два извлечения корня из вещественного числа. Одно извлечение корня из 48-битного числа займёт 48 тактов, два - 96 тактов. У меня просто нет столько времени, новые данные начнут приходить гораздо раньше... Длительность выхлопа из БПФ - 100 мкс и этот выхлоп идёт периодически с интервалом 300 мкс. Это тупиковая ситуация.

Коллеги, может есть ещё какие-то более шустрые методы перехода от "мощности" к "напряжению" для комплексных отсчётов?

Share this post


Link to post
Share on other sites

11 minutes ago, _sda said:

Для извлечения корня из комплексного числа нужно выполнить три извлечения корня из вещественного числа.

Это ещё зачем? "Нормальные герои всегда идут в обход?" ;-) 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...