, 8 ?
, , !
. ,
LUT . , , . 32- ,
, . ( )
16- , 14 . , , , , .
16 @48k , ( )
DMA Discovery.
, . 1200
. 56000 , , .
, , - . Sine - int16_t, , . smul, mul ..
@ void get_sine(void)
.align 2 @ Align to word boundary
.global get_sine @ This makes it a real symbol
.thumb_func
.type get_sine STT_FUNC @ Declare get_sine to be a function.
get_sine: @ Start of function definition
push {r4-r7}
ldr r0,=pitch @ get pitch address
ldr r1,=expoLUT @ expo_tab address
ldr r7,[r0,
lsl r7,r7,
ldr r7,[r1,r7] @ move lookup expo tab value with r7 into r7
ldr r2,=sineLUT @ sine_tab base addy
ldr r4,=WaveBuffer @ storage array addy
ldr r5,=writePos @ get writepos addr
mov r6,
outloop:
ldr r3,=phase @ phase address to r3
ldr r1,[r3,
add r1,r1,r7 @ add current phase and ph_inc
str r1,[r3,
lsr r0,r1,
lsl r0,r0,
ldr r0,[r2,r0] @ lookup sine val with r0 into r1
lsl r1,r0,
add r0,r0,r1 @ add right channel
ldr r1,[r5,
push {r1} @ push it before align
lsl r1,r1,
str r0,[r4,r1] @ store sine to WaveBuffer
pop {r1} @ pop writepos back
add r1,r1,
ldr r3,=1024 @ load BUFFERSIZE compare
cmp r1,r3 @ skip if less than BUFFERSIZE
bne skip
mov r1,
skip:
str r1,[r5,
add r6,r6,
ldr r0,=dataSize @ get datasize counter addr
ldr r1,[r0,
add r1,r1,
str r1,[r0,
cmp r6,
bne outloop
pop {r4-r7}
bx lr
.section .rodata
sineLUT:
@ Array goes in here. Type can be .byte, .hword or .word
@ NOTE! No comma at the end of a line! This is important
.word 0x0000,0x000c,0x0018,0x0024,0x0030,0x003c,0x0048,0x0054
.word 0x0064,0x0070,0x007c,0x0088,0x0094,0x00a0,0x00ac,0x00bc
.word 0x00c8,0x00d4,0x00e0,0x00ec,0x00f8,0x0104,0x0114,0x0120
.word 0x012c,0x0138,0x0144,0x0150,0x015c,0x016c,0x0178,0x0184
.word 0x0190,0x019c,0x01a8,0x01b4,0x01c4,0x01d0,0x01dc,0x01e8
.word 0x01f4,0x0200,0x020c,0x021c,0x0228,0x0234,0x0240,0x024c
.word