procdsp.c

来自「dspic开发控制程序,有助开发pic单片机程序」· C语言 代码 · 共 107 行

C
107
字号
#include <p30f6014.h>
#include <dsp.h>
#include "common.h"
#include "codec.h"
#include "menu.h"
#include "timers.h"
#include "generators.h"
#include "tables.h"

#define MAX_FIR 128
#define LMS_SIZE 24

unsigned int LMSmu;

static fractional DelayBufI[MAX_FIR] __attribute__ ( (__section__(".ybss")) );
static fractional DelayBufQ[MAX_FIR] __attribute__ ( (__section__(".ybss")) );
static fractional LMSCoef[LMS_SIZE] __attribute__ ( (__section__(".xbss")) );
static FIRStruct FIRFilterI;
static FIRStruct FIRFilterQ;
static unsigned int page;
static fractional* offset;
static fractional pIBuf[PROC_BLOCK_SIZE];
static fractional pQBuf[PROC_BLOCK_SIZE];


//函数原型
void InitProcDSP( char DSPfunc );
void ProcLMS( fractional* pIn, fractional* pOut);
void ProcShift( fractional* pIn, fractional* pOut);

//初始化DSP处理模块子程序
void InitProcDSP( char DSPfunc)
{
int i;
	switch(DSPfunc)
	{
		case DSP_NONE:
			break;
		case DSP_LPFIR:
			asm("mov #psvpage(_LP_1500),w0\nmov w0,_page");
			asm("mov #psvoffset(_LP_1500),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterI,LPFIR_SIZE, offset, page, DelayBufI);
		 	FIRDelayInit(&FIRFilterI);
			break;
		case DSP_HPFIR:
			asm("mov #psvpage(_HP_1500),w0\nmov w0,_page");
			asm("mov #psvoffset(_HP_1500),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterI,HPFIR_SIZE, offset, page, DelayBufI);
		 	FIRDelayInit(&FIRFilterI);
			break;
		case DSP_BPFIR:
			asm("mov #psvpage(_BP_1800),w0\nmov w0,_page");
			asm("mov #psvoffset(_BP_1800),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterI,BPFIR_SIZE, offset, page, DelayBufI);
		 	FIRDelayInit(&FIRFilterI);
			break;
		case DSP_BSFIR:
			asm("mov #psvpage(_BS_1800),w0\nmov w0,_page");
			asm("mov #psvoffset(_BS_1800),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterI,BSFIR_SIZE, offset, page, DelayBufI);
		 	FIRDelayInit(&FIRFilterI);
			break;
		case DSP_SHIFT:
			asm("mov #psvpage(_HILBPFIRI),w0\nmov w0,_page");
			asm("mov #psvoffset(_HILBPFIRI),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterI,HILBPFIRI_SIZE, offset, page, DelayBufI);
		 	FIRDelayInit(&FIRFilterI);
			asm("mov #psvpage(_HILBPFIRQ),w0\nmov w0,_page");
			asm("mov #psvoffset(_HILBPFIRQ),w0\nmov w0,_offset");
			FIRStructInit(&FIRFilterQ,HILBPFIRQ_SIZE, offset, page, DelayBufQ);
		 	FIRDelayInit(&FIRFilterQ);
			InitGen();
			break;
		case DSP_LMS:
			FIRStructInit(&FIRFilterI,LMS_SIZE, LMSCoef, COEFFS_IN_DATA, DelayBufI);
			for(i=0; i<LMS_SIZE; i++)
				LMSCoef[i] = 0;
		 	FIRDelayInit(&FIRFilterI);
			LMSmu = 15;
			break;
	}
}

//频率偏移子程序
void ProcShift( fractional* pIn, fractional* pOut)
{
	FIR( PROC_BLOCK_SIZE, pIBuf, pIn, &FIRFilterI);	
	FIR( PROC_BLOCK_SIZE, pQBuf, pIn, &FIRFilterQ);	
	MakeSinCos(PROC_BLOCK_SIZE, pIn, pOut, 0x7FFF);
	VectorMultiply(PROC_BLOCK_SIZE, pIBuf, pIBuf, pIn);
	VectorMultiply(PROC_BLOCK_SIZE, pQBuf, pQBuf, pOut);
	VectorAdd(PROC_BLOCK_SIZE, pOut, pIBuf, pQBuf);		
}

//FIR滤波子程序
void ProcFIR( fractional* pIn, fractional* pOut)
{
	FIR( PROC_BLOCK_SIZE, pOut, pIn, &FIRFilterI);
}

//LMS滤波子程序
void ProcLMS( fractional* pIn, fractional* pOut)
{
	FIRLMS( PROC_BLOCK_SIZE, pOut, pIn, &FIRFilterI, pIBuf, LMSmu);
	VectorCopy(PROC_BLOCK_SIZE, pIBuf, pIn);
}

⌨️ 快捷键说明

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