📄 amf_tonecontrolbass_render.asm
字号:
// Copyright(c) 2005 Analog Devices, Inc. All Rights Reserved.
// This software is proprietary and confidential to Analog Devices, Inc. and its licensors.
// File : $Id: //depot/development/visualaudio/modules/2.5.0/SHARC/Source/AMF_ToneControlBass_Render.asm#3 $
// Part of : VisualAudio V2.5.0
// Updated : $Date: 2006/10/12 $ by $Author: Fernando $
// Module Name : AMF_ToneControlBass_Render.asm
// DSP Processor : ADSP21161
// Description : Tone control bass audio module ASM file.
// Owner : Analog Devices
// Original Author : Mark A Wilson, further optimized by Tim Stilson
// Date : 6/27/03
//====================================================================================
// Processor resources used:
// 85 words pmem INTERNAL
// 741 cycles for tickSize=128 (101 + 3*tickSize + 4*tickSize/2) = (101 + 5*tickSize)
//====================================================================================
// Revision History
//
// 5/19/03 Mark Wilson: created
// 6/27/03 Tim Stilson: re-optimized (split allpass loop out, SIMD-ized 2nd loop)
// 8/15/03 Tim Stilson: a couple instruction reductions
#if 1 // ASM render code
#include "processor.h"
#include "AMF_ToneControlBass.h"
#include "asm_macros.h"
#include "asm_sprt.h"
.global _AMF_ToneControlBass_Render;
.segment /pm SEG_MOD_FAST_CODE;
_AMF_ToneControlBass_Render:
//====================================================================================
//module entry arguments passed in registers:
// r4 = instance (AMF_ToneControlBass * restrict)
// r8 = * buffers (float * restrict)
// r12 = int tickSize
puts=mode1;
puts=r3;
puts=r5;
puts=r6;
puts=r7;
puts=r10;
puts=r13;
R0=m2; puts=R0;
R0=I0; puts=R0;
R0=I1; puts=R0;
R0=I2; puts=R0;
//------------------------------------------------------------------------------------
AMF_ToneControlBass_setup:
i4=r8; // i4->*buffers
i0=dm(0,i4); // i0->buffers[0], in
s0 = i0; // remember it
i1=dm(1,i4); // i1->buffers[1], out
s1 = i1; // remember it
i4=r4; // i4->testModuleInstance[0]
r6 = r12-1;
f7=dm(AMF_ToneControlBass_B0,i4); // f7= B0 {constant}
f3=dm(AMF_ToneControlBass_State,i4); // f3= State
f13=f3;
f8=f3*f7, r4=dm(i0,m6); // f8 = b0*state, r4 = first in
f3=f4-f8, r4=dm(i0,m6); // f3 = tmp = in - b0*state, r4=next in;
f8=f3*f7; // f8 = b0*tmp;
f8=f3*f7, f1=f8+f13, r13=r3; // f8 = b0*state, f1 = b0*tmp + state, r13=state;
AMF_ToneControlBass_loop1_start:
LCNTR=r6, DO AMF_ToneControlBass_loop1_end UNTIL LCE;
f3=f4-f8, dm(i1,m6)=f1; // f3 = tmp = in - b0*state, ship previous out;
f8=f3*f7, r4=dm(i0,m6); // f8 = b0*tmp, r4=next in; (f3 now becomes state for next iter)
AMF_ToneControlBass_loop1_end:
f8=f3*f7, f1=f8+f13, r13=r3; // f8 = b0*state, f1 = b0*tmp + state, r13=state;
dm(i1,m6)=f1; // last output
dm(AMF_ToneControlBass_State,i4)=f13; // instance->state=f3
i0 = s0; // restore *in;
i1 = s1; // restore *out;
i2 = s1; // *out also (output of allpass);
f4=dm(AMF_ToneControlBass_AmpSmoothing,i4); // f4= float ampSmoothing = instance->ampSmoothing
f2=dm(AMF_ToneControlBass_AmpTarget,i4); // f2= float ampTarget = instance->ampTarget
f5=dm(AMF_ToneControlBass_Amp,i4); // f5= float amp = instance->amp
// the 2nd loop we can do in SIMD
r6=r12;
r6 = lshift r6 by -1;
r6 = r6-1;
f8=1.0;
f7=f8-f4; // f7 = float oneMinusRate = 1.0 - ampSmoothing
f3=f5*f7; // f3 = amp * oneMinusRate
f2=f2*f4; // f2= ampTarget * ampSmoothing
f3=f3+f2; // next sample of smoothed amp
s5=f3;
// compute c1 and c2
f3=f7*f7; // f3 = c1 = (1-r)^2
f7=f7+f8; // f7 = 2-r;
f13=f2*f7; // f2 = target*c2 = target*r(2-r);
s3=f3;
s13=f13;
f4=0.5; // used inside loop
s4=f4;
bit set MODE1 PEYEN;
m2=2;
f8=dm(i0,m2); // f8/s8 = in[i/i+1]
f12=dm(i2,m2); // f12/s12 = allpass[i/i+1]
f0=f8+f12, f12=f8-f12; // f0=in+ap, f12=in-ap
f8=f0*f5; // f0=amps*(in+ap)
f8=f3*f5, f0=f8+f12, f12=dm(i2,m2); // f8=amps*c1, f0=amps*(in+ap)+(in-ap), f12 = next allpass
f0=f0*f4, f5=f8+f13, f8=dm(i0,m2); // f0=0.5*amps(in+ap)+(in-ap), f5=amps*c1+target*c2, f8=next in
AMF_ToneControlBass_loop2_start:
LCNTR=r6, DO AMF_ToneControlBass_loop2_end UNTIL LCE;
f0=f8+f12, f12=f8-f12, dm(i1,m2)=f0; // f0=in+ap, f12=in-ap, send previous output
f8=f0*f5; // f0=amps*(in+ap)
f8=f3*f5, f0=f8+f12, f12=dm(i2,m2); // f8=amps*c1, f0=amps*(in+ap)+(in-ap), f12 = next allpass
AMF_ToneControlBass_loop2_end:
f0=f0*f4, f5=f8+f13, f8=dm(i0,m2); // f0=0.5*amps(in+ap)+(in-ap), f5=amps*c1+target*c2, f8=next in
dm(i1,m2)=f0; // last out
bit clr MODE1 PEYEN;
nop;
dm(AMF_ToneControlBass_Amp,i4)=s5; // instance->amp=last Amp
//====================================================================================
AMF_ToneControlBass_epilogue:
I2=gets(1);
I1=gets(2);
I0=gets(3);
m2=gets(4);
r13=gets(5);
r10=gets(6);
r7=gets(7);
r6=gets(8);
r5=gets(9);
r3=gets(10);
mode1=gets(11);
alter(11);
//------------------------------------------------------------------------------------
_AMF_ToneControlBass_Render.END:
leaf_exit; // C-rth requires this instead of rts
//------------------------------------------------------------------------------------
.endseg;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -