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

Изменение разрядности цифрового сигнала

Здравствуйте,

Есть сигнал разрядности 28. Необходимо уменьшить разрядность сигнала до разрядности 14, так сказать масшабирование. Обрезание младших разрядов уменьшает динамический диапазон. Читал, что вычисление экспоненты и нормализация это то, что мне нужно. Но как реализовать я не понял. Может есть пример какой на VHDL? Да и вообще интересует алгоритм уменьшения разрядности с N до M разрядов, где N>M.

 

Заранее благодарен.

 

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

это называется аппроксимация логарифма, или, по-другому, вычисление экспоненты и нормализация. Для знакового числа как-то примерно так. В exp получите инверсную экспоненту, а в norm_out нормализованное число, где в 15-ом бите знаковый, а в 14-ом всегда старший значащий бит:

 

always @*
         if ( (&in[15:0]  ) | (!(|in[15:0]))) exp <= 4'hf;
    else if ( (&in[15:1]  ) | (!(|in[15:1]))) exp <= 4'he;
    else if ( (&in[15:2]  ) | (!(|in[15:2]))) exp <= 4'hd;
    else if ( (&in[15:3]  ) | (!(|in[15:3]))) exp <= 4'hc;
    else if ( (&in[15:4]  ) | (!(|in[15:4]))) exp <= 4'hb;
    else if ( (&in[15:5]  ) | (!(|in[15:5]))) exp <= 4'ha;
    else if ( (&in[15:6]  ) | (!(|in[15:6]))) exp <= 4'h9;
    else if ( (&in[15:7]  ) | (!(|in[15:7]))) exp <= 4'h8;
    else if ( (&in[15:8]  ) | (!(|in[15:8]))) exp <= 4'h7;
    else if ( (&in[15:9]  ) | (!(|in[15:9]))) exp <= 4'h6;
    else if ( (&in[15:10] ) | (!(|in[15:10]))) exp <= 4'h5;
    else if ( (&in[15:11] ) | (!(|in[15:11]))) exp <= 4'h4;
    else if ( (&in[15:12] ) | (!(|in[15:12]))) exp <= 4'h3;
    else if ( (&in[15:13] ) | (!(|in[15:13]))) exp <= 4'h2;
    else if ( (&in[15:14] ) | (!(|in[15:14]))) exp <= 4'h1;
    else                                   exp <= 4'h0;

wire [15:0] norm_out = in << exp;

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


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

Здравствуйте,

Есть сигнал разрядности 28. Необходимо уменьшить разрядность сигнала до разрядности 14, так сказать масшабирование. Обрезание младших разрядов уменьшает динамический диапазон. Читал, что вычисление экспоненты и нормализация это то, что мне нужно. Но как реализовать я не понял. Может есть пример какой на VHDL? Да и вообще интересует алгоритм уменьшения разрядности с N до M разрядов, где N>M.

 

Заранее благодарен.

 

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

источник сигнала разрядности 28 ?

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


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

источник сигнала разрядности 28 ?

Да, 28. Но хотелось бы узнать алгоритм, чтобы любые разрядности можно было использовать.

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


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

Да, 28. Но хотелось бы узнать алгоритм, чтобы любые разрядности можно было использовать.

имелось ввиду с какого модуля приходит этот сигнал и опишите его функцию.

с КИХ фильтра?

Без понимания откуда данные приходят и для чего они нужны, навряд ли можно что-то вменяемое придумать кроме "обрезания/укорачивания разрядности"

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


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

Пример такой, АЦП 14 бит, фильтрация, бпф, на выходе бпф 29 бит, далее мультиплексное перемножение реальной и мнимой части с вычислением корня (амплитудный спектр). Разрядность амплитудного спектра необходима меньше, чем 29 бит, нужно 16 бит. На каком-то этапе необходимо сделать масшабирование.

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


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

Пример такой, АЦП 14 бит, фильтрация, бпф, на выходе бпф 29 бит, далее мультиплексное перемножение реальной и мнимой части с вычислением корня (амплитудный спектр). Разрядность амплитудного спектра необходима меньше, чем 29 бит, нужно 16 бит. На каком-то этапе необходимо сделать масшабирование.

после каждого модуля фильтров - приводить разрядность к 16 (например)....

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


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

после каждого модуля - приводить разрядность к 16 (например)....

