Ik ga het nog eens grondig moeten bestuderen voor ik het helemaal snap denk ik
De beat-afstand is inderdaad 444 ms, maar de beat zelf duurt maar een 200 ms, je hebt dus 200 ms beat, 200 ms stilte, 200 ms beat, 200 ms beat, ...
Je originele 44KHz sample data gaat dus (als er enkel een beat zou zijn) 200 ms (~8000 samples) hoger zijn, en 200 ms lager (bij de stilte dus)
Om met een 512-punt fft toch een nauwkeurig frequentiegebied van 8/512 Hz te kunnen bepalen, beperk je de sampling frequentie tot 8Hz door het gemiddelde te nemen over 5000 input-samples (down-sampling dus).
Als deze 5000 punten midden in het hoogtepunt van de beat liggen, dan zal die 8Hz sample een erg hoge waarde hebben, liggen deze punten echter zo dat ze slechts een deel van de oppervlakte onder de beat nemen, dan zal het gemiddelde (samen met nog wat stilte van voor de beat) veel lager liggen.
Misschien verduidelijkt het volgende wat ik er niet helemaal aan snap :
Oorspronkelijke Samples : _____/--\_____/--\_____/--\_____/--\___
Downsampling intervallen: _|__|__|__|__|__|__|__|__|__|__|__|__
Samples @ 8Hz _______: __ .0_.7_.3_.0_ .8_.2_.0_ .9_.0_.1_.8_.0
Ik vraag me dus voornamelijk af of een fft met deze waardes nog wel duidelijk genoeg herhalingen gaat vinden.
Of komt dit toch nog goed omdat er 512 van dit soort samples zijn, die over 512 samples wel duidelijk herhalen?
Zoals ik al gezegd heb moet ik misschien wel alles nog eens nalezen en daarna eens proberen deze methode te implementeren en kijken of er inderdaad nauwkeurige resultaten uitkomen.
edit:
Door het schrijven van dit bericht is denk ik het principe van fft me al iets duidelijker geworden, maar ik zou toch eerst nog eens moeten testen wat een fft doet met een opeenvolging van pieken
Edit2: Waar ik ook nog aan denk: hoe moet je het gemiddelde nemen? Normaalgezien is sampledata namelijk signed van -2^15 tot +2^15, maar omdat geluid uit golven bestaat, gaat het gemiddelde over een grotere tijd (dus > laagst hoorbare frequentie = +- 20Hz) 0 zijn...
Moet dus het gemiddelde van de absolute waardes genomen worden?
Edit3: Deze methode werkt dus inderdaad.
Ik heb nog niets echt geprogrammeerd, maar ik heb in cool edit eens een liedje geopend, het gedownsampled naar 16Hz, en hierop een fft analyze van 2048 samples gedaan, dan tussen 1 en 4 Hz de hoogste top gekozen, en dit vermenigvuldigt met 60.
1 liedje was techno, en daar vond ik 138 bpm, wat klopte, en het 2de is drum'n bass, en ik vond 175 bpm, wat ook klopt denk ik.
De methode had wel enkel success als ik bij het downsamplen de pre-filter optie aanzet.
Volgens de help over deze optie voorkomt deze optie dat er 'valse' lage tonen worden gegenereerd, maar er staat niet echt op welke manier dit voorkomen wordt.
Ik vrees dus dat enkel het gemiddelde nemen niet voldoende zal zijn, maar dat er ook nog een filter over moet.
[
Voor 40% gewijzigd door
Adion op 16-01-2003 17:09
]