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 + -
显示快捷键?