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

📄 ns_adpcm.dsp

📁 adsp21x的数字信号处理器ADPCM音频压缩源代码
💻 DSP
📖 第 1 页 / 共 2 页
字号:
		AR=PASS AF, AX1=DM(I0,M1), AY1=PM(I5,M6);{Get sezi}
		SR=ASHIFT AR BY -1 (HI);	{Downshift to produce sez}
		DM(sez)=SR1;
		SI=PM(I5,M4);			{Get a2}
		SR=ASHIFT SI (HI); 		{Downshift a2 per spec}
		AX1=DM(I1,M2), AY1=PM(I4,M5);	{Restore bn and dqn pointers}
		CNTR=2;				{Loop once for each a}
		DO s_e_cmp UNTIL CE;
		   AR=ABS SR1, SR1=DM(I6,M5);	{Get absolute value of a}
		   AR=AR AND AY0, AY0=DM(I6,M5);{Mask bits per spec}
		   SE=EXP AR (HI), MY0=DM(I1,M2);{Get exponent adjust for a}
		   AX0=SE, SR=SR OR NORM AR (HI);{Compute anMANT}
		   AR=SR1 AND AY0, AY0=DM(I1,M2);{Mask bits per spec}
		   MR=AR*MY0(SS), AX1=DM(I1,M2), AY1=PM(I5,M6);
		   AR=AX0+AY0, AY0=DM(I6,M5);	{Compute WanEXP}
		   SE=AR, MR=MR+MX1*MY1 (SU);	{Complete WanMANT computation}
		   SR=LSHIFT MR1 (HI), SE=DM(I6,M5);{Compute Wan}
		   AR=SR1 AND AY0, SI=PM(I5,M4);{Mask Wan per spec}
		   AX0=AR, AR=AX1 XOR AY1;	{Determine sign of Wan}
		   AR=AX0, SR=ASHIFT SI (HI);	{Downshift a1 per spec}
		   IF LT AR=-AX0;		{Negate Wan if necessary}
s_e_cmp:	   AF=AR+AF, AY0=DM(I6,M5);	{Add Wan to partial sum}
		AR=PASS AF, AX1=DM(I1,M1), AY1=PM(I5,M5);{Get sei}
		SR=ASHIFT AR BY -1 (HI);	{Compute se}
		DM(s_e)=SR1;
		RTS;

lima:		AY1=256;			{Maximum value for ap}
		AR=AX1, AF=AX1-AY1;		{Cap if it exceeds}
		IF GE AR=PASS AY1;
		SR=ASHIFT AR BY -2 (HI);	{>>2 to produce al}
		SR=LSHIFT SR1 BY 9 (HI);	{Adjust for ADSP-210x version}
		
mix:		MY0=SR1, AR=AX0-AY0;		{MY0=al, AR=diff}
		AR=ABS AR;			{Take absolute value of diff}
		MR=AR*MY0 (SU);			{Generate prod}
		AR=MR1+AY0;			{Add to yu}
		IF NEG AR=AY0-MR1;		{Subtract if diff < 0}
		SR=ASHIFT AR BY -2 (HI);	{Generate y>>2}
		RTS;
	
log:		I3=^qn_values;			{Point to data array}
		AR=ABS AR, AX1=DM(I3,M1);	{Take absolute of d}
		SE=EXP AR (HI), AX0=DM(I3,M1);	{Determine exponent adjust}
		AY0=SE, SR=NORM AR (HI);	{Normalize}
		AR=AX0+AY0, AY0=DM(I3,M1);	{Compute exponent}
		IF LT AR=PASS 0;		{Check for exponent -1}
		SI=AR, AR=SR1 AND AY0;		{Mask mantissa bits}
		SR=LSHIFT AR BY -7 (HI);	{Position mantissa}
		SR=SR OR LSHIFT SI BY 7 (HI);	{Position exponent}

subtb:		AR=SR1-AY1, AY0=DM(I3,M1);	{Subtract y>>2 for log}
		AX0=AR, AF=PASS AX1;		{Setup for quantizing}

quan:		AR=AX0-AY0, AY0=DM(I3,M1);	{Is dl less then upper limit?}
		IF LT AF=AF-1;
		AR=AX0-AY0, AY0=DM(I3,M1);	{Continue to check for }
		IF LT AF=AF-1;
		AR=AX0-AY0, AY0=DM(I3,M1);	{where dl fits in quantizer}
		IF LT AF=AF-1;
		AR=AX0-AY0, AY0=DM(I3,M1);
		IF LT AF=AF-1;
		AR=AX0-AY0, AY0=DM(I3,M1);
		IF LT AF=AF-1;
		AR=AX0-AY0, AY0=DM(I3,M1);
		IF LT AF=AF-1;
		AR=AX0-AY0;
		IF LT AF=AF-1;
		AR=PASS AF;
		IF NEG AR=NOT AF;		{Negate value if ds negative}
		IF EQ AR=NOT AR;		{Send 15 for 0}
		RTS;
		
