At eksperimentere med SoundSensoren og derved få erfaring med mikrofonens muligheder og begrænsninger.
plan:
Planen er at vi skal ende op med at lave en form for lydgenkendelse, idet vi først analyserer på lydmønstret af forkellige typer af høje klap. Udfra denne dataopsamling skaber vi et billede af et gennemsnitlig klap. Mønstergenkendelsen af klappet skal så forsøges implementeres i en algoritme.
activities:
experiment 1:
Datalogning af forskellige høje lyde.
experiment 2:
I de første eksperimenter, brugte vi dataloggeren for at opsamle data og få skabt nogle lydbilleder af de forskellige typer klap. Herunder ses sammenligningen af 5 forskellige klap.
Med 'KillBot's mikrofon så et gennemsnitlig klap ud som følger: Startende med svag lydniveau på under 15. Herefter følger et skarpt peek på op til et lydniveau på over 80 varende mellem ca. 20 - 50 msek., hvorefter lydniveauet igen stille falder til et lydniveau på under ca. 60 efter en periode på 180 msek. efter peek'en.
EscapeHandling:
Istedet for hele tiden at poll for Escape pressed, har vi lavet en anonym ButtoListener. Koden kan ses herunder. Vi er lidt i tvivl om det er den kønneste løsning, men det er måske bare et spørgsmål om at fravende sig Java's kønne verden og tilvende sig en verden i embedded systemer:
Button.ESCAPE.addButtonListener(new ButtonListener(){
public void buttonPressed(Button b) {
Car.stop();
LCD.clear();
LCD.drawString("Program stopped", 0, 0);
LCD.refresh();
try{
Thread.sleep(1000);
} catch (Exception e){}
System.exit(0);
}
public void buttonReleased(Button b) {}
});
Test-for-clap-algoritme:
Vi skiftede metoden 'waitForLoudSound()' ud med nedenstående. Til at teste og måle tiden imellem samplingerne brugte vi 'System.currentTimeMillis()'. Først venter vi på et lydniveau på over 50, vi sampler i 25 mSek., og tester om niveauet, i en af samplingerne var over 80 (peek), sampler så igen i yderligere 250 mSek og tester om lydniveaut har været tilpas lavt. 'Lavt' er i dette tilfælde sat til at være under 50. Hvis ikke det er tilfældet starter vi forfra.:
private static void waitForClap() throws Exception
{
int soundLevel;
boolean clap = false;
while(!clap){
LCD.clear();
LCD.drawString("Step 1",0,0);
LCD.refresh();
do {
soundLevel = sound.readValue();
} while ( soundLevel < 50 );
LCD.clear();
LCD.drawString("Step 2",0,0);
LCD.refresh();
int now = (int)System.currentTimeMillis();
int maks = 0;
while ((int)System.currentTimeMillis() <= now+25){
soundLevel = sound.readValue();
maks = Math.max(maks, soundLevel);
}
if (maks > 80){
LCD.clear();
LCD.drawString("Step 3",0,0);
LCD.refresh();
now = (int)System.currentTimeMillis();
while ((int)System.currentTimeMillis() <= now+250){
soundLevel = sound.readValue();
if (soundLevel < 50){
clap = true;
break;
}
}
}
}
}
Ingen kommentarer:
Send en kommentar