Так потеряю весь динамический диапазон, если буду приводить разрядность к 16 откидыванием младших разрядов. Шумы вообще не видны в данном случае, т.к. обрезаются младшие разряды ацп. Фактическое значение сигналов мне не нужно, нужно относительное, как бы в процентах, где 29 разрядов и где 16 разрядов.

 

Т.е. если сигнал при разрядности 29 бит составляет 60% или 10% от максимального значения, то и при 16 разрядах он тоже должен составлять 60% или 10% соответственно.

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

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


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

Т.е. если сигнал при разрядности 29 бит составляет 60% или 10% от максимального значения, то и при 16 разрядах он тоже должен составлять 60% или 10% соответственно.

выбрать какие-то средние 16 бит из 29 бит, чтобы выполнялось Ваше условие, не получается?

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


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

выбрать какие-то средние 16 бит из 29 бит, чтобы выполнялось Ваше условие, не получается?

Выбирая средние - обрезаешь максимальные и минимальные значения сигнала, хотя минимальные в меньшей степени, чем если обрезать только младшие разряды.

 

Постараюсь объяснить на примере: возьмем синусоиду с амплитудой от 0 до 255 это 8 разрядов для амплитуды. Если выбрать средние биты, например со 2го по 6ой, то обрежем максимумы и минимумы синусоиды. А мне нужно уменьшить диапазон амплитуды синусоиды, например от 0 до 112 с сохранением закона изменения синусоиды.

Если обрежем только младшие, то минимумы исчезнут (в минимумах будет постоянное значение).

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


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

Выбирая средние - обрезаешь максимальные и минимальные значения сигнала, хотя минимальные в меньшей степени, чем если обрезать только младшие разряды.

 

Постараюсь объяснить на примере: возьмем синусоиду с амплитудой от 0 до 255 это 8 разрядов для амплитуды. Если выбрать средние биты, например со 2го по 6ой, то обрежем максимумы и минимумы синусоиды. А мне нужно уменьшить диапазон амплитуды синусоиды, например от 0 до 112 с сохранением закона изменения синусоиды.

Если обрежем только младшие, то минимумы исчезнут (в минимумах будет постоянное значение).

Отбрасывая младший бит вы делите двоичное число на два. Появится погрешность, но закон изменения никуда не денется. Если была прямая построенная по точкам 8 16 32 64, то отбросив бит, получим 4 8 16 32, прямая идет по тому же закону. При отбрасывании рекомендую округлять, добавляя к тому что осталось старший бит из отбрасываемых. Погрешность будет появятся, но куда без погрешности если уменьшается разрядность числа.

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

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


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

Уменьшая с 28 бит до 14 бит, нужно отбросить 14 младших разрядов, а это от 0 до 16383 удаляется, у меня все шумы в этом диапазоне. Если речь идет об 1, 2, 3х разрядах, то да, проще отбросить и все.

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


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

Гость TSerg
Пример такой, АЦП 14 бит,

 

Если у Вас линейный АЦП на N-разрядов, то динамический диапазон DR = 20*Lg(2^N) = 84 дБ при N=14.

И хоть тресни, сколь-либо значительно его увеличить не получится.

Выполнять надо не логарифмирование после получения кода, а в процессе получения кода, т.е. использовать логарифмический АЦП, либо делать логарифмическую предкоррекцию аналогового сигнала.

 

Да, можно делать статистическую обработку (фильтрацию) и псевдо-увеличивать DR, но для этого надо повышать частоту семплирования и все равно останутся вопросы по спектру полезного сигнала.

В идеале +1 bit == 4 * Fsampling

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

 

Тут подробнее:

MT_003.pdf

 

А так, Ваши 28-29 бит из 14-ти - даром никому не нужны.

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


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

Если у Вас линейный АЦП на N-разрядов, то динамический диапазон DR = 20*Lg(2^N) = 84 дБ при N=14.

И хоть тресни, сколь-либо значительно его увеличить не получится.

Если просто брать сигнал с АЦП, то да, не получится. А если сузить полосу (у ТС речь идёт про БПФ, например) то можно неплохо динамику увеличить за счёт накопления (сужение полосы в 2 раза = +3дБ).

Думаю, автору стОит подумать о переводе в формат плавающей точки.

 

 

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


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

Гость TSerg

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

 

Думаю, автору стОит подумать о переводе в формат плавающей точки.

 

Это не принципиальный вопрос.

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


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

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

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

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

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

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

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

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

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

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