| Author |
Message
|
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#1
06 Mar 2008 01:06 Dekodowanie CTCSS |
|
|
|
Dekodowanie CTCSS.
Chodzi o układ mierzący okres sygnału podnośnej CTCSS (mikroprocesor). Jak właściwie interpretować pomiary okresu podnośnej tak aby odpowiednio włączać i wyłączac audio w RX zakładając że sygnał może czasami zanikać , mogą być zakłócenia itd. Jaką dobrać histerezę itd. Czy ktoś już główkował nad tym? A może praktykował?
|
|
| Back to top |
|
 |
green33 Poziom 22

Joined: 22 Sep 2003 Posts: 1561 Location: Pabianice/Łódź
|
#2
06 Mar 2008 12:24 Re: Dekodowanie CTCSS |
|
|
|
Generalnie w Motoroli z tego co pamiętam ustawia się tak jeden parametr, że jak odbierze CTCSS to zdejmuje blokadę tonową na jakiś zdefiniowany czas - kilka sekund aby w przypadku słabego sygnału z niskim poziomem tonu nie szatkowało korespondenta, chyba domyślnie jest to 5 - 7 sekund. jeśli w tym czasie CTCSS się nie pojawi ponownie to zamyka SQ.
Marcin
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#3
06 Mar 2008 12:30 Re: Dekodowanie CTCSS |
|
|
|
Czli dajmy na to po kilku odebranych prawidłowych okresach podtrzymać Sq - ciekawe.
|
|
| Back to top |
|
 |
green33 Poziom 22

Joined: 22 Sep 2003 Posts: 1561 Location: Pabianice/Łódź
|
#4
06 Mar 2008 12:35 Re: Dekodowanie CTCSS |
|
|
|
Tak to jest realizowane, chyba nie głupi pomysł... proste i się sprawdza. Może nie podtrzymać SQ, bo wtedy po zaniku sygnału korespondenta będzie szumieć, ale po powiedzmy, że po 200 ms prawidłowo odebranego tonu należało by automatycznie zdjąć blokadę tonową i SQ by wtedy pracowało otwierane samą nośną przez następne 5 sekund.
Marcin
|
|
| Back to top |
|
 |
Google

|
#
06 Mar 2008 12:35 |
|
|
|
|
|
| Back to top |
|
 |
Driver- Poziom 22

