- 博客(95)
- 资源 (22)
- 收藏
- 关注
原创 Kaldi WFST最小化算法
WFST最小化算法最小化算法主要是在保证DFA识别的语言不变的条件下,将DFA中等价状态合并,减少状态数、转移边数,简化DFA结构,从而减少存储空间和运算时间。比较有名的最小化算法有Moore,Hopcroft以及Brzozowski等,本章主要针对Hopcroft算法进行优化。WFST Hopcroft最小化算法原理Hopcroft算法在初始阶段将所有状态划分为终结状态和非终结状态两个等价类,然后不断地根据分割集合对等价类进行分割,将状态集合划分为既不重叠又不为空的状态子集,直到所有等价类都无法继.
2020-07-08 09:40:25
1262
原创 Kaldi WFST确定化算法
WFST确定化算法因为NFA的状态转移不确定,不适合直接做语音识别,在算法实现时往往需要回溯,所以一般使用确定化算法将NFA转换为DFA。确定化算法主要是为了去除空边以及合并具有相同输入的公共边,最终使每个状态对某一个具体的输入,只有一个确定的输出,且每个状态没有空转移,如此可以极大的提升搜索的效率。Kaldi中采用的确定化算法叫“子集构造法”,该算法原本是为了处理FSA的确定化,然而,Kaldi将该算法的思想应用到了WFST上。OpenFST中确定化过程采用了两个独立又相关的算法:空边去除算法和确定.
2020-07-08 09:33:39
1401
原创 FFmpeg HEVC 环路滤波Bug分析一
和以往的视频编码标准类似,HEVC仍采用基于块的混合编码框架,一些失真效应仍然存在,如方块效应、振铃效应、颜色偏差以及图像模糊等等。为了解决这些问题,HEVC中采用了环路滤波技术,它其实是一种用于解码端的后处理滤波技术,主要包括去块滤波(Deblocking Filter,DBF)和样点自适应补偿(Sample Adaptive Offset,SAO)。DBF的作用与H.264类似,主要是去除方块...
2018-07-15 12:53:56
918
原创 快速浮点数exp算法
现在的深度神经网络中,经常会使用到sigmoid函数或者softmax函数,而这些函数中都使用了浮点数的幂指数函数(ex)。常规的数学函数库ex的精度高,但是速度慢,本文将介绍一种通过操作计算机中IEEE754标准浮点数的表示方法,在精度损失很小的条件下大幅提升计算性能的算法。1. IEEE浮点数表示1.1. 双精度浮点数表示64位的双精度浮点数中符号为1位,阶码域为11位,尾数域为5
2017-11-05 17:04:34
12736
2
原创 JPEG解码原理详解
1. JPEGJPEG是众多常见的图像编码格式之一,主要分为无损压缩和有损压缩,无损压缩利用空域相关性进行预测,主要用于医学、卫星遥感等领域;有损压缩主要通过DCT变换,然后进行量化来压缩数据。本文将以一个简单的16×8灰度图像作为例子,简单讲述JPEG图像解码的主要过程。1.1.JPEG图片结构 图1(a)所示的图片是一个简单的16×8的JPEG灰度图片,是由图1(b)
2017-09-03 10:31:51
17549
1
原创 JPEG标准DCT优化实现
1. JPEG DCTJPEG是众多常见的图像编码格式之一,主要分为无损压缩和有损压缩,无损压缩主要利用空域相关性进行预测,主要用于医学、卫星遥感等领域;而有损压缩主要通过DCT变换,然后进行量化来压缩数据。与现有的H264和H265视频编码标准中的整数DCT变换不同,JPEG中的DCT是浮点变换。为了加快DCT运算速度,libjpeg使用了三种DCT算法:分别是浮点DCT变换、整数化的DC
2017-08-27 15:25:11
3764
2
原创 FFmpeg H264/H265边界填充二--videodsp.asm
在前面已经详细的分析了边界填充算法的C语言优化实现,在C语言的实现中主要是用memcpy来实现,为了提高效率FFmpeg利用了mmx、xmm和ymm等寄存器进行指令集优化。FFmpeg中和边界填充相关的优化主要在 “videodsp.asm”中实现,在下面的源代码中已经详细的分析了边界填充汇编优化代码的实现。;******************************************
2017-05-13 10:37:10
1205
原创 FFmpeg H264/H265边界填充一
在H264和H265编解码标准中,运动补偿的参考像素可越过参考图像的边界。图像边界之外的参考像素是不存在的,标准使用边界处的像素来填充处于边界之外的像素值。1. 标准填充标准对填充的算法做了如下的描述,如图1所示的两个图,分别描述了H264和H265亮度分量的标准填充算法(H265色度和亮度分量的填充算法是一致的,但是由于H264色度运动补偿和亮度补偿算法不一致,所以H264色度的填充方
2017-05-07 16:57:58
2762
原创 FFmpeg x86汇编优化一--x86inc.asm分析
在我的印象中,有几个版本的FFmpeg中有Intrinsic优化的指令集代码。可能是由于纯汇编的性能和灵活性,随着版本的迭代,现在优化代码已经逐渐替换成了纯汇编代码。FFmpeg中的纯汇编代码使用了nasm汇编语法格式,且使用了x264工程中的两个汇编源文件“x86inc.asm”和“x86util.asm”。其中“x86inc.asm”中对寄存器、堆栈和函数调用等做了一个跨平台的约定。本文将主要
2017-04-22 13:26:20
6800
2
原创 FFmpeg解码库裁剪和调试三--Android Studio调试FFmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源项目。FFmpeg是在Linux平台下开发,而Android是现在非常火爆的移动平台,由于Android平台与Linux的亲缘关系,所以将FFmpeg源代码移植到Android平台比前面讲述过的VS平台调试方法相比自然是简单许多。 本章主要介绍提取FFmpeg中的H264代码并在Android Studio中
2017-03-13 22:13:50
3211
1
原创 FFmpeg解码库裁剪和调试二--Eclipse调试FFmpeg
1. FFmpeg和Cygwin介绍FFMPEG是目前功能比较强大的开源数字媒体处理项目之一。 由于该项目是使用Make作为项目的编译构建工具,因此,如果要想将FFmpeg源代码不加修改地移植到VisualStudio上进行编译和调试,以我目前有限的知识来说是不太可能的。在上一篇文章中,我简单介绍了利用MinGW编译出解码库供VisualStudio使用的方法,更进一步地演示了一种从FF
2017-02-20 21:57:36
1624
原创 FFmpeg解码库裁剪和调试一--Visual Studio调试FFmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源项目。FFmpeg是在Linux等平台下开发,如果想在Windows平台下调试,主要有两种方法:第一使用Cygwin+Eclipse的方式模拟Linux环境进行调试;第二种方法是提取FFmpeg中对应的解码库在Visual Studio 2013及以上的VS中IDE中调试,之所以要在VS2013及其以上的IDE中调试主要从V
2017-02-19 22:32:29
1808
原创 VLC一--零阶指数哥伦布码解码原理和实现
指数哥伦布编码属于变长编码,其基本原理是用短码字表示出现频率较高的信息,用长码字表示出现频率较低的信息。 1.1. 指数哥伦布编解码原理指数哥伦布编码也是变长编码的一种,指数哥伦布编码也是由前缀和后缀组成。K阶指数哥伦布码的组成如图1(a)所示:分为m个前缀0,一个比特1和m+k个后缀。解析时首先从比特流当前位置开始寻找第一个非零比特,并将找到的0比特个数记为m,第一个非零比特
2016-12-18 09:51:59
5007
原创 VLC二--H264/AVC中CAVLC的FFmpeg实现
static int decode_residual(const H264Context *h, H264SliceContext *sl, GetBitContext *gb, int16_t *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){ static const int c
2016-12-04 16:31:32
2711
原创 CABAC基础四-CABAC熵解码算法FFmpeg实现
1. CABAC熵解码算法FFmpeg实现本章主要讲解FFmpeg中对CABAC熵解码算法的实现和优化思路。由于算术编码算术在H264和H265中没有发生变化,所以FFmpeg中H265的熵解码仍然采用了H264中的实现方式,所以,在H265的CABAC部分,仍然可以看到有的数组的定义中带有H264的名字,如ff_h264_lps_range和ff_h264_mlps_state等等。1
2016-11-06 13:37:41
5532
5
原创 CABAC 基础三-M Coder
1. CABAC上下文模型1.1. MCoder如第二章所述,算术编码一般采用区间递归分隔的方法来进行。在CABAC的二值化算术编码中,区间使用区间的左端点L和区间的长度R两个变量来表示。则:RLPS = pLPS* R (8)其中,pLPS表示LPS符号出现的概率,RLPS表示LPS符号对应的区间,与此相反MPS符号对应的区间大小为:
2016-10-07 21:51:46
4037
1
原创 CABAC 基础二-算术编码
1. 算术编码与变长编码不同,算术编码的本质是为整个输入序列分配一个码字,而不是给每个字符分别指定码字,因此平均意义上可以为单个字符分配码长小于1的码字。算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在L到H之间。编码过程中的间隔决定了符号压缩后的输出。给定事件序列的算术编码步骤如下:1.
2016-09-03 23:18:04
9165
原创 CABAC基础一-二值化
1. 二值化在HEVC中主要包括截断莱斯编码(Truncated Rice),指数哥伦布编码(Exp-Golomb)和定长编码。 1.1. TRTR二值化需要输入三个参数:synVal表示将要进行TR二值化的值,cRiceParam表示莱斯参数,cMax表示门限值。TR二值化的结果由两部分组成:前缀prefixVal是一元码,后缀suffixVal是定长码,后缀长度为cRice
2016-08-28 17:28:12
4140
转载 Fermat-Torricelli-Viviani问题
物理方法解决数学问题(四):Fermat-Torricelli问题 据说,17世纪时,大数学家Fermat曾向意大利的物理学家和数学家Torricelli提出过这样一个问题:在已知锐角三角形ABC内求一点P,使得PA+PB+PC最小。Torricelli证明了,这个点是存在的,且∠APB=∠BPC=∠CPA=120°。他还指出,若分别以AB、BC、AC为边向外作等边三角形ABC'、B
2015-03-14 14:28:31
1671
原创 有限自动机字符串匹配_KMP算法计算状态转换表
#include #include #include using namespace std;int * compute_prefix_function(string str)//计算字符串的前缀函数{ int m=str.length(); int q=-1; int *prefix_table=new int[m]; prefix_table[0]=q; for(int
2014-06-23 21:20:17
1701
原创 rabin-karp二维字符数组匹配
#include #include #include using namespace std;void two_d_rabin_karp_matcher(char **T,int n1,int n2,char **P,int m1,int m2,int d,int q)//二维模式匹配{ int *pattern=new int[m2]; int *text=new int[n2]
2014-06-20 16:36:49
2119
原创 算法导论32.1-4-带间隔符的pattern匹配字符串
#include #include #include #include using namespace std;//算法导论第三版32.1-4void string_matcher(string &strSrc,vectorvecStr,int index,int pos,vector &vec_result)//查找所有出现的匹配模式{ int depth=vecStr.size
2014-06-17 16:27:38
1751
原创 邻接矩阵计算节点对最短路径
#include #include using namespace std;void extend_shortest_paths(int **matrix,int **W,int **result,int n)//计算最短路径{ for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ int min=numeric_limits::max();
2014-05-29 12:03:47
3756
原创 算法导论_不相交集合
#include #include using namespace std;//不相交集合森林typedef struct disjoint_set_forest_node{ int value;//结点值 disjoint_set_forest_node *parent;//父亲结点 int rank;//结点的秩}disjoint_set_forest_node,*pDisjo
2014-05-03 11:23:05
1326
原创 斐波那契堆抽取最小值_关键字减值_删除
#include #include #include #include using namespace std;typedef struct fib_heap_node{//斐波那契堆结点 int key;//结点值 int degree;//结点度 fib_heap_node *parent;//结点的父结点 fib_heap_node *left;//结点的左兄弟,循环双链表
2014-04-27 10:21:42
2312
原创 B树的插入和删除
#include #include using namespace std;#define BTree_T 2#define BTree_N ((2*BTree_T)-1)//BTree_T 表示B树的度,BTree_N表示B树的最大关键字个数typedef struct BTree{ int keyNum;//保存关键字的个数 int key[BTree_N];//存储关键字
2014-04-19 21:00:24
1827
原创 最小平均完成时间调度问题_最小化完成时间
#include #include #include using namespace std;typedef struct list{ int id; int left_time; list *next;}list,*plist;typedef struct queue{ list *front; list *tail;}queue,*pqueue;void ini
2014-04-12 16:34:01
6234
原创 哈夫曼编码
#include #include #include using namespace std;typedef struct min_heap{//最小堆 int value; min_heap *left,*right;//左右结点}min_heap,*pmin_heap;typedef struct list{//双向链表实现栈 int value; list *next
2014-04-10 09:38:58
1240
原创 分数背包问题
#include#include #include#include using namespace std;int partition(double *ration,int *v,int *w,int low,int high)//快速排序子程序{ double pivot=ration[high]; int k=low-1; double tmp; int tmp2; f
2014-04-08 13:22:09
1203
原创 活动选择问题变形_值之和最大的兼容活动子集
#include#include #includeusing namespace std;void dynamic_max_value_activity_selector(int *s,int *f,int *val,int **c,int **act,int n)//动态规划-自底向上{ for(int i=0;i<n;++i){ c[i][i]=0;//如果只有一个元素,则两
2014-04-06 13:40:24
1944
原创 按照主关键字和次关键字排序
#include#includeusing namespace std;void quick_sort(int *s,int *f,int low,int high)//快速排序,安装活动的开始时间升序排序{ while (low<high){ int pivot=s[high]; int k=low-1; int tmp; for(int i=low;i<high;+
2014-04-05 14:11:43
4257
原创 最少教室问题与区间图着色问题类似
#include#include #includeusing namespace std;typedef struct list{ int tag;//教室编号 int time;//活动的结束时间 list *next;//下一个活动}list ,*plist;void minimum_lecture_hall(plist &busing,plist &free,int *
2014-04-05 14:00:10
1081
原创 活动选择问题
#include#include using namespace std;void recursive_activity_selector(int *s,int *f,int l,int h)//递归贪心算法{ int m=l+1; while (m<=h && s[m]<f[l]){ ++m; } if(m<h){ cout<<m<<"\t"; recursive_
2014-04-04 10:33:06
750
原创 强连通分量
#include #include #include using namespace std;typedef struct Link_graphic{//邻接表 int value; Link_graphic *next;}Link_graphic,*pLink_graphic;typedef struct Queue{//队列 Link_graphic *front,*ta
2014-03-31 11:01:00
711
原创 图的拓扑排序—递归—迭代
#include #include #include using namespace std;typedef struct Link_graphic{//邻接表 int value; Link_graphic *next;}Link_graphic,*pLink_graphic;typedef struct Queue{//队列 Link_graphic *front,*ta
2014-03-27 10:39:06
1182
原创 整齐打印
#include #include #include #include #include #include #include using namespace std;const static int M = 80;void print_neatly(vector&vec,int **extras,int **lc,int *c,int *p,int n)//整齐打印{ fo
2014-03-18 09:06:26
987
原创 双调欧几里得旅行商问题
#include #include #include using namespace std;typedef struct point{ int x,y;}point,*ppoint;void quick_sort_partition(ppoint *pp,int low,int high)//快速排序{ while (low<high){ ppoint pKey=pp[
2014-03-17 13:29:45
1059
原创 最长回文子序列
#include #include using namespace std;void longest_palindrome(char *s,int **p,int length){ for(int i=0;i<length-1;++i){//初始化数组相关信息 p[i][i]=1; int j=i+1; if(s[i]==s[j]){ p[i][j]=2; }el
2014-03-15 14:54:35
911
Speech Recognition Algorithms Using Weighted Finite-State Transducers
2018-06-24
H264中CAVLC的FFmpeg实现
2016-12-04
H264/AVC中CAVLC的FFmpeg实现
2016-12-04
VisualGDB调试Android JNI和Linux项目
2016-05-08
YUVviewer-HEVC
2013-05-25
基于OPENCV的超声图像增强
2012-05-17
编译原理 词法分析 。。。。。。。。。。。
2011-06-08
都市行 公交查询 j2me
2010-05-08
深入浅出Android--Google手持设备应用程序设计.pdf
2010-05-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人