|
Перевод в дециБеллы, в контроллере в реальном времени |
|
|
|
 |
Ответов
|
Apr 19 2005, 11:43
|
Местный
  
Группа: Свой
Сообщений: 464
Регистрация: 20-10-04
Пользователь №: 924

|
Цитата(Dmitron @ Apr 19 2005, 14:13) В 16-битном контроллере есть 12-битное АЦП, необходимо значения АЦП перевести в дБ, Причём искомая величина х=10*log(100*отсчёты АЦП/4095), либо х=10*ln(100*отсчёты АЦП/4095). Сложность заключается в том, что рассчёты необходимо производить максимально быстро в реальном времени, желательно не выходя за размер 2 байт. Что можете порекомендовать? Таблицу.
|
|
|
|
|
Apr 20 2005, 08:34
|

Эксперт
    
Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183

|
Цитата(vvs157 @ Apr 19 2005, 18:04) Цитата(Dmitron @ Apr 19 2005, 16:56) а формулой слабо? 12 кБайт под ногами не валяется. Формулой и 2 байт и логарифм? А контроллер какой? можно и формулой LogRatio = 10*log(Ey/Ex) int LogRatio(int Exx, int Eyy) { int i, j; int i1, i2, v1, v2; // != 0 i1 = norm_l(Eyy+1); i2 = norm_l(Exx+1); j = i1 - i2; v1 = L_shl(Eyy, i1); v2 = L_shl(Exx, i2); v1 = (v2-v1+(1<<12))>>13; j = 3*j + (((v1>>1) + v1 + 0x02a3*j +(1<<15))>>16); return j; } Вычисления здесь 32-разрядные, используется библиотека ETSI (можно найти внутри референсного кода любого вокодера, для DSP - norm_l и L_shl - 32 разрядные операции выполняемые одной инструкцией), максимальная ошибка 1 дб в диапазоне -40 - + 40 дб. Но проще таблицей + интерполяцией. Хотя таблица + интерполяция при больших отношениях развалится и всё равно что-то нужно делать с двоичной экспонентой.
|
|
|
|
|
Apr 20 2005, 10:07
|
Знающий
   
Группа: Свой
Сообщений: 627
Регистрация: 24-03-05
Из: Севастополь
Пользователь №: 3 655

|
Вообщето контроллер - MSP430F149, 16-битный, с аппаратным умножением 2Б*2Б=4 Байта, 2 кБ ОЗУ,FW на Си. Предполагаемый диапазон - 0..20 дБ, точность - 0,2 дБ, хотелось бы 0,1 дБ (на части диапазона). Похоже действительно придётся в таблицу забивать и методом двоичного поиска рыскать. Что-то ряды меня не радуют: для получения аналогичной точности приходится вычислять до 10 степени. float ln_r(float t); { int i; float x; float ln_rec(int i); { float u; if (i<9) {число слагаемых в сумме} ln_rec:=1/(i+1)-x*ln_rec(i+1); else ln_rec:=1; } {// begin x:=t-1; i:=0; ln_r:=x*ln_rec(i); }// end; (переделывал с паскаля, за работоспособность не ручаюсь, но принцип работает)
Интерполяция - это хорошо, только с точностью проблемы. Более интересное решение - представить число в виде произведения (2^n)*(float k<2), 2^n взять табличное, а float k можно и вычислить, в диапазоне 0,1..2 дБ достаточно 4 слогаемых вместо 9.
--------------------
|
|
|
|
Сообщений в этой теме
Dmitron Перевод в дециБеллы Apr 19 2005, 11:13     fontp Да нет, с интерполяцией проблем обычно нет, если и... Apr 20 2005, 12:36      Helg 1. log10 функция не линейная и может принимать зна... Apr 23 2005, 23:17       Dmitron вообщето основная проблема была перевести в дБ, ис... Apr 26 2005, 09:42 -=Space=- а точность какая нужна?
можно сделать с табличкой... Apr 19 2005, 17:31 Miron Цитата(-=Space=- @ Apr 19 2005, 21:... Apr 20 2005, 08:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|