...
Tu trzeba będzie chyba stworzyć system czasu rzeczywistego, tzn. Jeden Timer będzie musiał odmierzać czas w systemie, z potrzebną dokładnością, a w zadanym czasie gdzieś trzeba będzie zbierać próbki i po jego upływie dopiero analizować. Ale też trzeba przeanalizować standard DTMF, aby wiedzieć jaki jest czas trwania tonu, oraz przerwy między nimi. ogólnie pomysł bym na to miał ale na razie nie bardzo mam czas za tym siąść.
Jeżeli masz znany czas trwania tonu to nie ma problemu, robisz tabilcę, zawierającą liczniki dla każdego z tonów. I tak jeżeli wykryjesz dany ton do zwiększasz odpowiadający mu licznik w tablicy, po czasie pomiaru / trwania tonu, sortujesz tą tablicę, i sprawdzasz które tony w niej wystąpiły i ile razy.
Ogólnie cały program będzie dosyć mocno statystycznym analizatorem.
PS. po gubiłem się trochę, jakie tony trzeba szukać, bo nic o tej 5-tonowej modulacji nie wiem ? wymień może wszystkie szukane częstotliwości, będzie łatwiej. wiem że to zwiazane z CB-Radio ale nic nie umiem na ten temat odnaleźć.
PS. Na razie uskrobałem coś takiego. To bardziej idea niż gotowy program ale powinno zadziałać.
Opcjonalny słownik dla szukania, zoptymalizowany pod katem szybkości szukania i histerezy +/- 1Hz, wymaga lekkiej zmiany w algorytmie sortowania. Dla standardu EEA.
WAŻNE !! Potrzebowałbym paru dodatkowych informacji. Otóż wg. opisu z Wiki, ton może trwać od 20 do 100ms, czyli cala ramka może mieć czas od 100 (20msx5) do 500ms(100ms x 5). na pewno jest jakaś przerwa między kolejnymi ramkami, jaka ona jest ?
Ogólnie cały program będzie dosyć mocno statystycznym analizatorem.
PS. po gubiłem się trochę, jakie tony trzeba szukać, bo nic o tej 5-tonowej modulacji nie wiem ? wymień może wszystkie szukane częstotliwości, będzie łatwiej. wiem że to zwiazane z CB-Radio ale nic nie umiem na ten temat odnaleźć.
PS. Na razie uskrobałem coś takiego. To bardziej idea niż gotowy program ale powinno zadziałać.
Kod: Zaznacz cały
$regfile = "m32def.dat"
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
$crystal = 16000000
Config Lcd = 16 * 2
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising , Noise Cancel = 1
Config Aci = On , Compare = On , Trigger = Rising
On Icp1 Przerwanie
Enable Icp1
Cls
Enable Interrupts
Dim Countcycles As Word
Dim Icr_new As Word
Dim Icr_old As Word
Dim B12 As Bit
Dim Temp As Word
Dim Tony(16) As Byte
Dim I As Byte
Do
'Algorytm sortujacy
If B12 = 1 Then ' jeżeli pomiar zakończony to:
Reset B12 ' restartuj znacznik pomiaru
Restore Szukane ' restartuj wskaźnik do tablicy szukanych wzorców
For I = 1 To 16 ' rozpocznij sortowanie
Read Temp ' odczytaj wzorzec (kolejny dla kolejnych przebiegów pętli)
If Icr_new = Temp Then ' jeżeli wzorzec zgodny z pomiarem
Incr Tony(i) , ' to - Zwieksz Licznik Dla Danego Wzorca W Tablicy Pomiarów
Exit For ' zakończ sortowanie
End If
Next I
End If ' i czekaj na kolejny pomiar
Loop
Przerwanie:
Countcycles = Timer1
Icr_new = Countcycles - Icr_old
Icr_old = Countcycles
Set B12
Return
Szukane:
Data 1981 '0
Data 1124 '1
Data 1197 '2
Data 1275 '3
Data 1358 '4
Data 1446 '5
Data 1540 '6
Data 1640 '7
Data 1747 '8
Data 1860 '9
Data 2110 'E < przeniesiono go tutaj bo może występować częściej niż inne znaki, a to skraca czas sortowania.
Data 930 'B
Data 2247 'C
Data 991 'D
Data 2400 'A
Data 1055 'FKod: Zaznacz cały
Szukane:
'Wer 1.1, słownik zoptymalizowany pod katem szybkości szukania i histerezy.
Data 2399 'C (2400Hz),Najkrótszy impuls, najkrótszy czas wyszukania
Data 2246 'F (2247Hz)
Data 2109 'E (2110HZ)
Data 1980 '0 (1981Hz)
Data 1859 '9 (1860Hz)
Data 1746 '8 (1747Hz)
Data 1639 '7 (1640Hz)
Data 1539 '6 (1540Hz)
Data 1445 '5 (1446Hz)
Data 1349 '4 (1350Hz) '
Data 1274 '3 (1275Hz)
Data 1196 '2 (1197Hz)
Data 1123 '1 (1124Hz)
Data 1054 'A (1055Hz)
Data 990 'D (990Hz)
Data 929 'B (930Hz), najdłuższy impuls, najdłuższy czas szukaniaJa na razie walczę z moim ATTINY681. Trochę to zajmuje bo to procesor projektowany do budowy sterowników silników BLCD i falowników, wiec jego Timery mają trochę za dużo funkcji, i ich konfiguracja, to ustawienie tuzina rejestrów. Dopiero doszedłem do testu stabilności 0 (GND), bo chce spróbować wykorzystać wewnętrzny komparator. Wynik jest taki, jak na filmiku niżej, ale dużo zależy od źródła zasilania, na zasilaczu jest max 15mV wahania, dla zasilania z programatora USB 50mV wahania.
http://www.youtube.com/watch?v=Arl3JAcj ... detailpage
Co do samego programu, twoje wyjaśnienia rzucają dużo światła na same podejście do projektowania algorytmu. Algorytm wykrywania musi łapać tylko częstotliwość która trwa minimum 20ms, ale nie dłużej niż 120ms (max standardu + 20% na ewentualny rozrzut).
Co do metody pomiaru. Ja założyłem że Timer mierzący czas impulsu zwraca od razu gotowy wynik, więc jest taktowany 2MHz, co powoduje że w czasie pomiaru półokresu, bo to mierzymy między przejściami przez zero, uzyskujemy z niego od razu wynik w Hz, i nie są konieczne już żadne inne operacje do obliczenia złapanej częstotliwości poza, uwzględnieniem histerezy.
Ogólnie powoli (w miarę czasu) nad tym pracuję. Ogólnie całość będzie wymagać, wymyślenia jakieś sprytnej i szybkiej metody, najlepiej takiej która max, wykorzysta właściwości sprzętowe Timerów, aby jak najmniej liczyć, a co najwyżej porównywać ze sobą i sortować dane.
http://www.youtube.com/watch?v=Arl3JAcj ... detailpage
Co do samego programu, twoje wyjaśnienia rzucają dużo światła na same podejście do projektowania algorytmu. Algorytm wykrywania musi łapać tylko częstotliwość która trwa minimum 20ms, ale nie dłużej niż 120ms (max standardu + 20% na ewentualny rozrzut).
Co do metody pomiaru. Ja założyłem że Timer mierzący czas impulsu zwraca od razu gotowy wynik, więc jest taktowany 2MHz, co powoduje że w czasie pomiaru półokresu, bo to mierzymy między przejściami przez zero, uzyskujemy z niego od razu wynik w Hz, i nie są konieczne już żadne inne operacje do obliczenia złapanej częstotliwości poza, uwzględnieniem histerezy.
Ogólnie powoli (w miarę czasu) nad tym pracuję. Ogólnie całość będzie wymagać, wymyślenia jakieś sprytnej i szybkiej metody, najlepiej takiej która max, wykorzysta właściwości sprzętowe Timerów, aby jak najmniej liczyć, a co najwyżej porównywać ze sobą i sortować dane.
BASCOM, bo C na AVRy nie znam za dobrze. Jedynie C, na PICi jako tako znam. ogólnie musi się dać zrobić w BASCOM na procku taktowanym max 16MHz.
Ja z racji posiadanej bazy jestem skazany na ATTINY681 taktowanej wewnętrznym oscylatorem 8MHz, ale to nie powinno być wielkim ograniczeniem, poza stabilnością pomiaru.
Ja z racji posiadanej bazy jestem skazany na ATTINY681 taktowanej wewnętrznym oscylatorem 8MHz, ale to nie powinno być wielkim ograniczeniem, poza stabilnością pomiaru.
Sam rozrzut pomiaru wynika, z kilku przyczyn. Eksperymentując z komparatorem, jak już pisałem zauważyłem że "ZERO" pływa, i to nawet o 50-60mV, to powoduje, że detekcja przez zero też pływa, w tym zakresie wahań, czyli dla tej samej częstotliwości będziemy uzyskiwać, minimalnie różniące się wyniki, ale im ta częstotliwość, będzie wyższa, tym wyższy będzie rozrzut pomiaru, co pokazują pańskie wyniki dla 1KHz i dla 6KHz.