Joined: 23 Mar 2005 Posts: 2180 Location: Ustrzyki Dolne
|
#5
06 Mar 2008 22:06 Re: Dekodowanie CTCSS |
|
|
|
Wymyśliłem taki algorytm, opatry na dwóch timerach, poziomie nośnej i częstotliwości subtonu:
| Code: |
czas_f=x //czas np. w ms ustawione ręcznie wg. uznania - obserwacji
próbka=36 // napięcie subtonu ustawione ręcznie wg. uznania - obserwacji
pętla // początek
poziom=start
poziom=stop
IF (poziom>probka) // sprawdza pojawienie się jakiegokolwiek subtonu na podstawie próbki/ek i przy określonym w "probka" poziomie napięcia przypisuje logiczne "1" dla zmiennej ctss, jeśli nie ma subtonu lub zbyt słaby ctss "0"
{
ctss="1"
}
ELSE
{
ctss="0"
}
IF (ctss=="0" && (czas1==0) // sprawdza czy jest nośna subtonu i startuje timer 2 w celu porównaniu czasu po zaniku nośnej
{
timer2=start
czas2=czas_t2
}
ELSEIF (ctss=="1" && czas2==0) // sprawdza czy jest nośna subtonu, jeśli czas timera 2 jest wyzerowany i startuje odliczanie czasu timera 1
{
timer1=start
}
IF (ctss=="1" && czas1>0) // sprawdza czy jest nośna subtonu i czy w timerze 1 trwa odliczanie
{
pom_F=start // startuje pomiar częstotliwości subtonu
wait x // w tym czasie mierzy czestotliwość, powiedzmy 1 okres x impulsów, np w 1 okresie masz 1109 impulsów to F subtonu-110,9 Hz
pom_F=stop
ton=F // przypisuje zmiennej ton ilość impulsów 1 okresu subtonu
czas1=czas_t1 // odczytuje czas odliczany przez timer
timer2=clear // jednocześnie zeruje timer 2, aby przygotować go do ponownego odliczania gdy zaniknie nośna
}
ELSEIF (ctss=="0" && czas2<czas_f) // sprawdza czy jest nośna subtonu i zabezpiecza przed zanikami nośnej subtonu przez określony czas
{
ton=ton
}
ELSEIF (ctss=="0" && czas2>czas_f) // sprawdza czy jest nośna subtonu i jeśli zostanie przekroczony czas_f przygotowuje włączenie blokady
{
ton=0
}
IF (ton==1109 && czas1>0) // wyłącza blokadę i rozpoznaje stacje na podstawie F subtonu
{
SQL="0"
print="nazwa stacji1"
}
ELSEIF (ton==1413 && czas1>0)
{
SQL="0"
print="nazwa stacji2"
}
ELSEIF (ton==1622 && czas1>0)
{
SQL="0"
print="nazwa stacji3"
}
ELSE //załacza blokadę jeśli żaden warunek nie został spełniony
{
SQL="1"
print="kanal wolny"
ton=0 //zeruje zmienną subtonu
//zeruje timery przygotowując je do ponownego odczytu.
timer1=clear
timer2=clear
}
koniec petli // skok do początku |
gdzie stałe (zmienne):
poziom - zmienna z miernika napięcia
ctss - zmienna, poziom logiczny subtonu "0 lub 1"
czas_f - stała, maksymalny czas otwarcia blokady po zaniku subtonu
czas1 - zmienna, czas z timera 1
czas2 - zmienna, czas z timera 2,
ton - zmienna, częstotliwość subtonu
SQL - zmienna "0" otwiera, "1" zamyka blokadę ale można to zmienić
print - tekst na wyświetlacz
Mam nadzieję że kojarzysz operatory && - logiczne "i".
IF - warunek
(....) - zależność/ci
{....} polecenia;
ELSEIF - sprawdza jeśli zależność/ci IF lub poprzedni ELSEIF nie zostały spełnione;
ELSE wykonuje {polecenia} jeśli żaden warunek IF lub ELSEIF po IF nie został spełniony
"" - tekst
// komentarze
Oczywiście to przykład przeanalizuj i może coś z tego wyjdzie. Nie znam możliwości procka i trzeba to przełożyć na program dla procka zrozumiały. Zarezerwować komórki pamięci dla stałych i zmiennych, dodatkowy kod do zmiany - edycji stałych dla pętli, wypisania na wyswietlaczu nazwy stacji itp.
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#6
07 Mar 2008 10:25 Re: Dekodowanie CTCSS |
|
|
|
Mam nadzieje że nie klepałeś tego kodu specjalnie do tematu :D
Do dyspozycji mam prawdopodobnie tylko 1 timer a sygnał okresu tonu pochodzi z przerwania.
Przy takich zasobach określenie jaki jest ton i czy przychodzi i czy sie mieści w tabeli tonów to nie problem.
Chodzi raczej o to ile prawidłowych okresów przyjąć za punkt do otwarcia audio RX i jaki czas dać na ponowne pojawienie się prawidłowych okresów przy zaniku sygnału albo przy zakłóceniach.
Pod uwagę ma być brany również sygnał fali nośnej z klasycznej blokady szumu.
|
|
| Back to top |
|
 |
Driver- Poziom 22

Joined: 23 Mar 2005 Posts: 2180 Location: Ustrzyki Dolne
|
#7
07 Mar 2008 21:56 Re: Dekodowanie CTCSS |
|
|
|
Kod napisałem pod temat, ale to dla mnie nie problem piszę bardziej skomplikowane rzeczy, ale nie o tym mowa. W tym kodzie wydaje mi się jest to dobre, że pomiar okresu masz przy określonym poziomie napięcia subtonu, więc możesz ustawić jakieś minimalne napięcie przy którym pomiar okresu będzie pewny. Najniższa f subtonu to 67 Hz więc okres trwa ~15ms dla 5 okresów będzie to ~75ms, myślę ze 5 czy 6 powtórzeń wystarczy. Musisz przyjąć jakiś kompromis żeby czas pomiaru "n" okresów nie był za długi. Dodatkowo wynik kolejnych pomiarów możesz umieścić w w pamięci a potem obliczyć ich średnią, porównać z wartościami w tabeli, czy nawet określić zakres błędu, od-do poprawny poniżej-powyżej błędny, dla każdego subtonu. Można też zrobić tak że uzależnić pomiar od napięcia subtonu, przy którym subton jest bez śmieci zapamiętać jego wartość i od blokady szumu ("0" otwarta "1" zamknieta), czyli:
| Code: |
IF (ctss=="1" && blok_s=="0") // sprawdza czy jest nośna subtonu i czy jest odblokowana blokada szumu
{
pom_F=start // startuje pomiar częstotliwości subtonu
wait x // w tym czasie mierzy czestotliwość, powiedzmy 1 okres x impulsów, np w 1 okresie masz 1109 impulsów to F subtonu-110,9 Hz
pom_F=stop
ton=F // przypisuje zmiennej ton ilość impulsów 1 okresu subtonu
timer=clear // jednocześnie zeruje timer, aby przygotować go do ponownego odliczania gdy zaniknie nośna
}
ELSEIF (ctss=="0" && czas2<czas_f) // sprawdza czy jest nośna subtonu i zabezpiecza przed zanikami nośnej subtonu przez określony czas
{
ton=ton
}
ELSEIF (ctss=="0" && blok_s=="0") // sprawdza czy jest nośna subtonu i czy blokada szumu jest otwarta
{
ton=ton
}
ELSEIF (ctss=="0" && czas2>czas_f || blok_s=="1") // sprawdza czy jest nośna subtonu i jeśli zostanie przekroczony czas_f lub gdy zamknie się blokada szumu przygotowuje włączenie blokady CTCSS
{
ton=0
} |
Dalej kod pozostaje bez zmian.
Poniżej dodałem wewnętrzną pętle dla 5 pomiarów, możesz wysłać pomiary w formie tablicy do pamięci. Wywaliłem też jeden timer a zastapiłem go blokadą szumu. Całość może wyglądać tak:
| Code: |
czas_f=x //czas np. w ms ustawione ręcznie wg. uznania - obserwacji
próbka=36 // napięcie subtonu ustawione ręcznie wg. uznania - obserwacji
pętla // początek
poziom=start
poziom=stop
IF (poziom>probka) // sprawdza pojawienie się jakiegokolwiek subtonu na podstawie próbki/ek i przy określonym w "probka" poziomie napięcia przypisuje logiczne "1" dla zmiennej ctss, jeśli nie ma subtonu lub zbyt słaby ctss "0"
{
ctss="1"
}
ELSE
{
ctss="0"
}
IF (ctss=="0" && (blok_s=="1") // sprawdza czy jest nośna subtonu i otwarcie blokady szumu, startuje timer w celu porównaniu czasu po zaniku nośnej
{
timer=start
czas=czas_t
}
IF (ctss=="1" && blok_s=="0") // sprawdza czy jest nośna subtonu i czy jest odblokowana blokada szumu
{
// początek wewnetrznej pętli dla 5 pomiarów częstotliwości subtonu
FOR p=0 p<5 p+1
{
wait x // w tym czasie mierzy czestotliwość, powiedzmy 1 okres x impulsów, np w 1 okresie masz 1109 impulsów to F subtonu-110,9 Hz
ton[p]=F // przypisuje zmiennej "ton" o indeksie zmiennej "p" ilość impulsów 1 okresu subtonu, czyli tworzy tablicę o nazwie ton
}
// koniec wewnetrznej petli
timer=clear // jednocześnie zeruje timer, aby przygotować go do ponownego odliczania gdy zaniknie subton lub zamknie się blokada szumu
}
ELSEIF (ctss=="0" && blok_s=="0") // sprawdza czy jest nośna subtonu i czy blokada szumu jest otwarta
{
ton=ton
}
ELSEIF (ctss=="0" && czas<czas_f) // sprawdza czy jest nośna subtonu i zabezpiecza przed zanikami nośnej subtonu przez określony czas
{
ton=ton
}
ELSEIF (ctss=="0" && czas>czas_f || blok_s=="1") // sprawdza czy jest nośna subtonu i jeśli zostanie przekroczony czas_f lub gdy zamknie się blokada szumu przygotowuje włączenie blokady CTCSS
{
ton=0
}
IF (ton==1109 && blok_s=="0") // wyłącza blokadę CTCSS i rozpoznaje stacje na podstawie F subtonu
{
SQL="0"
print="nazwa stacji1"
}
ELSEIF (ton==1413 && blok_s=="0")
{
SQL="0"
print="nazwa stacji2"
}
ELSEIF (ton==1622 && blok_s=="0")
{
SQL="0"
print="nazwa stacji3"
}
ELSE //załacza blokadę jeśli żaden warunek nie został spełniony
{
SQL="1"
print="kanal wolny"
ton=0 //zeruje zmienną subtonu
//zeruje timer przygotowując je do ponownego odczytu.
timer=clear
}
koniec petli // skok do początku |
Zauważ że zmienna "ton" nie jest zmieniana gdy napięcie CTCSS zaniknie, lecz czas w zmiennej "czas_f" nie zostanie przekroczony, lub gdy zamknie się bloka szumu. Dopiero zmiejszenie się napięcia subtomu poniżej zaprogramowanego, przekroczenie czasu "czas_f" lub zamknięcie blokady szumu zeruje zawartość "ton".
A na co dajesz na przerwanie :?:
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#8
07 Mar 2008 23:23 Re: Dekodowanie CTCSS |
|
|
|
Mam o tyle komfortową sytuację że filtrowaniem sygnału CTCSS zajmuje się sprzętowy audioprocesor (specjalizowany do sprzętu łączności). Dostaję z niego gotowy sygnał przerwania i muszę tylko zbadać czas między kolejnymi impulsami INT.
Przerwanie pojawia się przy obydwu zboczach sygnału podnośnej (przejście przez zero) więc kolejne pytanie ... badać czas pomiędzy kolejnymi przerwaniami (połówka okresu) czy sumować 2 czasy i to brać pod uwagę?
Nie ma możliwości pomiaru poziomu samego sygnału podnośnej.
|
|
| Back to top |
|
 |
Google

|
#
07 Mar 2008 23:23 |
|
|
|
|
|
| Back to top |
|
 |
Driver- Poziom 22

Joined: 23 Mar 2005 Posts: 2180 Location: Ustrzyki Dolne
|
#9
07 Mar 2008 23:49 Re: Dekodowanie CTCSS |
|
|
|
Jeśli masz osobny procesor audio to nie ma porzeby sumowania czasów. Wystarczy pomiar pomiedzy przerwaniami. Czyli to co nazywasz przerwaniem to szpilka "0" lub "1" czy jakoś inaczej. A co jeśli nie ma CTCSS co proc-audio wtedy daje :?:
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#10
08 Mar 2008 00:17 Re: Dekodowanie CTCSS |
|
|
|
| Driver- wrote: |
Jeśli masz osobny procesor audio to nie ma porzeby sumowania czasów. Wystarczy pomiar pomiedzy przerwaniami.
|
Jeśli jest zachowana symetria to owszem ale dmucham na zimne.
| Driver- wrote: |
Czyli to co nazywasz przerwaniem to szpilka "0" lub "1" czy jakoś inaczej.
|
Przerwanie to zbocze opadające.
| Driver- wrote: |
A co jeśli nie ma CTCSS co proc-audio wtedy daje :?: |
A tego nie wiem jeszcze ale pewnie nic nie daje na chłopski rozum - nota scalaka jest enigmatyczna i do pewnych pewników dochodzę eksperymentem co daje rezultat oczywiście :D[/quote]
|
|
| Back to top |
|
 |
BONO Poziom 22

Joined: 11 Dec 2002 Posts: 1541 Location: olsztyn
|
#11
08 Mar 2008 01:09 Re: Dekodowanie CTCSS |
|
|
|
jedno pytanko , mozna zaprogramowac czestoliwosc bez ctcss i odbierac wszytsko co nadają na danej czestotl. ? jak wyglada taki przekaz czy ten subton zakłuca cała rozmowe ?
|
|
| Back to top |
|
 |
lukashb Poziom 24

Joined: 06 Nov 2004 Posts: 4571 Location: -!
|
#12
08 Mar 2008 14:08 Re: Dekodowanie CTCSS |
|
|
|
To wygląda tak, że jak niemasz wprowadzonej podnośnej PL, to możesz słuchać wszystkich na danym kanale. Wyobraź sobie to tak:
Jest 4 użytkowników, A,B,C,D
A i B mają ustawioną tą samą częstotliwość co C i D tylko, że różne podnośne. I teraz tak. A woła B, i ten go słyszy, jednak ani C ani D tego niesłyszy, i jeżeli w tym samym czasie wszyscy chcą rozmawiać to się niedogadają, nałożą się na siebie. Tak samo jest z sytuacją osób C i D, wtedy A i B niesłyszą ich. To tak wygląda.
|
|
| Back to top |
|
 |
Driver- Poziom 22

Joined: 23 Mar 2005 Posts: 2180 Location: Ustrzyki Dolne
|
#13
08 Mar 2008 14:36 Re: Dekodowanie CTCSS |
|
|
|
No tak jeśli przerwanie będzie symetryczne to nie obejdzie się bez sumowania, chyba że będziesz wiedział jaka jest różnica w asymetrii. Ale wydaje mi się że to za dużo kombinacji. A może maskować co drugie przerwanie przychodzące z proc audio wtedy mierzył by czas 1 okresu bez potrzeby sumowania. ATmega 128 obsługuje takie maskowanie, pewnie inne ATmegi tez to mają. Jeśli dało by się maskować poszczególne przerwania z INT, to można by zrobić tak, blokada szumów mogła by robić przewanie poziomem, po upływie minimalnego czasu inicjującego to przerwanie, zostały by uaktywnione przerwania z proc-audio. Zmierzyć i zsumować po dwa, czas kilku powiedzmy 8 przerwań z proc-audio, co daje 4 pełne okresy. Obliczenia wysłać do pamięci, a kolejne przerwania z proc-audio zamaskować, do czasu aż z blokady szumów przyjdzie kolejne przerwanie. W pozostałym czasie po obliczeniach program korzystał by z danych subtonów zapisanych w pamięci, więc procek nie musiał by obsługiwać wszystkich przerwań z proc-audio tylko tych kilka. Ustawić też priorytet przerwań i jako adrzędne ustawić przerwanie z blokady szumów. Jeśli w czasie działania przerwania z blokady szumów nie było by przerwań z proc-audio to oznaczało by ze albo brak jest subtonów lub są one zbyt słabe.
|
|
| Back to top |
|
 |
Google

|
#
08 Mar 2008 14:36 |
|
|
|
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#14
08 Mar 2008 16:51 Re: Dekodowanie CTCSS |
|
|
|
| Driver- wrote: |
| ATmega 128 obsługuje takie maskowanie, pewnie inne ATmegi tez to mają. . |
Chyba już się nie robi procków z niemaskowanymi przerwaniami :D
Mój typ do tego zadania to AT89S52 i wszelkie połączenia mam już narzucone.
Zastanawiam się czy uśredniać pomiary - porobiłem pomiary okresu częstościomierzem na INT i podając na RX nawet słaby sygnał RF tuż przed zamknięciem klasycznej blokady szumu i pomiary są jednolite.
|
|
| Back to top |
|
 |
Driver- Poziom 22

Joined: 23 Mar 2005 Posts: 2180 Location: Ustrzyki Dolne
|
#15
08 Mar 2008 19:57 Re: Dekodowanie CTCSS |
|
|
|
| sq6ade wrote: |
| Chyba już się nie robi procków z niemaskowanymi przerwaniami |
Nawet wśród bąków są zbączenia :) a zbączeni konstruktorzy różne dziwa robią. :D
Jak przerwania masz narzucone to nie poszalejesz za bardzo :| Moim skromnym zdaniem lepiej uśrednić pomiar i jak to zgrabnie ująłeś na zimne dmuchać. Pomiary pomiarami a w praktyce może być różnie. Zwłaszcza jak się trafi na korespondenta z miernym sprzętem z drugiej strony, do tego interferencje i inne ciekawostki przyrodnicze. A na uśrednienie wiekiej ilości cykli procek nie zużyje, więc może warto.
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#16
08 Mar 2008 20:59 Re: Dekodowanie CTCSS |
|
|
|
W tej konfiguracji sprzętowej podobny procek już to robi ale z innym programem więc się da.
Co do tolerancji tonów identyfikowanych założyłem tabelę bez "martwych miedz" czyli dany ton radio będzie "widzieć" najszerzej jak się da :D
|
|
| Back to top |
|
 |
sq6ade Poziom 25

Joined: 12 May 2003 Posts: 6930 Location: Południowo-zachodnia Pomroczna
|
#17
18 Mar 2008 22:09 Re: Dekodowanie CTCSS |
|
|
|
Witam ponownie - sory że pod własnym ale prosze tego nie kasować.
Z przeprowadzonych eksperymentów na sprzęcie wynikł mi taki wniosek że należy mierzyć jednak cały okres a nie pół ponieważ nigdy nie wiemy jaki nadajnik ma stacja której podnośną mierzymy. W moim przypadku detekcji poddałem sygnały z Kenwooda TH-D7 i TM-D700. Ich sygnał podnośniej nie jest symetryczny. Napsuło mi to sporo krwi.
:D
|
|
| Back to top |
|
 |