More goertzel improvements
authorHarvie <tomas@mudrunka.cz>
Tue, 31 Jul 2012 23:24:22 +0000 (01:24 +0200)
committerHarvie <tomas@mudrunka.cz>
Tue, 31 Jul 2012 23:24:22 +0000 (01:24 +0200)
c/goertzel/dtmf.sh
c/goertzel/goertzel.c

index 6c7798e956ce113417a02e114e1738a06065dae9..2c6547d3a27672667c4f1cfa4708b155b36ba001 100755 (executable)
@@ -1,11 +1,14 @@
 #!/bin/bash
 #This is sample implementation of DTMF decoder using my C implementation of Goertzel Algorithm
 #This is not very efficient or precise, it's just proof of concept
+#Note that it's also quite tricky (but not imposible) to detect DTMF using microphone
+#You will probably need to tune treshold and mixer settings a bit...
+#I've had best results using dtmfdial (Linux software) and two soundcards connected directly using cable
 #Usage example: arecord 2>/dev/null | ./dtmf.sh
 
-tresh=3
+tresh=10
 last='';
-./goertzel -i -q -r 8000 -s 400 -t $tresh -f 697 -f 770 -f 852 -f 941 -f 1209 -f 1336 -f 1477 -f 1633 | while read line; do
+./goertzel -i -q -a -r 8000 -s 400 -t $tresh -f 697 -f 770 -f 852 -f 941 -f 1209 -f 1336 -f 1477 -f 1633 $@ | while read line; do
        #echo "$line";
 
        #Get time
index f5250a0d11e2740e2a4e9987c0bae928c78796a1..a26975023f6858367a813670f89d4f2bfc865388 100644 (file)
@@ -76,12 +76,13 @@ int main(int argc, char ** argv) {
        int samplecount = 4000;
        int treshold = -1;
        char noreturn = 0;
+       char repeat = 1;
        char integers=0;
        char verbose=1;
        int freqs[argc+1]; freqs[0]=-1;
 
        int opt;
-       while ((opt = getopt(argc, argv, "?r:s:f:t:iqn")) != -1) {
+       while ((opt = getopt(argc, argv, "?r:s:f:t:iqna")) != -1) {
                switch (opt) {
                        case 'r':
                                samplerate = atoi(optarg);
@@ -98,6 +99,9 @@ int main(int argc, char ** argv) {
                        case 'i':
                                integers = 1;
                                break;
+                       case 'a':
+                               repeat = 0;
+                               break;
                        case 'n':
                                noreturn = 1;
                                break;
@@ -152,7 +156,7 @@ int main(int argc, char ** argv) {
 
                        //Set print true if over treshold or if changed to false (print for the last time after going under treshold)
                        printnow = power[i] > treshold;
-                       print = print || printnow || (printlast && !noreturn);
+                       print = !(!repeat && printlast && !(!printnow)) && (print || printnow || (printlast && !noreturn));
                }
                printlast = printnow;
                fflush(stdout);
This page took 0.147044 seconds and 4 git commands to generate.