diff --git a/app/src/main/java/com/example/greenwatch/Mikrofon.java b/app/src/main/java/com/example/greenwatch/Mikrofon.java index 2f7601c..e09d051 100644 --- a/app/src/main/java/com/example/greenwatch/Mikrofon.java +++ b/app/src/main/java/com/example/greenwatch/Mikrofon.java @@ -34,6 +34,16 @@ public class Mikrofon extends AppCompatActivity { private final static String KEY_WERT = "KEY_WERT_" + Mikrofon.class.getSimpleName(); private final static String KEY_KALIBRIERUNG = "KEY_KALIBRIERUNG_" + Mikrofon.class.getSimpleName(); + //zu speichernde Daten: detection_mic, zeit, + // kalibrierung_do (Unterscheidung, ob Activity aus Benutzersicht (back-Taste --> erneuter Start führt zu erneutem Kalbireren) oder durch Kippen beendet (isFinishing()==false und nicht ernuet kalbrieren), + //threshold + sensitivity speichern, damit beim Kippen das nicht verloren geht, + //Verarbeitungsergebnis ergebnis in der doInBackground Funktion muss auch gespeichert werden, da dort der aktuelle db-Wert enthalten ist --> sonst machen Werte kurz nach dem Kippen keinen Sinn mehr + //aktuell noch SharedPref bei kalibrierung_do und threshold implementiert --> kann nach erfolgreichem Einbinden in Model entfernt werden + //Infos zu Variablen: + //detection_mic: solange true, solange ergebnis.db > threshold+sensitivity -> wird false, sobald ergebnis.db < threshold + //zeit: wird sowohl bei Beginn der Detektion als auch beim Ende der Detektion aktualisiert + //Funktion der App: nach Start 3s Thread.sleep, damit man das Handy positionieren kann -> Kalibrierung folgt, dauert mehrere Sekunden, erst nach Kalbrierung werden Werte angezeigt + //offenes Problem: beim allerersten Start nach der Installation wird der alte Kalbrierwert verwendet und nicht erneut kalibriert --> nach Einbinden Verhalten erneut prüfen @@ -44,12 +54,9 @@ public class Mikrofon extends AppCompatActivity { textViewMaxAmp = (TextView) findViewById(R.id.textViewMaxAmp); textViewMaxAmpdb = (TextView) findViewById(R.id.textViewMaxAmpdb); textViewZeitstempel = (TextView) findViewById(R.id.textViewZeitstempel); - //kalibrierung_do = true; - } - @Override protected void onResume() { super.onResume(); @@ -168,11 +175,37 @@ public class Mikrofon extends AppCompatActivity { int zaehlerZeitMessung = 0; int anzahlVerarbeitet = 0; GleitenderMittelwert gleitenderMittelwert = new GleitenderMittelwert(0.3f); - GleitenderMittelwert gleitenderMittelwertdB = new GleitenderMittelwert(0.1f); + GleitenderMittelwert gleitenderMittelwertdB = new GleitenderMittelwert(0.2f); float db = 0; boolean erlaubt_rise = true; boolean erlaubt_fall = true; + //kalibrierung + if(kalibrierung_do){ + //3s warten auf weitere Ausführung + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + int anzahlIterationen = 100; + float sum = 0; + //Mittelwertbildung für kalibrierten threshold + for(int i = 0; i < anzahlIterationen; i++){ + if (isCancelled()) { + break; + } else { + int z = recorder.read(puffer, 0, puffer.length); + Verarbeitungsergebnis kalibrierung = verarbeiten(puffer, z); + sum += (float) kalibrierung.db; + System.out.println("Kalibrierungswert zum Testen" + kalibrierung.db); + } + + } + threshold = sum/anzahlIterationen; + kalibrierung_do = false; + } for (; ; ) { @@ -183,31 +216,6 @@ public class Mikrofon extends AppCompatActivity { Verarbeitungsergebnis ergebnis = verarbeiten(puffer, n); anzahlVerarbeitet += n; - //kalibrierung - if(kalibrierung_do){ - // Warten für 3 Sekunden - /*long startTime = System.currentTimeMillis(); // Startzeit - while (System.currentTimeMillis() - startTime < 3000) { - //Warten - }*/ - //3s warten auf weitere Ausführung - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - //int z = recorder.read(puffer, 0, puffer.length); - //Verarbeitungsergebnis kalibrierung = verarbeiten(puffer, z); - int anzahlIterationen = 3000; - float sum = 0; - for(int i = 0; i < anzahlIterationen; i++){ - sum += ergebnis.db; - } - threshold = sum/anzahlIterationen; - kalibrierung_do = false; - } - - zaehlerZeitMessung++; if (zaehlerZeitMessung == maxZaehlerZeitMessung) { long time = System.currentTimeMillis(); @@ -227,12 +235,13 @@ public class Mikrofon extends AppCompatActivity { //Hysterese beim Setzen bzw. Rücksetzen ob detektiert //beim ersten detektieren wird Zeitpunkt gespeichert if(ergebnis.db >= (threshold+sensitivity)){ - detection_mic = true; + detection_mic = true; //solange true, solange ergebnis.db > threshold+sensitivity erlaubt_fall = true; while(erlaubt_rise){ erlaubt_rise = false; zeit = Zeitpunkt() + " - " + ergebnis.db + " - " + (threshold+sensitivity); //Überschreiben des Zeitpunkts beim Erkennen der Detektion //nur zum Testen in zeit noch ergebnis.db und threshold ausgegeben -> muss am Ende nur Zeitpunkt() rein, Rest weg + //Amplitude zum Zeitpunkt der Detektion steht in ergebnis.db, wird zyklisch bei jedem Durchlauf der for-Schleife überschrieben } } else if (ergebnis.db <= (threshold)) { detection_mic = false; @@ -260,7 +269,7 @@ public class Mikrofon extends AppCompatActivity { private Verarbeitungsergebnis verarbeiten(short[] daten, int n) { String status; short maxAmp = -1; - int db = 0; + int db = 0, wert_db = 0; if (n == AudioRecord.ERROR_INVALID_OPERATION) { status = "ERROR_INVALID_OPERATION"; @@ -278,7 +287,12 @@ public class Mikrofon extends AppCompatActivity { maxAmp = ringPuffer.maximum(); } //Umwandlung Amplitudenwert in dB - db = (int) (20*Math.log10(maxAmp)); + wert_db = (int) (20*Math.log10(maxAmp)); + + if(wert_db > 0){ + db = wert_db; + } + return new Verarbeitungsergebnis(status, maxAmp,0, db); }