reconst:	AF=ABS AR;
		IF NEG AR=NOT AR;		{Find absolute value}	
		M3=AR;				{Use this for table lookup}
		I3=^dq_values;			{Point to dq table}
		MODIFY(I3,M3);			{Set pointer to proper spot}
		AX1=DM(I3,M1);			{Read dq from table}

adda:		AR=AX1+AY1;			{Add y>>2 to dq}

antilog:	SR=ASHIFT AR BY 9 (LO);		{Get antilog of dq}
		AY1=127;			{Mask mantisa}
		AX0=SR1, AR=AR AND AY1;		{Save sign of DQ+Y in AX0}
		AY1=128;			{Add 1 to mantissa}
		AR=AR+AY1;
		AY0=-7; 			{Compute magnitude of shift}
		SI=AR, AR=SR1+AY0;
		SE=AR;
		SR=ASHIFT SI (HI);		{Shift mantissa }
		AR=SR1, AF=PASS AX0;
		IF LT AR=PASS 0;		{If DQ+Y <0, set to zero}
		IF NEG AR=-SR1;			{Negate DQ if I value negative}
		RTS;
		
functw:		I3=^w_values;			{Get scale factor multiplier}
		MODIFY(I3,M3);			{Based on I value}
		AF=PASS 0, SI=DM(I3,M1);
		I3=^f_values;

filtd:		SR=ASHIFT SI BY 1 (LO);		{Update fast quantizer factor}
		AR=SR0-AY0, SE=DM(I3,M1);	{Compute difference}
		SI=AR, AR=SR1-AF+C-1;		{in double precision}
		SR=ASHIFT AR (HI), AX0=DM(I3,M1);{Time constant is 1/32}
		SR=SR OR LSHIFT SI (LO), AY1=DM(I3,M1);
		AR=SR0+AY0, AY0=DM(I3,M1);	{Add gain}

limb:		AF=AR-AY1, SI=DM(I3,M3);	{Limit fast scale factor}
		IF GT AR=PASS AY1;		{Upper limit 10}
		AF=AR-AY0, AY1=MY1;
		IF LT AR=PASS AY0;		{Lower limit 1.06}

filte:		AF=AX0-AY1, AY0=MY0;		{Update quantizer slow factor}
		AF=AX0-AY0+C-1, AX0=DM(I3,M1);	{Compute difference}
		AX1=AR, AR=AR+AF;
		SR=ASHIFT AR BY -6 (HI);	{Time constant is 1/64}
		AR=SR0+AY1, AY1=MX0;		{Add gain}
		MY1=AR, AR=SR1+AY0+C;		{in double precision}

filta:		MY0=AR, AR=AX0-AY1;		{Update short term I average}
		SR=ASHIFT AR (HI), SI=AX0;	{Time constant is 1/32}
		AR=SR1+AY1, AY0=MX1;		{Add gain}

filtb:		SR=LSHIFT SI BY 2 (HI);		{Update long term I average}
		MX0=AR, AR=SR1-AY0;
		SR=ASHIFT AR BY -7 (HI);	{Time constant is 1/128}
		AR=SR1+AY0, SI=MX0;		{Add gain}

subtc:		SR=ASHIFT AR BY -3 (HI);	{Compute difference of long}
		AF=PASS AR, AX0=SR1;		{and short term I averages}
		SR=ASHIFT SI BY 2 (HI);
		MX1=AR, AR=SR1-AF;
		AF=ABS AR;
		AR=MR2, AF=AX0-AF;		{tdp must be true for ax 0}
		IF LE AR=PASS 1;		
		AY0=1536;
		AF=MR1-AY0, AY0=MR0;
		IF LT AR=PASS 1;		{Y>3 for ax to be 0}

filtc:		SR=ASHIFT AR BY 9 (HI);		{Update speed control}
		AR=SR1-AY0;			{Compute difference}
		SR=ASHIFT AR BY -4 (HI);	{Time constant is 1/16}
		AR=SR1+AY0;			{Add gain}
		RTS;
	
update_filter:	AX0=DM(dq);			{Get value of current dq}
		AR=128;
		AF=PASS AX0, AY1=DM(I0,M0);	{Read sign of dq(6)}
		IF EQ AR=PASS 0;		{If dq 0 then gain 0}
		SE=-8;				{Time constand is 1/256}
		AX1=AR;
		CNTR=6;
		DO update_b UNTIL CE;		{Update all b-coefficients}
		   AF=AX0 XOR AY1, AY0=PM(I4,M4);{Get sign of update}
		   IF LT AR=-AX1;
		   AF=AR+AY0, SI=AY0;		{Add update to original b}
		   SR=ASHIFT SI (HI), AY1=DM(I0,M0);{Get next dq(k)}
		   AR=AF-SR1;			{Subtract leak factor}
