//============================================================================== computeFilterCoefficients: //============================================================================== // computeFilterCoefficients( int cutoff, int resonance, u32 *dest ) // r0 = cutoff( 0..128 ) // r1 = resonance( 0..128 ) // r2 = destbuffer (3 words) //------------------------------------------------------------------------------ push {r4-r7} // mov r7, r2 // r7 = dest adr r2, ITcutoffTable // read LUTs with inputs adr r3, ITresonanceTable // ldr r0, [r2, r0, lsl#2] // r0=x (0.32) ldr r4, [r3, r1, lsl#2] // r4=y (0.32) //------------------------------------------------------------------------------ // x *= mixingfreq / 65536 mov r0, r0, lsr#1 // mixingfreq = 32768 //------------------------------------------------------------------------------ umull r5, r3, r0, r0 // r5 = x^2 (.16*.16 =.16) mov r5, r5, lsr#16 // orr r5, r3, lsl#16 // //------------------------------------------------------------------------------ umull r2, r6, r0, r4 // r6 = x*y (.16*.32 =.16) //------------------------------------------------------------------------------ mov r4, r4, lsr#16 // convert y .32->.16 //------------------------------------------------------------------------------ mov r0, #0xFFFFFFFF // r0=fg=0xFFFFFFFF / (xx+xy+y) add r1, r4, r5 // (fg=.16) add r1, r6 // swi 0x090000 // DIVIDE //------------------------------------------------------------------------------ // r1=fb0 = fg*(2xx+xy+y-1.0): add r5, r6, r5, lsl#1 // r5=2xx+xy add r5, r4 // +y sub r5, #65536 // -1.0 umull r1, r2, r5, r0 // r1,r2 = fb0 << 16 mov r1, r1, lsr#16 // r1=fb0 orr r1, r1, r2, lsl#16 // //------------------------------------------------------------------------------ mov r2, #65536 // r2=fb1 = 1.0-fg-fb0 sub r2, r2, r0 // sub r2, r2, r1 // //------------------------------------------------------------------------------ // r0,r1,r2 = a0,b0,b1 // a0: 0.16 // a1: 1.16 // a2: s.16 signed, always negative //------------------------------------------------------------------------------ // convert results: mov r0, r0, lsr#3 // a0 = 0.13 mov r1, r1, lsr#3 // a1 = 1.13 mov r2, r2, asr#3 // a2 = signed 0.13 //------------------------------------------------------------------------------ stmia r7, {r0-r2} // save results //------------------------------------------------------------------------------ pop {r4-r7} // return bx lr // //------------------------------------------------------------------------------ // 0.32 unsigned //------------------------------------------------------------------------------ ITcutoffTable: //------------------------------------------------------------------------------ .word 0x004FBC33,0x004D771B,0x004B428D,0x00491E12,0x00470934,0x00450381,0x00430C8B,0x004123E7 .word 0x003F492C,0x003D7BF5,0x003BBBDF,0x003A088B,0x0038619B,0x0036C6B5,0x00353782,0x0033B3AC .word 0x00323AE1,0x0030CCD0,0x002F692B,0x002E0FA5,0x002CBFF5,0x002B79D4,0x002A3CFC,0x00290929 .word 0x0027DE19,0x0026BB8D,0x0025A146,0x00248F09,0x0023849A,0x002281C0,0x00218646,0x002091F3 .word 0x001FA496,0x001EBDFA,0x001DDDEF,0x001D0445,0x001C30CD,0x001B635A,0x001A9BC1,0x0019D9D6 .word 0x00191D70,0x00186668,0x0017B495,0x001707D2,0x00165FFA,0x0015BCEA,0x00151E7E,0x00148494 .word 0x0013EF0C,0x00135DC6,0x0012D0A3,0x00124784,0x0011C24D,0x001140E0,0x0010C322,0x001048F9 .word 0x000FD24B,0x000F5EFD,0x000EEEF7,0x000E8222,0x000E1866,0x000DB1AD,0x000D4DE0,0x000CECEB .word 0x000C8EB8,0x000C3334,0x000BDA4A,0x000B83E9,0x000B2FFD,0x000ADE75,0x000A8F3F,0x000A424A .word 0x0009F786,0x0009AEE3,0x00096851,0x000923C2,0x0008E126,0x0008A070,0x00086191,0x0008247C .word 0x0007E925,0x0007AF7E,0x0007777B,0x00074111,0x00070C33,0x0006D8D6,0x0006A6F0,0x00067675 .word 0x0006475C,0x0006199A,0x0005ED25,0x0005C1F4,0x000597FE,0x00056F3A,0x0005479F,0x00052125 .word 0x0004FBC3,0x0004D771,0x0004B428,0x000491E1,0x00047093,0x00045038,0x000430C8,0x0004123E .word 0x0003F492,0x0003D7BF,0x0003BBBD,0x0003A088,0x00038619,0x00036C6B,0x00035378,0x00033B3A .word 0x000323AE,0x00030CCD,0x0002F692,0x0002E0FA,0x0002CBFF,0x0002B79D,0x0002A3CF,0x00029092 .word 0x00027DE1,0x00026BB8,0x00025A14,0x000248F0,0x00023849,0x0002281C,0x00021864,0x0002091F //------------------------------------------------------------------------------ // 0.32 unsigned //------------------------------------------------------------------------------ ITresonanceTable: //------------------------------------------------------------------------------ .word 0xFFFFFFFF,0xFA887400,0xF52ECB00,0xEFF26200,0xEAD29800,0xE5CED300,0xE0E67800,0xDC18F100 .word 0xD765AC00,0xD2CC1900,0xCE4BAC00,0xC9E3DC00,0xC5942100,0xC15BF800,0xBD3AE100,0xB9305C00 .word 0xB53BEF00,0xB15D2100,0xAD937C00,0xA9DE8C00,0xA63DE000,0xA2B10900,0x9F379A00,0x9BD12A00 .word 0x987D5000,0x953BA800,0x920BCD00,0x8EED5F00,0x8BDFFD00,0x88E34B00,0x85F6EE00,0x831A8C00 .word 0x804DCE00,0x7D905F00,0x7AE1E9FF,0x78421E00,0x75B0AB00,0x732D4200,0x70B79680,0x6E4F5D80 .word 0x6BF44D80,0x69A61E00,0x67648980,0x652F4A80,0x63061D80,0x60E8C080,0x5ED6F380,0x5CD07700 .word 0x5AD50D00,0x58E47900,0x56FE7F80,0x5522E700,0x53517680,0x5189F700,0x4FCC3100,0x4E17F080 .word 0x4C6D0100,0x4ACB2F7F,0x49324A00,0x47A22000,0x461A8200,0x449B4080,0x43242E80,0x41B51EFF .word 0x404DE5FF,0x3EEE5940,0x3D964E40,0x3C459C00,0x3AFC1A80,0x39B9A280,0x387E0D80,0x37493580 .word 0x361AF63F,0x34F32B3F,0x33D1B13F,0x32B66600,0x31A1277F,0x3091D480,0x2F884D00,0x2E8470FF .word 0x2D8621C0,0x2C8D40C0,0x2B99B080,0x2AAB53BF,0x29C20E00,0x28DDC3C0,0x27FE5940,0x2723B480 .word 0x264DBB00,0x257C5300,0x24AF643F,0x23E6D580,0x23228F80,0x22627A40,0x21A67F40,0x20EE8800 .word 0x203A7E40,0x1F8A4D00,0x1EDDDEFF,0x1E351F7F,0x1D8FFA9F,0x1CEE5C9F,0x1C503220,0x1BB5685F .word 0x1B1DECE0,0x1A89AD7F,0x19F89880,0x196A9CBF,0x18DFA93F,0x1857AD3F,0x17D298DF,0x17505BDF .word 0x16D0E6FF,0x16542ADF,0x15DA18A0,0x1562A1BF,0x14EDB800,0x147B4D80,0x140B545F,0x139DBF80 .word 0x133281C0,0x12C98E20,0x1262D860,0x11FE541F,0x119BF560,0x113BB080,0x10DD79E0,0x10814640