filter.c

来自「以TI 公司的OMAP5910为例」· C语言 代码 · 共 189 行

C
189
字号
///////////////////////////////////////////////////////////////////////////
//			Copyright (C) 2004, Microunit Technology Co. Ltd.
//							All Rights Reserved
//_________________________________________________________________________
//
// FILENAME:	filter.c
///////////////////////////////////////////////////////////////////////////


#include "filter.h"

static WORD median(WORD* data);
static void FilterBUF(WORD* in, WORD* out, int rows);
static void FilterRow(WORD* in, WORD* out);

// map input double buffer to DARAM
#pragma DATA_SECTION(InBuf_1, "INBUF1");				// 16k
#pragma DATA_SECTION(InBuf_2, "INBUF2");				// 16k
// map output double buffer to SARAM
#pragma DATA_SECTION(OutBuf_1, "OUTBUF1");				// 16k
#pragma DATA_SECTION(OutBuf_2, "OUTBUF2");				// 16k

WORD InBuf_1[0x2000];
WORD InBuf_2[0x2000];
WORD OutBuf_1[0x2000];
WORD OutBuf_2[0x2000];


void IMG_Filter(DWORD addrIn, DWORD addrOut)
{
	int i;
	WORD width = 320;
	WORD height = 240;

	WORD *pIn_Tran = InBuf_1;
	WORD *pIn_Proc = InBuf_2;
	WORD *pOut_Tran = OutBuf_1;
	WORD *pOut_Proc = OutBuf_2;
	WORD *ptr;

	// read 0-21 to input buffer
	DMA_SD2DA(pIn_Tran, addrIn, width*22);
	addrIn += width*20*2;	// next read is 20-41

	// start double buffering loop
	for(i=20; i<220; i+=20)
	{
		// swap input buffer
		ptr = pIn_Tran;
		pIn_Tran = pIn_Proc;
		pIn_Proc = ptr;
		
		// start input background transfer (20-41)
		DMA_SD2DA(pIn_Tran, addrIn, width*22);
		addrIn += width*20*2;

		// process (0-21)->(1-20)
		FilterBUF(pIn_Proc, pOut_Proc, 22);

		// swap output buffer
		ptr = pOut_Tran;
		pOut_Tran = pOut_Proc;
		pOut_Proc = ptr;

		// start output background transfer
		DMA_SA2SD(addrOut, pOut_Tran, width*20);
		addrOut += width*20*2;
	}

	// swap input buffer
	ptr = pIn_Tran;
	pIn_Tran = pIn_Proc;
	pIn_Proc = ptr;
		
	// start input background transfer (220-239)
	DMA_SD2DA(pIn_Tran, addrIn, width*20);

	// process 200-221(result 201-220)
	FilterBUF(pIn_Proc, pOut_Proc, 22);

	// swap output buffer
	ptr = pOut_Tran;
	pOut_Tran = pOut_Proc;
	pOut_Proc = ptr;

	// start output background transfer (201-220)
	DMA_SA2SD(addrOut, pOut_Tran, width*20);
	addrOut += width*20*2;

	// swap input buffer
	ptr = pIn_Tran;
	pIn_Tran = pIn_Proc;
	pIn_Proc = ptr;

	// process last input buffer (220-239) -> (221-238)
	FilterBUF(pIn_Proc, pOut_Proc, 20);

	// swap Out_buf
	ptr = pOut_Tran;
	pOut_Tran = pOut_Proc;
	pOut_Proc = ptr;

	// transfer last output buffer (221-238)
	DMA_SA2SD(addrOut, pOut_Tran, width*18);
}

void FilterBUF(WORD* in, WORD* out, int rows)
{
	int i;
	for(i=1; i<rows-1; i++)
	{
		out[0] = in[320];
		out[319] = in[639];
		FilterRow(in, (out+1));
		in += 320;
		out += 320;
	}
}

void FilterRow(WORD* in, WORD* out)
{
	int i;
//	memset(out, 0x0F0F, 318);
//	memcpy(out, in+1, 318);
//	for(i=1; i<319; i++)
//		out[i] = in[i+320];
	WORD mask[9];
	
	for(i=1; i<319; i++)
	{
		mask[0] = in[i-1];
		mask[1] = in[i];
		mask[2] = in[i+1];
		mask[3] = in[i+319];
		mask[4] = in[i+320];
		mask[5] = in[i+321];
		mask[6] = in[i+639];
		mask[7] = in[i+640];
		mask[8] = in[i+641];
		out[i] = median(mask);
	}
/*	WORD* row1 = in - 320;
	WORD* row2 = in;
	WORD* row3 = in + 320;

	for(i=1; i<319; i++)
	{
//		memcpy(mask, row1, 3);
//		memcpy(mask+3, row2, 3);
//		memcpy(mask+6, row3, 3);
		mask[0] = row1[0];
		mask[1] = row1[1];
		mask[2] = row1[2];
		mask[3] = row2[0];
		mask[4] = row2[1];
		mask[5] = row2[2];
		mask[6] = row3[0];
		mask[7] = row3[1];
		mask[8] = row3[2];
		out[i] = median(mask);
	}*/
}

WORD median(WORD* data)
{
	int i,j;
	WORD temp;

	for(j=0;j<5;j++)
	{
		for(i=0;i<8-j;i++)
		{
			if(data[i] > data[i+1])
			{
				temp = data[i];
				data[i] = data[i+1];
				data[i+1] = temp;
			}
		}
	}

	return data[4];
}



// the end
///////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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