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

📄 iir.asm

📁 ADI公司的ADSP21065L的专业数字音频处理器的源代码
💻 ASM
字号:
/*		w[n]=x[n]+a[0]*w[0]+...+a[n-1]*w[n-1]
		y[n]=b[0]*w[0]+...+b[n]*w[n]
	Algorithm:
		w[n]=x[n];	{Update w[n] for each x[n]}
		for(i=0; i<n; i++)
		   w[n]=w[n]+a[i]*w[i];
		y[n]=0;		{Compute y[n] and update w[i]}
		for(i=0; i<=n; i++) {
		   y[n]=y[n]+b[i]*w[i];
		   w[i]=w[i+1];		{Update w[i]}
		}
		F0=y[n];	{return value}
Registers and stack for passing paramters:
	F4: x[n]
	R8: &a[]   coefficients
	F12: &b[]  coefficients
	stack: &w[]
	stack: taps
Registers for return value
	F0: y[n]
Registers altered
	R10
	R11
	#include <trans.h>				    <Header>
	float iir(  float sample, \			    <Prototype>
		    float pm a_coeffs[], float pm b_coeffs[], \
		    float state[], int taps);*/

//#include <trans.h>
#include <E:\VisualDSP\21k\lib\src\libc_src\lib_glob.h>
.GLOBAL	    	_my_iir;
//.extern			sine;
.precision=40;
.round_zero;

.segment/dm		seg_dmda;
.var _inc=0.5;
.var t1;
.endseg;


.segment /pm seg_pmco;
/*  a_coeff, b_coeff, state */

/*r8=&_a,	r2=&_w,		r12=taps,	r1=&_b*/

_my_iir:		put(R10);		/*R1: &b[0]*///r8=_a;
			//call sine;
		R0=MODE1;
		dm(t1)=r0;
		BIT CLR MODE1 65536;		/*Set 40-BIT mode	*/
pm_pm_dm_iir:	
		R0=PASS R12, pm_ptr=R8;	/*Save taps. Addr. of a_coeff*/
		R8=R8-R8, dm_ptr=R2;	/*Addr. of delay line w[0]*/
		F12=PASS F4, R10=R2;	/*F12: sample.R10: ptr to delay line*//*f4=x[n]*/
		F4=DM(dm_ptr, dm_1), F2=PM(pm_ptr, pm_1);
		/*1st ele in delay line w[0]. 1st ele in a[0]*/
		LCNTR=r0, DO ppdpole_loop UNTIL LCE;
ppdpole_loop:	  F8=F2*F4, F12=F8+F12, F4=DM(dm_ptr,dm_1), F2=PM(pm_ptr,pm_1);//
		F12=F8+F12, pm_ptr=R1;/*F12: delay line w(n). Addr of b[0]*/
		R8=R8-R8, DM(dm_M1,dm_ptr)=F12; /*Save w(n)*/
		
#ifdef _ADI_SWFA
		NOP;
#endif
		R12=R12-R12, dm_ptr=R10;/*dm_ptr pt to w[0] again*/
		//r4=_w;
		//dm_ptr=r4;
		//r12=r12-r12;
		F4=DM(dm_ptr,dm_1), F2=PM(pm_ptr,pm_1);
		
		LCNTR=r0, DO ppdzero_loop UNTIL LCE;
		F8=F2*F4,   F12=F8+F12, F4=DM(dm_ptr,dm_1), F2=PM(pm_ptr,pm_1);

ppdzero_loop:	  DM(-2,dm_ptr)=f4;	/*Update w[]*/
		F8=F2*F4, 	F12=F8+F12;
		F0=F8+F12;	/*Return value y[n]*/
		//f0=f4;//////
restore_state:
		r4=dm(t1);
		MODE1=R4;			/*Restore old mode*/
		outpop(r10);
		rts;
.ENDSEG;

⌨️ 快捷键说明

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