⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 placea.c

📁 语音LPC压缩算法源代码(C语音)
💻 C
字号:
/**************************************************************************	PLACEA Version 48*************************************************************************/#include "lpcdefs.h"#define lrange (AF-2)*LFRAME + 1#define hrange AF*LFRAMEplacea( ipitch, voibuf, obound, vwin, awin, ewin)int obound;int ipitch, voibuf[2][AF+1];int vwin[2][AF], awin[2][AF], ewin[2][AF];{/* Local variables and parameters	*/int i, j, k, l;short ephase, winv;static short allv;int temp;/*   Place the Analysis window based on the voicing window*   placement, onsets, tentative voicing decision, and pitch.**   Case 1:  Sustained Voiced Speech*   If the five most recent voicing decisions are *   voiced, then the window is placed phase-synchronously with the *   previous window, as close to the present voicing window if possible.*   If onsets bound the voicing window, then preference is given to*   a phase-synchronous placement which does not overlap these onsets.**   Case 2:  Voiced Transition*   If at least one voicing decision in AF is voicied, and there are no*   onsets, then the window is placed as in case 1.**   Case 3:  Unvoiced Speech or Onsets*   If both voicing decisions in AF are unvoiced, or there are onsets,*   then the window is placed coincident with the voicing window.**   Note:  During phase-synchronous placement of windows, the length*   is not altered from MAXWIN, since this would defeat the purpose*   of phase-synchronous placement.* Check for case 1 and case 2	*/allv =            (voibuf[1][AF-2] == 1)?1:0;allv = (allv && voibuf[0][AF-1] == 1)?1:0;allv = (allv && voibuf[1][AF-1] == 1)?1:0;allv = (allv && voibuf[0][AF  ] == 1)?1:0;allv = (allv && voibuf[1][AF  ] == 1)?1:0;winv = (voibuf[0][AF  ] == 1 ||  voibuf[1][AF  ] == 1)?1:0;if (allv || (winv && (obound == 0))) {/* APHASE:  Phase synchronous window placement.* Get minimum lower index of the window.		*/	i = (lrange + ipitch - 1 - awin[0][AF-2]) / ipitch;	i = i * ipitch;	i = i + awin[0][AF-2];/* L = the actual length of this frame's analysis window.	*/	l = MAXWIN;/* Calculate the location where a perfectly centered window would start.  */	k = (vwin[0][AF-1] + vwin[1][AF-1] + 1 - l) * 0.5;/* Choose the actual location to be the pitch multiple closest to this.	*/	temp = (float)((float)((float)(k - i) / (float)ipitch) + .5);	awin[0][AF-1] = i + temp  * ipitch;	awin[1][AF-1] = awin[0][AF-1] + l - 1;/* If there is an onset bounding the right of the voicing window and the* analysis window overlaps that, then move the analysis window backward* to avoid this onset.	*/	if (obound >= 2 && awin[1][AF-1] > vwin[1][AF-1]) {		awin[0][AF-1] -= ipitch;		awin[1][AF-1] -= ipitch;	}/* Similarly for the left of the voicing window.	*/	if ((obound == 1 || obound == 3) && awin[0][AF-1] < vwin[0][AF-1]) {		awin[0][AF-1] += ipitch;		awin[1][AF-1] += ipitch;	}/* If this placement puts the analysis window above HRANGE, then* move it backward an integer number of pitch periods.	*/	while (awin[1][AF-1] > hrange)	{			awin[0][AF-1] -= ipitch;		awin[1][AF-1] -= ipitch;	}/* Similarly if the placement puts the analysis window below LRANGE.	*/	while (awin[0][AF-1] < lrange)	{		awin[0][AF-1] += ipitch;		awin[1][AF-1] += ipitch;	}/* Make Energy window be phase-synchronous.	*/	ephase = 1;/* Case 3	*/}else	{	awin[0][AF-1] = vwin[0][AF-1];	awin[1][AF-1] = vwin[1][AF-1];	ephase = 0;}/* RMS is computed over an integer number of pitch periods in the analysis* window.  When it is not placed phase-synchronously, it is placed as close * as possible to onsets.  */j = ((awin[1][AF-1]-awin[0][AF-1]+1)/ipitch)*ipitch;if (j == 0 || !winv) {	ewin[0][AF-1] = vwin[0][AF-1];	ewin[1][AF-1] = vwin[1][AF-1];}else	 	if (!ephase && obound == 2) {		ewin[0][AF-1] = awin[1][AF-1] - j + 1;		ewin[1][AF-1] = awin[1][AF-1];	}	else	{		ewin[0][AF-1] = awin[0][AF-1];		ewin[1][AF-1] = awin[0][AF-1] + j - 1;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -