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

очень быстрый логарифм

Потратив некоторое время на анализ различных методов вычисления логарифма остановился на таком варианте.Хочу поделиться.Идею подсказал SM,я слегка доработал вычисление мантиссы.Вход integer, на выходе результат в децибелах.Динамический диапазон 128 дБ,STA показывает Fmax = 536 МГц для EP3SE50F484C2.Замечания принимаются.

 

p.s.ошибка,нужно так:

 elsif (RISING_EDGE(Clk)) then
        regin1 <= input;
        for i in Pin-1 downto 0 loop
                        .....................................

mlog2.rar

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


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

Потратив некоторое время на анализ различных методов вычисления логарифма остановился на таком варианте.Хочу поделиться.Идею подсказал SM,я слегка доработал вычисление мантиссы.Вход integer, на выходе результат в децибелах.Динамический диапазон 128 дБ,STA показывает Fmax = 536 МГц для EP3SE50F484C2.Замечания принимаются.

 

какой то бред выложен %) хотя бы потому что сигнал

 

Input : in STD_LOGIC_VECTOR(Pin-1 downto 0);

 

в коде не используется %)

 

так от чего он децибелы то считает ? :)))

 

давайте правильную версию

 

PS. а чем не понравилось считать по колхозному ? 20*log(x) = 20*ln(x)/ln(10), или один из вариантов в целочисленке k = ceil(20*1024/ln(10)), 20*log(x) = k*ln(x)/1024

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


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

 

Да ладно вам,бред...Ну при копи-паст промахнулся...У меня это часто бывает.

 

PS. а чем не понравилось считать по колхозному ? 20*log(x) = 20*ln(x)/ln(10)

Потому что умножить на 6 гораздо приятнее деления на ln(10) :biggrin:

mlog2.rar

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


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

Потому что умножить на 6 гораздо приятнее деления на ln(10) :biggrin:

 

еще раз

или один из вариантов в целочисленке k = ceil(20*1024/ln(10)), 20*log(x) = k*ln(x)/1024

 

k = ceil(20*1024/ln(10)) = 8895 и это константа. Причем немного поиграв точностью аппроксимации можно уменьшить количество единичных битов в этой константе, что даже на высоких тактовых этот умножитель можно будет делать на логике %)

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


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

Причем немного поиграв точностью аппроксимации можно уменьшить количество единичных битов в этой константе, что даже на высоких тактовых этот умножитель можно будет делать на логике %)

 

Я не вижу выигрыша.При двух единицах(как в моём случае) можно будет можно будет получить число 8704 вместо 8895,это даст вам погрешность 2%.

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


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

Я не вижу выигрыша.При двух единицах(как в моём случае) можно будет можно будет получить число 8704 вместо 8895,это даст вам погрешность 2%.

 

либо мы считаем по разному либо одно из двух. для 24х битных данных ошибка не превысит 0.012 дБ

post-3453-1246443026_thumb.jpg

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


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

либо мы считаем по разному либо одно из двух. для 24х битных данных ошибка не превысит 0.012 дБ

Но вы же схитрили,ln(i) умножаете на 8895 вместо 8704.А 8895 это "10001010111111" .Посчитайте сами количество единиц.

 

Вот результат симуляции,внизу - формат real.

post-18832-1246444867_thumb.png

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


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

Но вы же схитрили,ln(i) умножаете на 8895 вместо 8704.А 8895 это "10001010111111" .Посчитайте сами количество единиц.

 

посмотрел тему еще раз, ткните носом где я говорю про 8704 %)

 

более естественная аппроксимация, что бы уменьшить количество единиц будет 8880, всего 5 сумматоров %) погрешность составит 0.23 дБ %)

 

а вот если взять 8896, всего 4 сумматора, то погрешность составит всего 0.025 дБ :) при этом 4 сумматора можно еще будет разбить на 2 (за 2 такта) должно быть быстро по тактовой %)

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


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

посмотрел тему еще раз, ткните носом где я говорю про 8704 %)

 

более естественная аппроксимация, что бы уменьшить количество единиц будет 8880, всего 5 сумматоров %) погрешность составит 0.23 дБ %)

 

а вот если взять 8896, всего 4 сумматора, то погрешность составит всего 0.025 дБ :) при этом 4 сумматора можно еще будет разбить на 2 (за 2 такта) должно быть быстро по тактовой %)

 

Вы не говорили о 8704,это ближайшее число к заданному,содержащее 2 единицы.Ведь в моём случае требуется всего один сумматор :rolleyes: .

 

А то что для повышения точности (в моём случае ошибка 0,43 дБ при сигнале 127дБ) нужно увеличивать разрядность множителя,по моему очевидно.Мне хватило и этого,кому нужно точнее - пожалуйста.Я вообще против тупого копирования без разбирательства.Только у меня используется LOG2 вместо ln,константу нужно пересчитать.

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


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

PS. а чем не понравилось считать по колхозному ? 20*log(x) = 20*ln(x)/ln(10)

ИМХО вот этим, что выделено. log2 значительно проще, так как его аппроксимация сводится кусочно-линейной в каждой октаве, что сводится к классической экспоненте и мантиссе.

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


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

Кстати,вот ошибка в децибелах при нормировании множителя 6.02 к десяти битам.Этот процесс бесконечен :laughing:

post-18832-1246450083_thumb.png

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


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

ИМХО вот этим, что выделено. log2 значительно проще, так как его аппроксимация сводится кусочно-линейной в каждой октаве, что сводится к классической экспоненте и мантиссе.

 

аа, перепутал, во всех выкладках читать ln как log(x,2). коэффициент нормировки для 1024 составит 6166, если выбрать 6160(всего 3 суматора), то ошибка составит 0.11 дб, для данных 2^24 :)

 

Кстати,вот ошибка в децибелах при нормировании множителя 6.02 к десяти битам.Этот процесс бесконечен :laughing:

 

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

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


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

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

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

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

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

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

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

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

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

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