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

📄 r_fft.c

📁 完整的EVRC压缩解压缩算法源码,附带一个简单的例子程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
			*(farray_ptr + j) = ftmp;

			ftmp = *(farray_ptr + i + 1);
			*(farray_ptr + i + 1) = *(farray_ptr + j + 1);
			*(farray_ptr + j + 1) = ftmp;
		}

		k = SIZE_BY_TWO;
		while (j >= k)
		{
			j = sub(j, k);
			k = shr(k, 1);
		}
		j += k;
	}

/* The FFT part */
	if (isign == 1)
	{
		for (i = 0; i < NUM_STAGE; i++)
		{						/* i is stage counter */
			jj = shl(2, i);		/* FFT size */
			kk = shl(jj, 1);	/* 2 * FFT size */
			ii = ii_table[i];	/* 2 * number of FFT's */

			for (j = 0; j < jj; j = j + 2)
			{					/* j is sample counter */
				ji = j * ii;	/* ji is phase table index */

				for (k = j; k < SIZE; k = k + kk)
				{				/* k is butterfly top */
					kj = add(k, jj);	/* kj is butterfly bottom */

					/* Butterfly computations */
					ftmp_real = L_sub(L_mult(*(farray_ptr + kj), phs_tbl[ji]),
									  L_mult(*(farray_ptr + kj + 1), phs_tbl[ji + 1]));
					ftmp_imag = L_add(L_mult(*(farray_ptr + kj + 1), phs_tbl[ji]),
									  L_mult(*(farray_ptr + kj), phs_tbl[ji + 1]));

					tmp1 = round32(ftmp_real);
					tmp2 = round32(ftmp_imag);

					tmp = sub(*(farray_ptr + k), tmp1);
					*(farray_ptr + kj) = shr(tmp, 1);

					tmp = sub(*(farray_ptr + k + 1), tmp2);
					*(farray_ptr + kj + 1) = shr(tmp, 1);

					tmp = add(*(farray_ptr + k), tmp1);
					*(farray_ptr + k) = shr(tmp, 1);

					tmp = add(*(farray_ptr + k + 1), tmp2);
					*(farray_ptr + k + 1) = shr(tmp, 1);
				}
			}
		}

/* The IFFT part */
	}
	else
	{
		for (i = 0; i < NUM_STAGE; i++)
		{						/* i is stage counter */
			jj = shl(2, i);		/* FFT size */
			kk = shl(jj, 1);	/* 2 * FFT size */
			ii = ii_table[i];	/* 2 * number of FFT's */

			for (j = 0; j < jj; j = j + 2)
			{					/* j is sample counter */
				ji = j * ii;	/* ji is phase table index */

				for (k = j; k < SIZE; k = k + kk)
				{				/* k is butterfly top */
					kj = add(k, jj);	/* kj is butterfly bottom */

					/* Butterfly computations */
					ftmp_real = L_add(L_mult(*(farray_ptr + kj), phs_tbl[ji]),
									  L_mult(*(farray_ptr + kj + 1), phs_tbl[ji + 1]));
					ftmp_imag = L_sub(L_mult(*(farray_ptr + kj + 1), phs_tbl[ji]),
									  L_mult(*(farray_ptr + kj), phs_tbl[ji + 1]));

					tmp1 = round32(ftmp_real);
					tmp2 = round32(ftmp_imag);

					*(farray_ptr + kj) = sub(*(farray_ptr + k), tmp1);
					*(farray_ptr + kj + 1) = sub(*(farray_ptr + k + 1), tmp2);
					*(farray_ptr + k) = add(*(farray_ptr + k), tmp1);
					*(farray_ptr + k + 1) = add(*(farray_ptr + k + 1), tmp2);
				}
			}
		}
	}

}								/* end of c_fft () */

