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

📄 amf_tonecontrolbass_render.asm

📁 ADI SHARC DSP 音频算法标准模块库
💻 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 + -