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

📄 fmi.cpp

📁 自适应算术编码。这个项目假设读者已经了解基本的算术压缩编码的概念。
💻 CPP
字号:
#include "fmi.h"

void CFreqModIncr::Initialize(DWORD dwTotal)
{
	m_pdwTable = new DWORD [m_dwTotal = dwTotal];

	for (DWORD dwIndex = 0; dwIndex < dwTotal; dwIndex++)
		m_pdwTable[dwIndex] = 0;

	AdjustFrequencies();
}

void CFreqModIncr::Uninitialize()
{
	delete [] m_pdwTable;
	m_pdwTable = NULL;
}

void CFreqModIncr::PassByIndex(
	DWORD dwIndex,
	DWORD &rdwLeftBound,
	DWORD &rdwRightBound)
{
	DWORD dwAddend = m_dwStartAddend;
	DWORD dwBaseIndex = 0;

	rdwLeftBound = 0;
	rdwRightBound = m_pdwTable[0];

	for (; dwAddend; dwAddend >>= 1)
	{
		DWORD dwMidIndex = dwBaseIndex + dwAddend;
		DWORD dwMidBound = rdwLeftBound + m_pdwTable[dwMidIndex];

		if (dwMidIndex <= dwIndex)
		{
			rdwRightBound = dwMidBound;
			m_pdwTable[dwMidIndex] += m_dwIncrement;
		}
		else if (dwMidIndex < m_dwTotal)
		{
			rdwLeftBound = dwMidBound;
			dwBaseIndex = dwMidIndex;
		}
	}

	if ((m_pdwTable[0] += m_dwIncrement) >= FMI_OVERFLOW_LIMIT)
		ReduceByHalf();
}

DWORD CFreqModIncr::PassByPoint(
	DWORD dwPoint,
	DWORD &rdwLeftBound,
	DWORD &rdwRightBound)
{
	DWORD dwAddend = m_dwStartAddend;
	DWORD dwIndex = 0;

	rdwLeftBound = 0;
	rdwRightBound = m_pdwTable[0];

	for (; dwAddend; dwAddend >>= 1)
	{
		DWORD dwMidIndex = dwIndex + dwAddend;
		DWORD dwMidBound = rdwLeftBound + m_pdwTable[dwMidIndex];

		if (dwMidBound <= dwPoint)
		{
			rdwRightBound = dwMidBound;
			m_pdwTable[dwMidIndex] += m_dwIncrement;
		}
		else if (dwMidIndex < m_dwTotal)
		{
			rdwLeftBound = dwMidBound;
			dwIndex = dwMidIndex;
		}
	}

	if ((m_pdwTable[0] += m_dwIncrement) >= FMI_OVERFLOW_LIMIT)
		ReduceByHalf();

	return dwIndex;
}

//	Private (internal) functionality

void CFreqModIncr::AdjustFrequencies()
{
	DWORD dwValue = 1, dwAddend = 2;

	m_pdwTable[0] += m_dwTotal;

	for (; dwValue < m_dwTotal; dwAddend = (dwValue = dwAddend) << 1)
		for (DWORD dwIndex = dwValue; dwIndex < m_dwTotal; dwIndex += dwAddend)
			m_pdwTable[dwIndex] += dwValue;

	m_dwStartAddend = dwValue >> 1;
}

void CFreqModIncr::ReduceByHalf()
{
	AdjustFrequencies();

	for (DWORD dwIndex = 0; dwIndex < m_dwTotal; dwIndex++)
		m_pdwTable[dwIndex] >>= 1;
}

⌨️ 快捷键说明

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