Ik weet dat ik er al vaker mee bezig was, maar zaken als cos/sin tabellen blijven (voor mij) toch lastig.
(meetkunde heeft me vroeger op school helaas nooit erg kunnen boeien)
Voor toondetectie heb ik een cos/sin tabel nodig, die ik nu als volgt bereken. (voorbeeld is op PC, maar wordt in een PIC gebruikt en berekend)
pic basic code:
#COMPILE EXE "test.exe"
#DIM ALL
#INCLUDE "win32api.inc"
FUNCTION PBMAIN () AS LONG
Local lCnt As word, flResult As Single, dStr As String
'-------------------------------------------------------------------
dStr = ""
FOR lCnt = 1 TO 255
flResult = Sin(2 * 3.14159 * 697.0 * (1 / 10000 * lCnt))
If flResult >= 0 Then dStr = dStr + " 1" Else dStr = dStr + " 0"
If (lCnt Mod 16) = 0 Then dStr = dStr + $Cr
NEXT i
Msgbox dStr,, "Sin table:"
'-------------------------------------------------------------------
dStr = ""
FOR lCnt = 1 TO 255
flResult = Cos(2 * 3.14159 * 697.0 * (1 / 10000 * lCnt))
If flResult >= 0 Then dStr = dStr + " 1" Else dStr = dStr + " 0"
If (lCnt Mod 16) = 0 Then dStr = dStr + $Cr
NEXT i
Msgbox dStr,, "Cos table:"
'-------------------------------------------------------------------
END FUNCTION
Geeft netjes deze 2 tabellen:
Het nadeel is dat ik veel (te veel) berekeningen doe, omdat ik cos en sin helemaal niet nodig heb, ik moet alleen
weten of de waarde 1 of 0 is tijdens een sample. Voorbeeld is 255 samples op 10kHz en een toon van 697 Hz.
In de PIC gebruik ik dit 14x, zodat de cos/sin functie 7140 keer aangeroepen wordt.
Daar doet de arme PIC meer als 20 sec. over op 16MHz...
Op zich niet zo erg (tabellen worden alleen de eerste keer na programmeren berekend), maar mooi is anders...
Ik heb het gevoel dat dit veel sneller moet kunnen...
Heb ik de Cos tabel eigenlijk wel nodig? (is volges mij identiek aan de Sin tabel, alleen met een offset)