HTK代码中的log-add算法实现
来源:互联网 发布:手游录屏软件哪个好 编辑:程序博客网 时间:2024/05/24 06:57
在语音识别处理中,一般采用基于高斯混合模型的HMM框架。在模型的训练中(如htk的代码),涉及到大量的概率值计算,这些概率值往往是很小的浮点数。而且概率值相乘后会越变越小,计算起来会损失精度,为了保持准确度,统一将这些概率值进行log处理,再参与运算。也就是说,在代码中处理的概率是对数域的值,即:
p1' = logp1
p2' = logp2
在对数域中,乘法和除法变换为:loga*b = loga + logb; loga/b = loga - logb;
所以对于p=p1*p2,则转换到对数域后变为:p' = logp = logp1*p2 = logp1+logp2 = p1'+p2'
而加法则采用log-add算法:
log(A+B) = log(A(1+B/A)) = logA+log(1+B/A); where, A > B; if A < B then switch A and B in formula: For the ln(1 + B/A) term, the system can calculate:
log(B/A) = logB - logA
因此,对于p=p1+p2,变换到对数域后变成:
p' = logp = logp1+p2 = log(elogp1 + elogp2) = log(ep1'*(1+ep2'-p1')) = p1' + log(1+ep2'-p1')
HTK中的源代码如下:
代码中的参数x相当于p1',y相当于p2'
#define double LogDouble
/* EXPORT->LAdd: Return sum x + y on log scale,
sum < LSMALL is floored to LZERO */
LogDouble LAdd(LogDouble x, LogDouble y)
{
LogDouble temp,diff,z;
//exchange the x and y,if x<y
if
(x<y)
{
temp = x; x = y; y = temp;
}
diff = y-x;
//相当于B/A很小,那么log(1+B/A)这项就等于0,结果取决于logA这项。
if
(diff<minLogExp)
return
(x<LSMALL)?LZERO:x;
//如果logA很小则结果为LZERO,这是一个预定义的很小的数值
else
{
z =
exp
(diff);
return
x+
log
(1.0+z);
}
}
参考资料:
http://www.ck365.cn/anli/201104/27/22441.html
FPGA Implementation for GMM-Based Speaker Identification,Phaklen EhKan,1, 2 Timothy Allen,1 and Steven F. Quigley1。International Journal of Reconfigurable Computing,doi:10.1155/2011/420369
- HTK代码中的log-add算法实现
- 算法中的 log
- HTK中的wav文件格式
- HTK代码之内存管理
- HTK语音识别中的决策树
- JAVA中的排序算法及代码实现
- htk网络和解码源码(五、htk解码代码)
- c#写log代码实现
- 代码实现获取log日志
- andrid 读取log代码实现
- HTK
- HTK
- HTK
- htk
- android去掉代码中的log日志代码。
- HTK代码阅读之内存管理
- 修改HTK代码,让其支持中文
- HTK工具HVite代码分析1
- 斯坦福大学IOS开发课程笔记(第九课)
- java经典练习
- 第一天
- 排序算法1
- ubuntu安装chrome没有声音,chrome里面输入法不能用
- HTK代码中的log-add算法实现
- dom4j 处理 XML
- 分布式存储系统设计的关键问题
- bat批处理脚本编程之清理系统垃圾
- JAVA编程思想(2) - 操作符(二)
- JSP详解
- 免费的抢小米软件
- 批处理setlocal与变量延迟
- UE4 发布HTML5要点 (上)