update_b:	   PM(I4,M5)=AR, AR=PASS AX1;	{Write out new b-coefficient}

place_dq:	AR=ABS AX0, AY0=DM(I0,M2);	{Take absolute value of dq}
		SE=EXP AR (HI);			{Determine exponent adjust}
		SR1=H#4000;			{Set minimum value into SR1}
		AX1=SE, SR=SR OR NORM AR (HI);	{Normalize dq}
		AY0=11;				{Used for exponent adjustment}
		SR=LSHIFT SR1 BY -9 (HI);	{Remove lower bits}
		SR=LSHIFT SR1 BY 2 (HI);	{Adjust for ADSP-210x version}
		DM(I0,M2)=SR1, AR=AX1+AY0;	{Save mantisa, compute exp.}
		DM(I0,M2)=AR;			{Save exponent}
		AX1=DM(a_ik);			{Use sign of I, not dq}
		DM(I0,M0)=AX1;			{Save sign}

update_p:	AY0=DM(sez);			{Get result of predictor}
		AR=AX0+AY0;			{Use dq from above}
		AY1=DM(p);			{Delay all old p's by 1}
		AY0=DM(p_o);
		DM(p)=AR;
		DM(p_o)=AY1;
		DM(p_o_o)=AY0;
		AX1=AR, AR=AR XOR AY0;		{Compute p xor poo}
		MR1=AR, AR=AX1 XOR AY1;		{Compute p xor po}
		MR0=AR;

upa2:		I3=^a_data;
		SI=PM(I5,M5);			{Hold a2 for later}
		AR=PM(I5,M5);			{Get a1 for computation of f}
		AR=ABS AR, AY0=DM(I3,M1);	{Cap magnitude of a1 at 1/2}
		AF=AR-AY0, SE=DM(I3,M1);
		IF GT AR=PASS AY0;
		IF NEG AR=-AR;			{Restore sign}	
		SR=ASHIFT AR (LO), AY0=DM(I3,M1);
		AF=ABS MR0, AY1=DM(I3,M1);	{If p xor po = 0 negate f}
		AR=SR0, AF=PASS SR1;
		IF POS AR=AY1-SR0;		{Double precision}
		IF POS AF=AY1-SR1+C-1;
		SR0=AR, AR=PASS AF;
		SR1=AR, AF=ABS MR1;		{If p xor poo = 1 subtract} 
		AR=SR0+AY0, SE=DM(I3,M1);
		AF=SR1+AY1+C, AX0=DM(I3,M1);
		IF NEG AR=SR0-AY0;
		IF NEG AF=SR1-AY1+C-1;
		SR=LSHIFT AR (LO);
		AR=PASS AF;
		SR=SR OR ASHIFT AR (HI), AY0=SI;
		AY1=SR0, SR=ASHIFT SI (HI);	{Downshift a2 for adjustment}
		AR=AY0-SR1, AY0=DM(I3,M1);
		AF=PASS AX1;
		IF NE AR=AR+AY1;		{If sigpk = 1, no gain}

limc:		AF=AR-AY0, AY1=DM(I3,M1);	{Limit a2 to .75 max}
		IF GT AR=PASS AY0;
		AF=AR-AY1, AY0=DM(I3,M1);	{Limit a2 to -.75 min}
		IF LT AR=PASS AY1;
		PM(I5,M5)=AR;			{Store new a2}
		
upa1:		AR=AX0, AF=PASS MR0;
		IF LT AR=-AX0;
		AF=PASS AX1, SI=PM(I5,M4);
		IF EQ AR=PASS 0;
		SR=ASHIFT SI BY -8 (HI);	{Leak Factor = 1/256}
		AF=PASS AR, AR=SI;
		AF=AF-SR1;
		AR=AR+AF, AX1=DM(I3,M1);

limd:		AX0=AR, AR=AX1-AY1;		{Limit a1 based on a2}
		AY0=AR, AR=AY1-AX1;
		AY1=AR, AR=PASS AX0;
		AF=AR-AY0;
		IF GT AR=PASS AY0;		{Upper limit 1 - 2^-4 - a2}
		AF=AR-AY1;
		IF LT AR=PASS AY1;		{Lower limit a2 - 1 + 2^-4}
		PM(I5,M5)=AR;			{Store new a1}

		RTS;

update_filter_r:AX0=DM(dq_r);			{Get dq_r}
		AR=128;				{Set possible gain}
		AF=PASS AX0, AY1=DM(I0,M0);	{Get sign of dq(6)}
		IF EQ AR=PASS 0;		{If dq_r 0, gain 0}
		SE=-8;				{Leak factor 1/256}
		AX1=AR;
		CNTR=6;
		DO update_b_r UNTIL CE;		{Update all b-coefficients}
		   AF=AX0 XOR AY1, AY0=PM(I4,M4);{Get sign of gain}
		   IF LT AR=-AX1;
		   AF=AR+AY0, SI=AY0;		{Add gain to original b}
		   SR=ASHIFT SI (HI);		{Time constant is 1/256}
		   AR=AF-SR1, AY1=DM(I0,M0);	{Compute new b-value}
update_b_r:	   PM(I4,M5)=AR, AR=PASS AX1;	{Store new b-value}

place_dq_r:	AR=ABS AX0, AY0=DM(I0,M2);	{Get absolute value fo dq_r}
		SE=EXP AR (HI);			{Determine exponent adjustment}
		SR1=H#4000;			{Set SR to minimum value}
		AX1=SE, SR=SR OR NORM AR (HI);	{Normalize dq_r}	
		AY0=11;				{Used for exponent adjust}
		SR=LSHIFT SR1 BY -9 (HI);	{Remove lower bits}
		SR=LSHIFT SR1 BY 2 (HI);	{Adjust for ADSP-210x version}
		DM(I0,M2)=SR1, AR=AX1+AY0;	{Store mantissa, compute exp}
		AX1=DM(a_ik_r);			{Use sign of I, not dq}
		DM(I0,M2)=AR;			{Store exponent}
		DM(I0,M0)=AX1;			{Store sign}

update_p_r:	AY0=DM(sez);			{Compute new p}
		AR=AX0+AY0;			{Use dq_r from above}
		AY1=DM(p_r);			{Delay old p's by 1}
		AY0=DM(p_o_r);
		DM(p_r)=AR;
		DM(p_o_r)=AY1;
		DM(p_o_o_r)=AY0;
		AX1=AR, AR=AR XOR AY0;		{Compute p and poo}
		MR1=AR, AR=AX1 XOR AY1;		{Compute p and po}
		MR0=AR;

upa2_r:		I3=^a_data;
		SI=PM(I5,M5);			{Hold a2 for later}
		AR=PM(I5,M5);			{Get a1 for computation of f}
		AR=ABS AR, AY0=DM(I3,M1);	{Cap magnitude of a1 to 1/2}
		AF=AR-AY0, SE=DM(I3,M1);
		IF GT AR=PASS AY0;
		IF NEG AR=-AR;			{Restore sign of f}
		SR=ASHIFT AR (LO), AY0=DM(I3,M1);
		AF=ABS MR0, AY1=DM(I3,M1);	{If p_r xor poo_r =1 subtract}
		AR=SR0, AF=PASS SR1;
		IF POS AR=AY1-SR0;
		IF POS AF=AY1-SR1+C-1;
		SR0=AR, AR=PASS AF;
		SR1=AR, AF=ABS MR1;
		AR=SR0+AY0, SE=DM(I3,M1);
		AF=SR1+AY1+C, AX0=DM(I3,M1);
		IF NEG AR=SR0-AY0;
		IF NEG AF=SR1-AY1+C-1;
		SR=LSHIFT AR (LO);
		AR=PASS AF;
		SR=SR OR ASHIFT AR (HI), AY0=SI;
		AY1=SR0, SR=ASHIFT SI (HI);	{Leak factor of 1/128}
		AR=AY0-SR1, AY0=DM(I3,M1);
		AF=PASS AX1;
		IF NE AR=AR+AY1;		{If sigpk = 1 , no gain} 

limc_r:		AF=AR-AY0, AY1=DM(I3,M1);	{Limit a2 to .75 max}
		IF GT AR=PASS AY0;
		AF=AR-AY1, AY0=DM(I3,M1);	{Limit a2 to -.75 min}
		IF LT AR=PASS AY1;
		PM(I5,M5)=AR;			{Store new a2}
		
upa1_r:		AR=AX0, AF=PASS MR0;
		IF LT AR=-AX0;
		AF=PASS AX1, SI=PM(I5,M4);
		IF EQ AR=PASS 0;
		SR=ASHIFT SI BY -8 (HI);	{Leak Factor = 1/256}
		AF=PASS AR, AR=SI;
		AF=AF-SR1;
		AR=AR+AF, AX1=DM(I3,M1);

limd_r:		AX0=AR, AR=AX1-AY1;		{Limit a1 based on a2}
		AY0=AR, AR=AY1-AX1;
		AY1=AR, AR=PASS AX0;
		AF=AR-AY0;
		IF GT AR=PASS AY0;		{Upper limit 1 - 2^-4 -a2}
		AF=AR-AY1;
		IF LT AR=PASS AY1;		{Lower limit a2 - 1 + 2^-4}
		PM(I5,M5)=AR;			{Store new a1 }

		RTS;

.ENDMOD;

⌨️ 快捷键说明

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