void r_fft(Shortword * farray_ptr, Shortword isign)
{

	Shortword ftmp1_real, ftmp1_imag, ftmp2_real, ftmp2_imag;
	Longword Lftmp1_real, Lftmp1_imag, Lftmp2_real, Lftmp2_imag;
	Shortword i, j;
	Longword Ltmp1, Ltmp2;

/* The FFT part */
	if (isign == 1)
	{
		/* Perform the complex FFT */
		c_fft(farray_ptr, isign);

		/* First, handle the DC and foldover frequencies */
		ftmp1_real = *farray_ptr;
		ftmp2_real = *(farray_ptr + 1);
		*farray_ptr = add(ftmp1_real, ftmp2_real);
		*(farray_ptr + 1) = sub(ftmp1_real, ftmp2_real);

		/* Now, handle the remaining positive frequencies */
		for (i = 2, j = SIZE - i; i <= SIZE_BY_TWO; i = i + 2, j = SIZE - i)
		{
			ftmp1_real = add(*(farray_ptr + i), *(farray_ptr + j));
			ftmp1_imag = sub(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
			ftmp2_real = add(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
			ftmp2_imag = sub(*(farray_ptr + j), *(farray_ptr + i));

			Lftmp1_real = L_deposit_h(ftmp1_real);
			Lftmp1_imag = L_deposit_h(ftmp1_imag);
			Lftmp2_real = L_deposit_h(ftmp2_real);
			Lftmp2_imag = L_deposit_h(ftmp2_imag);

			Ltmp1 = L_sub(L_mult(ftmp2_real, phs_tbl[i]), L_mult(ftmp2_imag, phs_tbl[i + 1]));
			*(farray_ptr + i) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));

			Ltmp1 = L_add(L_mult(ftmp2_imag, phs_tbl[i]), L_mult(ftmp2_real, phs_tbl[i + 1]));
			*(farray_ptr + i + 1) = round32(L_shr(L_add(Lftmp1_imag, Ltmp1), 1));

			Ltmp1 = L_add(L_mult(ftmp2_real, phs_tbl[j]), L_mult(ftmp2_imag, phs_tbl[j + 1]));
			*(farray_ptr + j) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));

			Ltmp1 = L_add(L_negate(L_mult(ftmp2_imag, phs_tbl[j])), L_mult(ftmp2_real, phs_tbl[j + 1]));
			Ltmp2 = L_add(L_negate(Lftmp1_imag), Ltmp1);
			*(farray_ptr + j + 1) = round32(L_shr(Ltmp2, 1));
		}

	}
	else
	{

		/* First, handle the DC and foldover frequencies */
		ftmp1_real = *farray_ptr;
		ftmp2_real = *(farray_ptr + 1);
		*farray_ptr = shr(add(ftmp1_real, ftmp2_real), 1);
		*(farray_ptr + 1) = shr(sub(ftmp1_real, ftmp2_real), 1);

		/* Now, handle the remaining positive frequencies */
		for (i = 2, j = SIZE - i; i <= SIZE_BY_TWO; i = i + 2, j = SIZE - i)
		{
			ftmp1_real = add(*(farray_ptr + i), *(farray_ptr + j));
			ftmp1_imag = sub(*(farray_ptr + i + 1), *(farray_ptr + j + 1));
			ftmp2_real = negate(add(*(farray_ptr + j + 1), *(farray_ptr + i + 1)));
			ftmp2_imag = negate(sub(*(farray_ptr + j), *(farray_ptr + i)));

			Lftmp1_real = L_deposit_h(ftmp1_real);
			Lftmp1_imag = L_deposit_h(ftmp1_imag);
			Lftmp2_real = L_deposit_h(ftmp2_real);
			Lftmp2_imag = L_deposit_h(ftmp2_imag);

			Ltmp1 = L_add(L_mult(ftmp2_real, phs_tbl[i]), L_mult(ftmp2_imag, phs_tbl[i + 1]));
			*(farray_ptr + i) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));

			Ltmp1 = L_sub(L_mult(ftmp2_imag, phs_tbl[i]), L_mult(ftmp2_real, phs_tbl[i + 1]));
			*(farray_ptr + i + 1) = round32(L_shr(L_add(Lftmp1_imag, Ltmp1), 1));

			Ltmp1 = L_sub(L_mult(ftmp2_real, phs_tbl[j]), L_mult(ftmp2_imag, phs_tbl[j + 1]));
			*(farray_ptr + j) = round32(L_shr(L_add(Lftmp1_real, Ltmp1), 1));

			Ltmp1 = L_negate(L_add(L_mult(ftmp2_imag, phs_tbl[j]), L_mult(ftmp2_real, phs_tbl[j + 1])));
			Ltmp2 = L_add(L_negate(Lftmp1_imag), Ltmp1);
			*(farray_ptr + j + 1) = round32(L_shr(Ltmp2, 1));
		}

		/* Perform the complex IFFT */
		c_fft(farray_ptr, isign);

	}

}								/* end r_fft () */

⌨️ 快捷键说明

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