3 lpc系数转成lsf系数 AtoLsp
首先解释一下为什么需要lsf(lsp)系数
A(z)在形式上不是以因式分解给出的,如果直接设一个lpc码本表,
对lpc系数进行矢量量化,则某个lpc系数的误差对信号整个频域的影响,
为了消除这种误差影响,我们自然地想到了利用A(z)方程的因式分解形式,
也就是说对A(z)=0的根建立码本表,对其进行矢量量化,这样每个量化后根
的误差,只对某个频域的产生影响.
lsf系数即是通过对A(z)进行变形,然后求根,它是变形后的A(z)的根.
而且它的特点是,所有的根一定在单位圆上,这就对计算机处理提供了便利
(A(z)=0的根显然不会都在单位圆上,这将导致极复杂的求根过程以及量化计算量)
现在介绍A(z)的变形
我们定义
P(z) = A(z) + Z^-(P + 1)A(z^-1)
Q(z) = A(z) - Z^-(P + 1)A(z^-1) p是阶数,在lpc10阶里 p=10
而线谱对的真正含义是以下这两个形式的根即, P1(z)=0 以及Q1(z)=0的根
P1(z) = P(z)/(1 + z^(-1))
Q1(z) = Q(z)/(1 - z^(-1))
除(1 + z^(-1)) 是为了将 1 -1这样的根去除,降次
P(z) Q(z)对称多项式,特点是根一点在单位圆上,并且分别是在单位元上交错出现的
相应的证明请参考
F.K.Soong and B.H.Juang 的"Linear Spectrum Pair(LSP) and Speech Data Compression"
IEEE IC on ASSP,1984,pp.1.10.1-1.10.4
http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=1172448 这个为网址,文档似乎是要付费的...
http://en.wikipedia.org/wiki/Line_spectral_pairs
维基百科上的解释,似乎跟P(z)是对称多项式的性质有关,导致了它的根出现在单位圆上
AtoLsp
lpc系数转成lsp系数
首先做了带宽扩展
/*
* Perform a bandwidth expansion on the LPC coefficients. This
* scales the poles of the LPC synthesis filter by a factor of
* 0.994.
*/ //lsc 理解 相当于对冲激响应序列依次乘以 0.994 0.994^n在傅里叶变换的幅值是一个碗状,在0-2派之间,
//与冲激响应进行卷积时,会让冲激响应的带宽扩展
for ( i = 0 ; i < LpcOrder ; i ++ )
LspVect[i] = mult_r( Lpc[i], BandExpTable[i] ) ;//lsc 相乘后得到的值是原值
P(z) 与 Q(z)的根是共轭对称的 很容易证出如果 z是p(z)=0的根,那个 z^-1也是p(z)的根,
在单位圆上,即说明p(z)的根是共轭对称出现
在进行长除法之前,先把 p(z) q(z)的定义详细说明一下,以及搜索时用到的一个变形也在下面给出:
P(z) = A(z) + Z^-(P + 1)A(z^-1) A(z) = 1 - a1*z^-1 - a2*z^-2 - ... - a10*z^-10 z^-n表示 z的-n次方
Q(z) = A(z) - Z^-(P + 1)A(z^-1)
P1(z) = P(z)/(1 + z^(-1))
Q1(z) = Q(z)/(1 - z^(-1)) ---- 根其实一样,做除法降次,去掉了 z=1 z=-1这样的根,因为这两个根本身不包含特征信息
P1(z)分母 = z^-11 + (-a1 - a10)z^-10 + (-a2 - a9)z^-9 + ... (-a1 - a10)z^-1 + 1
Q1(z)分母 = -z^-11 + (a1 - a10)z^-10 + (a2 - a9) z^-9 + ... (a1 - a10) z^-1 + 1
A(z) = 1/2 {P(z)(1 + z^{-1}) + Q(z)(1-z^{-1})} --- 从这里看出了itu对P1(z) Q1(z)的定义(网上流行有各种版本定义,让笔者纠结了很久...)
P1(z) = b0(z^-10 + 1) + b1(z^-9 + z^-1) + ... + b5 * z^-5
= z^-5(b(z^-5 + z^5) + b1(z^-4 + z^-4) + ... + b5) --- z= e^jw代入
= z^-5 * (b0 * 2cos(5w) + b1 * 2cos(4w) + ... + b5) b5是需要除2的,因为其它系数有个乘2因子
接下来,itu开始执行长除法,得到p1(z) q1(z)的系数
代码片段与注释
/*
* Set p_0 = q_0 = 1. The LPC coefficients are already scaled by
* 1/4. P(z) and Q(z) are scaled by an additional scaling factor of
* 1/16, for an overall factor of 1/64 = 0x02000000L.
*/
Lpq[0] = Lpq[1] = (Word32) 0x02000000L ;//lsc 0x80000000的1/64 1/4的lpc缩放源自语音信号本身缩小了1/2,而1/16的缩放见下面的代码段 这里认为是最高次 z^-11的系数
/*
* This loop computes the coefficients of P(z) and Q(z). The long
* division (to remove the real zeros) is done recursively.
*/ //lsc这个循环实际在执行多项式除法,求出pz qz的每阶的系数,求出前6个,后5是不需要求的,因为一样(可以通过多项式除法的定义,以及P(z)系数的对称性,推导出来)
for ( i = 0 ; i < LpcOrder/2 ; i ++ ) {
//lsc -11这个阶就不用求了,根据多项式除法定义,这个值一定是1
/* P(z) */
Acc0 = L_negate( Lpq[2*i+0] ) ; //lsc 根据多项式长除法,向低阶次"借"了 高阶次的系数(完成了长除法后的),应扣减
Acc1 = L_deposit_h( LspVect[i] ) ;
Acc1 = L_shr( Acc1, (Word16) 4 ) ;
Acc0 = L_sub( Acc0, Acc1 ) ;//lsc 系数的规律 如 -10这个阶,它应该是 -(a10 + a1),所以对应该阶次的系数还应再减去相应的值
Acc1 = L_deposit_h( LspVect[LpcOrder-1-i] ) ;
Acc1 = L_shr( Acc1, (Word16) 4 ) ;
Acc0 = L_sub( Acc0, Acc1 ) ;//lsc 这里完成了长除法 以-10这个阶为例 - a1 - a10 - 1(对照长除法结果, z^-11 + 1 - 1, 导到了-1的产生,而z^-10系数为-a1 - a10导致了这个结果)
Lpq[2*i+2] = Acc0 ;
/* Q(z) */ //lsc 这段同上,也是完成多项式长除法,就不详细分析了
Acc0 = Lpq[2*i+1] ;
Acc1 = L_deposit_h( LspVect[i] ) ;
Acc1 = L_shr( Acc1, (Word16) 4 ) ;
Acc0 = L_sub( Acc0, Acc1 ) ;
Acc1 = L_deposit_h( LspVect[LpcOrder-1-i] ) ;
Acc1 = L_shr( Acc1, (Word16) 4 ) ;
Acc0 = L_add( Acc0, Acc1 ) ;//lsc - a1 + a10 + 1(对照长除法结果 - z^-11 + (1 - 1)z^-10,产生-1项留给z^-10,而z^-10的系数应为a1 - a10,导致了 -a1 + a10 -1,取反,(1-z^-1)最终结果是 -a1 + a10 + 1)
Lpq[2*i+3] = Acc0 ;
最后一项没有乘2因子,所以要缩小一半
/*
* Divide p_5 and q_5 by 2 for proper weighting during polynomial
* evaluation.
*/
Lpq[LpcOrder+0] = L_shr( Lpq[LpcOrder+0], (Word16) 1 ) ;
Lpq[LpcOrder+1] = L_shr( Lpq[LpcOrder+1], (Word16) 1 ) ;//lsc 其它项都有乘2因子,唯最后一项是没有的
接下来对所有系数归一化,这里就不列举代码片段了,
然后是查cos表,在单位圆上暴力搜索过零值,求根
利用了这个等式求根
P1(z) = z^-5 * (b0 * 2cos(5w) + b1 * 2cos(4w) + ... + b5)
对cos表里的每个角度,计算当前值,与PrevVal值进行比较,如果异号,说明过零了
代码片段
CurrVal = L_mac( CurrVal, Spq[LpcOrder-2*j+k],
CosineTable[i*j%CosineTableSize] ) ;// j次方,对应复数就是角度被乘积,需要乘j
会根据PrevVal CurrVal 的比例,线性地计算小数点后7位,代码片段如下
Acc0 = L_abs( CurrVal ) ;
Acc1 = L_abs( PrevVal ) ;
Acc0 = L_add( Acc0, Acc1 ) ;
/* Normalize the sum */
Exp = norm_l( Acc0 ) ;
Acc0 = L_shl( Acc0, Exp ) ;
Acc1 = L_shl( Acc1, Exp ) ;
Acc1 = L_shr( Acc1, (Word16) 8 ) ;
LspVect[LspCnt] = div_l( Acc1, extract_h( Acc0 ) ) ;//此举的意义是保留小数点后7位,即得到的应该是 n.?? 0 < n < 256 n即当前下标i
最终得到的lsp是由9位整数部分,7位小数部分组成的,代码片段如下:
Exp = shl( (Word16) (i-1), (Word16) 7 ) ;
LspVect[LspCnt] = add( LspVect[LspCnt], Exp ) ;//得 9 + 7 即的浮点数 lsp频率
如果没有搜索到10根,则沿用之前帧的lsp系数.
致此,完成了lpc到lsp的转换
Lsp_Qnt
lsp量化,分将10个lsp系数分成 3 + 3 + 4 分别在码本里按欧式距离最小的规则进行矢量量化,待续
林绍川
2011.05.06 于杭州
分享到:
相关推荐
4. **调试与测试**:在分析源码的过程中,进行调试和测试是必不可少的。这可以通过模拟不同的输入信号,观察输出结果,验证编码器是否按预期工作。同时,对比编码后的数据与标准库的结果,有助于发现潜在的问题和...
标题中的"LPC2400系列开发平台例程源码LPC2478_LPC2468开发板配套程序软件源码资料"是指基于NXP公司的LPC2400系列微控制器,特别是LPC2478和LPC2468型号的开发资源。这些微控制器是基于ARM9架构的嵌入式处理器,广泛...
在Keil4中开发LPC2378的IAP功能,需要配置好工程设置,确保编译后的二进制文件能够正确地定位到Code区。此外,还需要编写IAP相关的C代码,定义和调用IAP的入口地址以及相关API函数,如IAP_PrepareSector、IAP_Copy ...
开发者可以通过分析和修改这些源码,以适应不同的LPC系列MCU或者优化通信效率。 数据手册是理解MCU功能和操作的关键文档,NXP的MCU数据手册会详细说明ISP协议的具体细节,如通信接口(如UART、SPI或I2C)、命令格式...
标题“LPC1766 cos源码”指的是基于NXP LPC1766微控制器的Cortex-M3内核操作系统Cos(可能是ChibiOS或COsMIC)的源代码。LPC1766是NXP半导体公司推出的一款基于ARM Cortex-M3处理器的微控制器,广泛应用于嵌入式系统...
G.721, G.711, G.729, G.723 和 G.722 是国际电信联盟(ITU)制定的一系列音频压缩标准,用于提高语音质量和降低带宽需求。以下是对这些编码格式的详细解释,以及如何通过C语言实现它们的编码和解码过程。 1. **G....
【标题】"LPC1768项目源码"揭示了这是一个基于NXP LPC1768微控制器的开发项目,可能包含了一系列用于控制、通信或其他功能的代码。LPC1768是NXP公司生产的Cortex-M3内核微控制器,常用于嵌入式系统设计,具有丰富的...
本篇将详细介绍如何利用LPC2214 ARM7最小系统开发板进行软件测试,并结合KEIL uVision4(以下简称KEIL4)进行工程源码的编写与调试。 首先,LPC2214 ARM7最小系统开发板是进行硬件原型设计和软件开发的基础平台。它...
在本资源包中,重点探讨的是如何利用MATLAB进行线谱对(Linear Spectral Pair, LSP)与LPC(Linear Predictive Coding,线性预测编码)谱之间的转换,并实现频谱的还原。这些技术在语音处理、音频编码和信号分析等...
提供的源码实例“LPC17xx-FreeRTOSV8.0.1-Port-Lwip(u0123)”应该包含了以上所有步骤的实现,包括相关的头文件、配置文件、C源代码和可能的Makefile。通过分析这些文件,我们可以学习到如何在FreeRTOS上构建一个完整...
而ATAL和SCHROEDER的研究更是LPC领域内的经典,他们在1978年的研究中详细讨论了基于全极点表示的语音线性预测分析。 进一步地,文献中提及的改进型LPC特征参数对语音识别效果的影响、LPC技术在音频文件上的应用、...
【标题】"周立功lpc24XX usb 源码" 提供的是针对NXP LPC24XX系列微控制器的USB(通用串行总线)开发源代码,这是一套涵盖了USB主机(Host)、设备(Device)以及OTG(On-The-Go)模式的完整实现。LPC24XX是NXP半导体...
【LPC1100 Bootloader程序源码】是一个针对NXP LPC1100系列微控制器的引导加载程序,其主要功能是实现通过IAP(In-Application Programming)进行固件更新。Bootloader是系统启动时的第一段代码,负责初始化硬件、...
【EM-LPC1788开发板源码】是一组专为基于NXP LPC1788微控制器的开发板设计的程序代码。LPC1788是NXP半导体公司生产的一款Cortex-M3内核的微控制器,广泛应用于嵌入式系统设计,如物联网(IoT)设备、工业自动化、智能...
通过学习和分析这些源码,开发者可以深入理解LPC1788的硬件特性,掌握如何编写高效的C语言代码来控制微控制器,并且能够快速地移植到其他类似的项目中。同时,这些示例代码也是进一步开发基于LPC1788的嵌入式系统的...
#### 二、G.723.1语音编码算法原理 G.723.1算法是基于码激励线性预测(CELP)技术的一种改进版本,它结合了MP-MLQ和ACELP两种方法,能够在保持良好语音质量的同时,显著降低所需的带宽。具体来说: 1. **MP-MLQ**...
在G.729a编码中,LPC技术被用来分析语音信号的统计特性,生成一系列系数,这些系数能有效代表原始音频的特征,同时大大减少数据量。 `G729a_LPC_extract.py` 是这个项目的核心脚本,它实现了对G.729a编码音频的LPC...
**LPC10-1.5语音编码C源码详解** LPC10-1.5是一种低速率语音编码技术,常用于节省带宽的通信系统中,如早期的无线通信、电话网络或数据传输。它基于线性预测编码(LPC)原理,通过分析语音信号的频谱特性,用较小的...
在描述中提到的"lpc2214驱动源码"包含了对LPC2214中多种接口的驱动程序实现,包括串口、GPIO(通用输入/输出)和I2C(集成电路互连)。 1. **串口(UART)**:通用异步接收发送器是微控制器中常见的通信接口,用于...
**源码分析:** LPC1700 IAP DEMO提供的源码示例,通常包括了上述步骤的实现,可能包含以下关键部分: - **IAP函数库**:封装了Flash的擦除和编程操作,提供给应用程序调用。 - **主程序**:负责与用户界面交互,...