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

📄 c3_10pf.c

📁 完整的EVRC压缩解压缩算法源码,附带一个简单的例子程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
		}
		cor = L_mac(cor, *ptr_h1, *ptr_h2);
		ptr_h1++;
		ptr_h2++;
		*p1 = extract_h(cor);
		cor = L_mac(cor, *ptr_h1, *ptr_h2);
		ptr_h1++;
		ptr_h2++;
		cor = L_mac(cor, *ptr_h1, *ptr_h2);
		ptr_h1++;
		ptr_h2++;
		*p0 = extract_h(cor);

		pos -= NB_POS;
		ptr_hf += STEP;
	}

	/* storage order --> i1i2, i0i1 */

	pos = MSIZE - 1;
	ptr_hf = h + 5;

	for (k = 0; k < NB_POS; k++)
	{
		p1 = &rrixiy[1][pos - 1];
		p0 = &rrixiy[0][pos - 1];

		cor = 0x00008000L;		/* 0.5 (for rounding) */
		ptr_h1 = h;
		ptr_h2 = ptr_hf;

		for (i = k + (Shortword) 1; i < NB_POS; i++)
		{
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			*p1 = extract_h(cor);
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			*p0 = extract_h(cor);
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;

			p1 -= (NB_POS + 1);
			p0 -= (NB_POS + 1);
		}

		pos--;
		ptr_hf += STEP;
	}

	/* storage order --> i0i2 */

	pos = MSIZE - 1;
	ptr_hf = h + 4;

	for (k = 0; k < NB_POS; k++)
	{
		p0 = &rrixiy[2][pos];

		cor = 0x00008000L;		/* 0.5 (for rounding) */
		ptr_h1 = h;
		ptr_h2 = ptr_hf;

		for (i = k + (Shortword) 1; i < NB_POS; i++)
		{
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			*p0 = extract_h(cor);
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;

			p0 -= (NB_POS + 1);
		}
		cor = L_mac(cor, *ptr_h1, *ptr_h2);
		ptr_h1++;
		ptr_h2++;
		*p0 = extract_h(cor);

		pos -= NB_POS;
		ptr_hf += STEP;
	}

	/* storage order --> i0i2 */

	pos = MSIZE - 1;
	ptr_hf = h + 3;

	for (k = 0; k < NB_POS; k++)
	{
		p0 = &rrixiy[2][pos - 1];

		cor = 0x00008000L;		/* 0.5 (for rounding) */
		ptr_h1 = h;
		ptr_h2 = ptr_hf;

		for (i = k + (Shortword) 1; i < NB_POS; i++)
		{
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			*p0 = extract_h(cor);
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;
			cor = L_mac(cor, *ptr_h1, *ptr_h2);
			ptr_h1++;
			ptr_h2++;

			p0 -= (NB_POS + 1);
		}

		pos--;
		ptr_hf += STEP;
	}

 /*-------------------------------------------------------------------*
  *                 SEARCH THE BEST CODEVECTOR.                       *
  *                                                                   *
  * complexity: 8x8x8 = 512 tests                                     *
  *-------------------------------------------------------------------*/

	/* default value */
	psk = -1;
	alpk = 1;
	codvec[0] = 0;
	codvec[1] = 2;
	codvec[2] = 4;

	p0 = rrixix[0];
	p2 = rrixiy[0];
	p4 = rrixiy[2];

	for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
	{
		ps0 = dn[i0];
		alp0 = *p0++;

		p1 = rrixix[1];
		p5 = rrixiy[1];

		for (i = 0; i < NB_POS; i++)
			cor_l2[i] = add(rrixix[2][i], *p4++);

		for (i1 = 2; i1 < L_SUBFR; i1 += STEP)
		{
			ps1 = sub(ps0, dn[i1]);
			/* alp1 = alp0 + rr[i1][i1] - 2.0 * rr[i0][i1]; */
			alp1 = add(alp0, sub(*p1++, *p2++));

			p3 = cor_l2;

			for (i2 = 4; i2 < L_SUBFR; i2 += STEP)
			{
				ps2 = add(ps1, dn[i2]);
				/* alp2 = alp1 + rr[i2][i2] + 2.0 * (rr[i0][i2] - rr[i1][i2]); */
				alp2 = add(alp1, sub(*p3++, *p5++));

				ps2 = mult(ps2, ps2);
				s = L_msu(L_mult(alpk, ps2), psk, alp2);

				if (s > 0)
				{
					psk = ps2;
					alpk = alp2;
					codvec[0] = i0;
					codvec[1] = i1;
					codvec[2] = i2;
				}
			}
		}
	}

 /*-------------------------------------------------------------------*
  * Build the codeword, the filtered codeword and index of codevector.*
  *-------------------------------------------------------------------*/

	ps2 = sub(add(dn[codvec[0]], dn[codvec[2]]), dn[codvec[1]]);

	for (i = 0; i < l_subfr; i++)
	{
		code[i] = 0;
	}

	if (ps2 < 0)
		index = 1;				/* global sign */
	else
		index = 0;

	for (k = 0; k < NB_PULSE; k++)
	{
		i = codvec[k];			/* read pulse position */

		pos = mult(i, Q15_1_7);	/* pos = position/7 */
		index = add(shl(index, 3), pos);

		if (((k != 1) && (ps2 >= 0)) || ((k == 1) && (ps2 < 0)))
		{
			if (i < l_subfr)
				code[i] = 4096;	/* codeword in Q12  format */
			codvec[k] += (2 * L_SUBFR);
		}
		else
		{
			if (i < l_subfr)
				code[i] = -4096;	/* codeword in Q12  format */
		}
	}

	for (i = 0; i < l_subfr; i++)
	{
		h[i] = H[i];
		h_inv[i] = negate(h[i]);
	}

	p0 = h_inv - codvec[0];
	p1 = h_inv - codvec[1];
	p2 = h_inv - codvec[2];

	for (i = 0; i < l_subfr; i++)
	{
		s = L_mult(*p0++, 8192);	/* Q12 --> Q10 */
		s = L_mac(s, *p1++, 8192);
		s = L_mac(s, *p2++, 8192);
		y[i] = round32(s);
	}

	*indx = index;

	return;
}

⌨️ 快捷键说明

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