log 和对数查找表matlab

1.对数运算

由于log10(x)=log2(x)/log2(10),以及ln(x)= log2(x)/log2(e),因此只对log2(x)进行查表即可。而log2(x)由于可以写成log2(a*2b)= log2(a) +b的形式,其中,b 为整数,1≤a<2,即查表的输入范围可以限制在1~2 之间。

对于对数查找表,log10(x)=log2(x)/log2(10),log2(10)=3.3219;所以当计算log2(x)以后,将计算结果除以log2(10)即可。log2(10)=1 / [ log10(2)],即log2(10)等于log10(2)分之一

对于无符号N bit输入数据的log2计算,由于数据为N bit ,数据范围为2^(N)-1对应取2的对数为log2(2^N-1))<N.

对于log2的计算:

整数部分可以由查找非零最高位leading位计算得到,例如,对于2^17+2^16+2^15,所以这个数据的log2计算整数应该是17,由最高分非零位的位置确定;

小数部分,在保证数据精度要求的基础上,例如如果rom地址位宽为10,深度为1024,可以存储1024个查找表的数值,所以可以取leading位及leading位以下的十位数据,作为查找表的输入,因为log2的整数部分由非零最高位leading位计算出来了,小数部分的计算取最高位开始的10位。查找表内存放的的是log2的对数值的小数部分定点化后的值。因为计算的结果为小数部分,计算结果小于1,所以输入的数值处于1~2之间,需要对查找表的输入进行2^10归一化。

 例如:假设addr_log为4,查找表深度为16,存放的是1~16个数据的查找表结果。想要计算16+8+4+2=30=11110的log2的对数的查找表结果。根据非零最高位,计算得到log2取对数的整数部分为4,

leading = 30/2^(4-4)=30;
log2_tmp1 = log2(leading/2^(addr_log))= log2( 1.8750 )=0.9069;对0.9069进行9bit定点化得到464;

10*log10(x)

10*log10(x)=10*log2(x)*log10(2)

% module name:    spl_log
% Description:     The lookup table logarithm function.%采用leading位计算Log
%input    wd2*2 = 48bit,因为输入数据为48bit,最大可表示为2^48-1,取2的对数的结果小于48.对应6bit。
%output   wd5 Q7.9 (0~128)
function spl_f = spl_log(power)
  global wd3 wd5;//wd3=9;wd5 = wd3+7;%WDRC spl位宽,Q7.9
  addr_log = 10; %ROM长度
  fp=16;% 10log10(2)=3.0103的位数,其中整数3,占2位  
  if
power == 0     M = 0;   else     M = floor(log2(power)); %计算非零最高位leading 位位置。如上图的Mbit所示位置   end   if M > addr_log   %查找表的数据位宽为addr_log     leading = floor(power/2^(M-addr_log));%截去leading的addr_log位后面的数,得到上图中的XL所示的数据     log2_tmp1 = log2(leading/2^(addr_log));%对1~2进行1024等分的log2查找表,
    %查找表内放的是1~2之间的数据的log2的对数值,对1~2进行1024等分,计算等分后的每一个数的log2的对数值,然后进行定点量化的结果,
    log2_tmp2 = log2_tmp1 + M;
    log2_tmp2_f = round(log2_tmp2 * 2^wd3);%查找表的值要进行9位量化,保留9位小数  
  else
    if power == 0       log2_tmp1 = 0;     else       log2_tmp1 = log2(power);     end     log2_tmp2 = log2_tmp1;     log2_tmp2_f = round(log2_tmp2 * 2^wd3);   end
  a = 10*log10(2);   a_f = round(a*2^(fp-2));   log10_f = floor(a_f*log2_tmp2_f/2^(fp-2)); %乘系数10log10(2)=3.01   if(max(log10_f)>=2^(wd5+1))%因为WOLA运算导致SPL增加,在用偏置校准前会溢出128,因此多加一位,Q8.9     warning('SPL log10计算结果溢出Q8.9位,SPL值为%d',max(log10_f)/2^(wd5-7))%超过128 end spl_f = log10_f; end

同样,指数运算只需对2x 进行查表,并且可以将输入的范围限制在0~1 之间。

计算10X/20

% module name: gain_exp
% Description: The lookup table exponential function.

% 需要输入dB小于128/log2(10)=38.53,保证gain的7位整数足够
% input gdb: Q7.9

function gain = gain_exp(gdb_f)
    global wd3 wd4;
    addr_exp = 10;
    fp = 16;
    b = log2(10)/20;
    b_f = round(b*2^(fp));
    index = find(gdb_f<0);
    gdb_f(index) = -gdb_f(index);
    gdb_exp_f = floor(gdb_f * b_f / 2^fp); %Q7.9
    gdb_exp_f(index) = -gdb_exp_f(index);
    gdb_exp_int_f = floor(gdb_exp_f/2^wd3);
    gdb_exp_dec_f = gdb_exp_f - gdb_exp_int_f*2^wd3;
    gdb_exp_dec = gdb_exp_dec_f / 2^wd3;
    gdb_exp_dec_q = round(gdb_exp_dec * 2^addr_exp) / 2^addr_exp;%查找表输入量化
    gdb_exp_int = gdb_exp_int_f;
    gain_tmp1 = 2.^gdb_exp_dec_q;%查找表
    gain_tmp1_f = round(gain_tmp1 * 2^(wd4));%查找输出表量化
    gain_tmp2_f = round(gain_tmp1_f.*2.^gdb_exp_int);
    gain = gain_tmp2_f;
end

 

posted @ 2023-03-08 00:23  luckylan  阅读(808)  评论(0)    收藏  举报