Forum APRS Polska

Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Szukanie zaawansowane  

Aktualności:

Strony: 1 [2] 3 4 ... 6

Autor Wątek: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem  (Przeczytany 38888 razy)

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #15 dnia: Styczeń 03, 2013, 11:55:09 LOC »

W sumie jak pisalem nie jest to takie trudne jak sie wydaje :) Do odbioru potrzeba przetwornik i jeden timer (ustawiony na 9600 Hz) i tutaj albo sobie wyzwalasz z timera przetwornik (dane pobierasz w przerwaniu konca konwersji przetwornika), albo przetwornik ustawiony na ciagle samplowanie i pobierasz w przerwaniu timera probke. Ewentualnie jak chcesz robic oversampling (dwukrotne zwiekszenie czestotliwosci zwieksza ci rozdzielczosc o 0.5LSB) to odpowiednie zwiekszona czestotliwosc probkowania i dalej decymacja. Zreszta o oversamplingu mozna sporo poczytac (z tego co wiem sa nawet przyklady do STM32 na stronie producenta) i to nie jest problem.

Odnosnie tego co robi Tomek SP9UOB to rozrysowane jest na jego stronie: http://sp9uob.verox.pl/dstnc.html

Natomiast koncepcje (troche sie ona rozni od tego co zrobil SP9UOB) opisal Thomas Sailer w  "Internationale Packet-Radio Tagung Darmstadt, 1995" - do znalezienia w google... Niestety jezyk niemiecki ktorego ja nie qmam ;) ale rysunki i przykladowy kod spokojnie mi wystarczyly...

Co prawda jest tam opisane to jako korelacja (a nie jak u SP9UOB) jako filtr FIR... ale w sumie od strony implementacji nie ma tutaj znaczenia bo jest to ogolnie znany z matematyki splot...

Zreszta w przypadku STM32 jest nawet spore ulatwienie w postaci kursu jaki byl publikowany w EdW. Czyli STM32 w zastosowaniach DSP... a w numerze 02/2012 masz 8 czesc kursu poruszajaca temat filtrow FIR (wraz z przykladowymi zrodlami do sciagniecia). He he wlasnie ostatnio to znalazlem i nawet polutowalem sobie wlasnie plytke do tego kursu (opisana w EdW 01/2011), wlasnie pod katem szybszego testowania niektorych algorytmow... ot na pokladzie mam wszystko co potrzebuje i nie musze robic pajakow :)

Mozna tez zerknac sobie na zrodla multimon-a (http://www.baycom.org/~tom/ham/linux/multimon.html), gdzie msz pelna implementacje ktora napisal Thomas Sailer. W sumie sposobow na detekcje jest jeszcze kilka w tym to co opisujesz liczenie przejsc przez zero... jednak to roziwazanie jest raczej kiepskie i nie radzi sobie z slabymi sygnalami.

Tak samo w BeRTOS (na Andruino) masz implementacje na filtrach IIR - http://www.bertos.org/use/examples-projects/arduino-aprs/
mozna ja spokojnie przerobic na filtry FIR ktore sa znacznie prostsze w uzyciu i implementacji, ewenualnie uzyc oryginalnego kodu i tez nie bedzie zle.

Natomiast na chwile obecna nie polece jeszcze konkretnego roziwazania bo sam jak pisalem bede testowal rozne warianty i wybiore ten ktory ma najlepszy stosunek obciazenia procesora do ilosci dekodowanych pakietow. Dalej pomysle nad tym co robil SP9UOB czyli filtr adaptacyjny itp. usprawnienia (ale to wszystko zalezne od tego jak bedzie sobie STM32 radzil z algorytmami DSP). Osobiscie zastanawiam sie jeszcze nad wybraniem ewentualnego algorytmu filtru adaptacyjnego aby nie zaorac procka (w sumie LMS zje najmniej cykli - ale nie wiem jak bedzie sie sprawowal w praktyce, ewentualnie moze RLS bo Kalman odpada na dzien dobry przy tym procku).
« Ostatnia zmiana: Styczeń 03, 2013, 15:26:07 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #16 dnia: Styczeń 03, 2013, 21:51:51 LOC »

@SP9RQA
Hehe, w taki sposób był zapisywany obraz na płytach LaserDisc i jakość jak na swoje czasy była nienajgorsza. No ale tam też była kupa elektroniki analogowej która przetwarzała zapis z płyty na sygnał. A tak serio to myślałem aby założyć pewną tolerancję wynoszącą 10%, tzn jeżeli czas pomiędzy kolejnymi przejściami przez zero jest równy +/-10% okresowi sygnału 1200Hz to uznaj, że jest to SPACE. Analogoicznie miało by się dziać dla MARK.

@SP7VGX
Zaczynam przeglądać dokumenty o których wspominasz i przyznam szczerzę, że zaczyna to do mnie przemawiać. A jeżeli zaczyna przemawiać to znaczy że coś z tego będzie :d. Mam jednak jedną wątpliwość tyczącą się kodu z tego niemieckojęzycznego PDFa

#define N 8 /* das Verhaeltnis Sampling-Rate durch Baud-Rate */
static int data[N];
static int coeffloi[N]; /* Koeffizienten: sin 1200 Hz */
static int coeffloq[N]; /* Koeffizienten: cos 1200 Hz */
static int coeffhii[N]; /* Koeffizienten: sin 2200 Hz */
static int coeffhiq[N]; /* Koeffizienten: cos 2200 Hz */
static int ptr=0;
/* Annahme: int 16bit, long 32bit */
/* Initialisierung */
int i;
for(i=0;i<N;i++) {
coeffloi[i]=32767*cos(2*3.1415*i/N);
coeffloq[i]=32767*sin(2*3.1415*i/N);
coeffhii[i]=32767*cos(2*3.1415*i/N*2200/1200);
coeffhiq[i]=32767*sin(2*3.1415*i/N*2200/1200);
}
/* Der Teil, der fuer jedes Sample berechnet werden muss */
int i,d;
long outloi=0,outloq=0,outhii=0,outhiq=0,out;
data[ptr]=input; ptr = (ptr+1)%N; /* % : Modulo */
for(i=0;i<N;i++) {
d = data[(ptr+i)%N];
outloi += d*coeffloi[i];
outloq += d*coeffloq[i];
outhii += d*coeffihi[i];
outhiq += d*coeffhiq[i];
}
/* Das >>15 schiebt das Komma wieder an seinen Platz */
out = (outhii>>15)*(outhii>>15)+(outhiq>>15)*(outhiq>>15)
-(outloi>>15)*(outloi>>15)-(outloq>>15)*(outloq>>15);
return out;
Chodzi o to co to jest to N definiowane na samym początku. Wyczuwam, że jest to związane z częstotliwością samplowania sygnału wejściowego ale jakoś nie mogę wymyślec z kąt wziąć jego dokładną wartość. No i jak to ma się do potencjalnie zmiennej amplitudy sygnału na wejści ADC?? Podejżewam, że gdybym znał niemiecki to wszystko bym sobie doczytał, ale moja znajomość ogranicza się do Hande Hoch i Nicht Schlissen :D :D
Zapisane
Mateusz == 43-300 Bielsko Biała

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #17 dnia: Styczeń 04, 2013, 08:40:06 LOC »

Hi

N = czestotliwosc_probkowania / predkosc_transmisji

Czyli czestotliwosc jest jasna bo zgodnie z tym co glosil Nyquist/Shannon musi byc ona co najmniej dwa razy wieksza niz najwyzsza probkowana czestotliwosc. Tutaj mamy 9600Hz natomiast predkosc 1200 czyli 9600/1200 = 8.

Najlepiej sciagnij sobie zrodlo multimon-a tam jak wspomnialem jest gotowa implementacja ktora napisal Thomas Sailer (autor tego dokumentu). Konkretnie zerknij sobie na demod_afsk12.c... Tak samo warto zainteresowac sie implementacja ktora jest w BeRTOS z tym ze wywalic te IIR i dac  3 x FIR (2 band pass tzn. 1200 i 2200 i do tego dolnoprzepustowy) w sumie z tego powodu ze FIR jest duzo latwiej zaprojektowac niz IIR i do tego jego implementacja to praktycznie jedna petla for + mnozenie z dodawaniem... w EdW masz nawet ciekawy przyklad z obejsciem przesowania elementow w tablicy z sygnalem co troche przyspiesza... Samego FIR-a mozna zaprojektowac nawet przez aplikacje WEB  http://t-filter.appspot.com/fir/index.html

Jesli natomiast chodzi o teorie to "Cyfrowe przetwarzanie sygnalow Od teorii do zastosowan - Zielinski Tomasz" calkiem fajna ksiazka z tym ze pod katem implementacji w Matlabie, mi ona pasuje bo sporo tez testuje wlasnie w Matlabie i Symulinku...
« Ostatnia zmiana: Styczeń 04, 2013, 09:18:15 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP9RQA

  • PG APRS
  • *
  • Offline Offline
  • Wiadomości: 296
    • Zdjęcia
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #18 dnia: Styczeń 04, 2013, 09:10:00 LOC »


(...)
Najlepiej sciagnij sobie zrodlo multimon-a tam jak wspomnialem jest gotowa implementacja ktora napisal Thomas Sailer (autor tego dokumentu). Konkretnie zerknij sobie na demod_afsk12.c... Tak samo warto zainteresowac sie implementacja ktora jest w BeRTOS z tym ze wywalic te IIR i dac  3 x FIR (2 band pass tzn. 1200 i 2200 i do tego dolnoprzepustowy) w sumie z tego powodu ze FIR jest duzo latwiej zaprojektowac niz IIR i do tego jego implementacja to praktycznie jedna petla for + mnozenie z dodawaniem... w EdW masz nawet ciekawy przyklad z obejsciem przesowania elementow w tablicy z sygnalem co troche przyspiesza... Samego FIR-a mozna zapeojektowac nawet przez aplikacje WEB  http://t-filter.appspot.com/fir/index.html
(...)


Kiedyś parę lat temu znalazłem fajny programik:
http://www.winfilter.20m.com/

ma tę zaletę, że może wyliczać dla liczb całkowitych co jest dość istotne w przypadku słabszych procesorów (nie trzeba przesuwać przecinka do obliczeń).

Z tego co pamiętam z okresu studiów (a dawno to było) to IIR jest niestabilny, ale wymaga mniejszej mocy obliczeniowej, natomiast FIR wręcz odwrotnie, dlatego pewnie w BeRTOS zastosowano IIR, żeby się AVR wyrobił.

W sumie zastanawiałem się kiedyś, czy nie wystarczy wykrywać tylko jednej z tych częstotliwości, a drugą po prostu przyjmować, że jeśli nie ta to znaczy się, że jest ta druga. Ale to takie moje teoretyzowanie ;-)




Zapisane
Krzysztof, Gorlice QSX 145.300
jabber:sp9rqa@jabster.pl, http://sp9rqa.net http://staregorlice.eu

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #19 dnia: Styczeń 04, 2013, 10:51:16 LOC »

Dokladnie IIR moga byc niestabilne, wszystko zalezy od projektu filtra. Natomiast projektoewanie IIR nie jest proste, choc ludzie dobrze siedzacy w analogowych filtrach wybiora tez IIR bo beda na tym gruncie pewniej sie czuli.

Generalnie takie porownanie na szybko znalezione w internecie: http://witka.eu/pwr/teoria_sygnalow/4_filtry_FIR_IIR.pdf

Co do wykrywania jednej czestotliwosci to w sumie takie podejscie tez by sie sprawdzilo, ale tak samo bylo by ono malo odporne na smieci i trudniej zrobic tutaj wmiare pewnie dzialajace DCD (Data Carrier Detect).

Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP9RQA

  • PG APRS
  • *
  • Offline Offline
  • Wiadomości: 296
    • Zdjęcia
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #20 dnia: Styczeń 04, 2013, 11:02:14 LOC »

(...)

Co do wykrywania jednej czestotliwosci to w sumie takie podejscie tez by sie sprawdzilo, ale tak samo bylo by ono malo odporne na smieci i trudniej zrobic tutaj wmiare pewnie dzialajace DCD (Data Carrier Detect).
Jakby zrobił filtr FPP, a resztę wycinał to nie powinno być tak źle. Mniej więcej wiadomo ile powinien trwać taki sygnał, więc na poziomie wykrywania jednej częstotliwości to zakłócenia powinno dać się wyłapać(w teorii oczywiście, bo raczej projektował tego nie będę, za mało czasu, wiedzy... i chyba samozaparcia)

Pozdrawiam
Zapisane
Krzysztof, Gorlice QSX 145.300
jabber:sp9rqa@jabster.pl, http://sp9rqa.net http://staregorlice.eu

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #21 dnia: Styczeń 04, 2013, 13:09:25 LOC »

@ SP6VGX
Źródła multimona również przeglądałem i powiem, że są dla mnie trochę mniej czytelne. Autor oszczędził na komentarzach a niektóre zmienne i funkcję znajduja się w zewnętrznych plikach co dodatkowo utrudnia analizę kodu. Aktualnie najbardziej przemawia do mnie schemacik ze stony SP9UOB oraz ten niemiecki pdf...

Na source z BeRTOS tez zerknąłem, ale tylko zerknałem. Filtry Czebyszewa i Buttherworda projektowałem na studiach jak miałem przedmiot teoria obwodów ale tylko w Matlabie.


Narazie projekt stoi na płytkarni, 10 stycznia wyślą mi gotowe PCB a potem ja to będę lutował i uruchamiał. Na koniec pozostanie obrona i będzie można zaczynać zabawy z APRS. Celowo wyprowadziłem sobie na złącze akcesoryjne wariometru (DB15 męskie) m.in wejścia i wejścia analogowe do przetoworników. Coraz bardziej przekouję się do tego, aby nie zajmować się zewnętrznymi układami modemów tylko wykorzystac ogromną wydajność STM32...   
« Ostatnia zmiana: Styczeń 04, 2013, 13:12:30 LOC wysłana przez SP8EBC »
Zapisane
Mateusz == 43-300 Bielsko Biała

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #22 dnia: Styczeń 04, 2013, 13:33:31 LOC »

No ja osobiscie z powodu dostepnosci gotowych scalakow (a jak sa dostepne to ich ceny) zrezygnowalem z stosowania TCM, XR-ow itp. (chodz gdzies powinna mi sie jedna sztuka TCM-a paletac po szufladzie. Po prostu nie ma sensu bo faktycznie Cortex 3 spokojnie sobie z tym poradzi nie wspominajac o F4 z FPU na ktorych znacznie mozna dopalic sprawy zwiazane z DSP. Zreszta chyba Tomek SP9UOB robil test i jego rozwiazanie na dsPIC-u wypada o wiele lepiej niz TCM jesli chodzi o ilosc dekodowanych ramek z testowego CD.

Co do filtrow itp. to ja tez w sumie nie wszystko pamietam, choc akurat w firmie troche bawimy sie w przetwarzanie sygnalow - ale to wlasnie w Matlabie - gdzie wiele funkcji ma sie gotowych - do tego to troche inne sygnaly niz audio i calkiem inna dziedzina :) Przykladowo do projektowania filtrow uzywam akurat fdatool z matlaba :)

Najwiekszym problemem przynajmniej u mnie to wlasnie brak wolnego czasu na testy, ot udaje mi sie na to wygospodarowac jedynie pare godzin w tygodniu (i to nie zawsze). Wiedze zawsze mozna sobie uzupelnic i podpierac sie literatura (wiec nie trzeba tego kuc na pamiec).

Zobacze moze w ten weekend uda mi sie chwile posiedziec przy kodzie i moze bede mial juz jakies porownanie jak rozne rozwiazania sobie radza i ile czasu procesora mniejwiecej zajmuja - to dam tutaj znac...
« Ostatnia zmiana: Styczeń 04, 2013, 14:04:07 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #23 dnia: Styczeń 04, 2013, 13:53:14 LOC »

fdatool-a to ja doskonale pamiętam :D . Projekt był zespołowy i kolega wpadł na genialny pomysł żeby załatwić go tym narzędziem. Poszedł uradowany do prowadzącego myśląc, że projekt jest z głowy. Niestety pan doktor utwierdził go w moim przekonaniu, że jednak trzeba wszystko na piechotę liczyć :D. Fdatool mógł służyć tylko do sprawdzenia. Po 12 godzinach udało mi się tak to zrobić, że jedno z drugim się zgadzało...

Zastanawia mnie też relacja prędkości próbkowania do ilości danych na wejściu filtra. Jeżeli próbkuję z prędkością 9,6kHz to co ile sampli mam uruchamiać filtr (np. ten kod który wcześniej zacytowałem), co 8? A potem? Wiem, że wszystkiego można domyślić się analizując source ale wolę dopytać się osób które mają już jakąś praktykę w temacie... Dla mnie będą to pierwsze kroki w zabawie w cyfrowe przetwarzanie sygnałów

Zapisane
Mateusz == 43-300 Bielsko Biała

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #24 dnia: Styczeń 06, 2013, 13:38:35 LOC »

Jesli chodzi o rozwiazanie z pdf-a to tam masz wszystko na gotowo, ja praktycznie uzylem gotowego kodu z tego pdf-a.

/*********************************************************************************************************************/
static int32_t afsk_demod(int input) {
/*********************************************************************************************************************/

int16_t i,d;
int32_t out_mark_i=0,out_mark_q=0,out_space_i=0,out_space_q=0;

data[ptr]=input;

ptr = (ptr+1)%SAMPLEPERBIT; /* % : Modulo */

for(i=0;i<SAMPLEPERBIT;i++)
{

d = data[(ptr+i)%SAMPLEPERBIT];
out_mark_i += d*corr_mark_i[i];
out_mark_q += d*corr_mark_q[i];
out_space_i += d*corr_space_i[i];
out_space_q += d*corr_space_q[i];
}

return  (out_space_i>>15)*(out_space_i>>15)+
(out_space_q>>15)*(out_space_q>>15)-
(out_mark_i>>15)*(out_mark_i>>15)-
(out_mark_q>>15)*(out_mark_q>>15);

}

input
to probka przychodzaca z przetwornika...

do filtra FIR tak samo pchasz kolejne przychodzace probki... w podanej EdW masz wszystko ladnie opisane z przykladowymi kodami do sciagniecia...

Odnosnie mojego zestawu testowego to ot taki pajak, lezacy na stole w pokoju (he he po przeprowadzcze nie dorobilem sie jeszcze miejsca pracy):



Jest do jak wspominalem plytka testowa z wyjsciami wyprowadzonymi na piny, druga uniwersalna to wejscie analogowe. Ot sygnal wchodzi na nia z karty muzyczniej prze 100nF dalej 2 rezystory idzie kabelkiem na przetwornik w procku. Jak widac nic wyrafinowanego i brak filtru antyaliasingowego...


Co do wstepnych wynikow to na razie nie mam jeszcze dokonczonego ax25, na chwile obecna wysylanie na port szeregowy w postaci RAW pakietow z prawidlowa suma kontrolna (i takie sa liczone).

rozwiazanie z BeRTOS (zastapione filtrami FIR):
796 i 788 pakietow (2 testy)

rozwiazanie z niemieckiego PDF-a (kod wyzej):
824, 819, 825 (3 testy)

rozwiazanie z niemieckiego PDF-a + oversampling (o jeden bit w gore czyli 4 krotne zwiekszenie czestotliwosci probkowania):
933, 932 (2 testy)

Plik tekstowy z terminala (932 ramki w RAW) w zalaczniku

Co do tego ile czasu zajmuja procedury jescze nie testowalem bo kod jest mocno testowy i musze go jakos doprowadzic do stanu uzywalnosci :)

Zobaczymy co z tego wyjdzie jak doda sie jeszcze filtr adaptacyjny itd. Ale chyba nie jest tak zle jak na kod pisany "na kolanie" tak aby tylko cos przetestowac, wiec chyba warto posiedziec dalej nad implementacja modemu w software :)




« Ostatnia zmiana: Styczeń 06, 2013, 13:54:08 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #25 dnia: Styczeń 08, 2013, 23:16:16 LOC »

Hm... Czyli jak rozumiem filtr zwraca mi na wyjściu zero albo jeden, lub inne wartości dyskretne pozwalajace rozróznić tony MARK/SPACE? Przepraszam, że zadaję tak podstawowe pytanie ale to tylko z chęci dokładnego poznania tematu. Zastanawiam się też nad metodą rozróżniania końcu i początku następujących po sobie bitów. Przeglądnąłem już źródła multimona ale zapewne za mało wiem i potrafię aby jednoznacznie odpowiedzieć sobie na to pytanie... Zacytowana przez Ciebie funkcja wykonuje się co każdą próbkę, czyli 9600bps co daje 8 zwróconych wartości (8x return) na jeden bit. Ma to na celu zapewnienie poprawnego określania częstotliwości (twierdzenie kotielnikowa), czyli tak na pierwszy rzut oka dopiero 8 jest poprawna? Bo tablice w pdfowym kodzie są statyczne i pamiętają wartości z poprzednich wywołań...
« Ostatnia zmiana: Styczeń 08, 2013, 23:28:32 LOC wysłana przez SP8EBC »
Zapisane
Mateusz == 43-300 Bielsko Biała

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #26 dnia: Styczeń 09, 2013, 09:17:24 LOC »

Czy też powinienem to zrobić tak jak robi Tomek UOB czyli funkcję filtru wywoływać co N próbek, w tym przypadku 8 i nie przejmować się w ogóle synchronizachą?
« Ostatnia zmiana: Styczeń 09, 2013, 09:20:13 LOC wysłana przez SP8EBC »
Zapisane
Mateusz == 43-300 Bielsko Biała

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #27 dnia: Styczeń 09, 2013, 09:57:53 LOC »

Generalnie wszystko jest w tym niemieckim PDF-e (np. Bittaktregeneration)...

Ale co by nie tworzyc zamieszania to wklejam fragment kodu z BeRTOS-a (plik afsk.c fragment funkcji void afsk_adc_isr) - w nim bardzo ladnie widac co i jak:




/* If there is an edge, adjust phase sampling */
if (EDGE_FOUND(af->sampled_bits))
{
if (af->curr_phase < PHASE_THRES)
af->curr_phase += PHASE_INC;
else
af->curr_phase -= PHASE_INC;
}
af->curr_phase += PHASE_BIT;

/* sample the bit */
if (af->curr_phase >= PHASE_MAX)
{
af->curr_phase %= PHASE_MAX;

/* Shift 1 position in the shift register of the found bits */
af->found_bits <<= 1;

/*
* Determine bit value by reading the last 3 sampled bits.
* If the number of ones is two or greater, the bit value is a 1,
* otherwise is a 0.
* This algorithm presumes that there are 8 samples per bit.
*/
STATIC_ASSERT(SAMPLEPERBIT == 8);
uint8_t bits = af->sampled_bits & 0x07;
if (bits == 0x07 // 111, 3 bits set to 1
|| bits == 0x06 // 110, 2 bits
|| bits == 0x05 // 101, 2 bits
|| bits == 0x03 // 011, 2 bits
)
af->found_bits |= 1;

/*
* NRZI coding: if 2 consecutive bits have the same value
* a 1 is received, otherwise it's a 0.
*/
if (!hdlc_parse(&af->hdlc, !EDGE_FOUND(af->found_bits), &af->rx_fifo))
af->status |= AFSK_RXFIFO_OVERRUN;
}


na poczatku tej funkcji sa wspominane filtry IIR...

a jak dodasz do tego co wkleilem cos takiego:


af->sampled_bits <<= 1;
af->sampled_bits |= afsk_demod(curr_sample) > 0;


afsk_demod - to kod ktory wkleilem w czesniejszym poscie...

no i calosc tworzy gotowy dekoder... pozostaje ci zerknac jeszcze na funkcje hdlc_parse i wszystko bedzie jasne.

Sama funkcje afsk_adc_isr odpalasz jak mowilem z czestotliwoscia 9600Hz (przesylajac do niej aktualnie odebrana probke z ADC).

Jeszcze co do literatury to ten sposob co w niemieckim PDF-e opiany tez jest w "Digital Communications - John Proakis" - konkretnie w dziale "Optimum Receivers for the Additive White Gaussian Noise Channel" - nazywa sie to "Correlation Demodulator". W 4 edycji rozdzial 5-1-1

« Ostatnia zmiana: Styczeń 09, 2013, 10:13:50 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023

SP8EBC

  • *
  • Offline Offline
  • Wiadomości: 266
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #28 dnia: Styczeń 09, 2013, 11:12:13 LOC »

Chyba już zaczynam rozumieć, przynajmniej tak mi się wydaje :). Wywołanie Funkcji z filtrem wrzucam na sam początek do obsługi przerwania ADC czyli ona wykonuje się 9600x, potem w tej samej funkcji obsługi znajduje się fragment z detekcją zmian wartości czyli to:
00271     if (EDGE_FOUND(af->sampled_bits))
00272     {
00273         if (af->curr_phase < PHASE_THRES)
00274             af->curr_phase += PHASE_INC;
00275         else
00276             af->curr_phase -= PHASE_INC;
00077     }
00278     af->curr_phase += PHASE_BIT;
00281     if (af->curr_phase >= PHASE_MAX)
00282     {
(...)
co służy do synchronzacji z prędkością przesyłania danych (1200bps), następnie daję funkcję która odkodowuje mi NRZI a na koniec przekazuję dane do obsługi HDLC (schodź w BeRTOS widzę że dekodowanie NRZI i obsługa HDLC jest razem)... Niemiecki PDF jest bardzo przydatny ale translatory generują kompletnie bezsensowne tłumaczenia, a sam kompletnie nie znam tego języka, w zasadzie muszę się tam domyślać co autor miał na myśli



A tak BTW dla wszystkich, to thttp://dev.bertos.org/doxygen/afsk_8c_source.html
Zapisane
Mateusz == 43-300 Bielsko Biała

SP6VGX

  • *
  • Offline Offline
  • Wiadomości: 160
Odp: Projektowanie własnego trackera APRS czyli znęcam się nad Baycomem
« Odpowiedź #29 dnia: Styczeń 09, 2013, 11:26:50 LOC »

No dokladnie...

Ja jeszcze mam oversampling jak wspominalem z tym ze probkuje co 38400Hz... z tym co by nie meczyc CPU przerwaniem co 38400Hz mam to rozwiazane tak:

1. Timer co 38400Hz wyzwala mi ADC...
3. DMA transportuje z ADC do 4 bajtowego bufora w pamieci
4. Przerwanie z DMA jest generowane po zapelnieniu bufora (odebrane 4 probki) czyli co 9600Hz
5. W przerwaniu generowanym przez DMA robiona jest decymacja i dalej przesylana probka do procedury dekodujacej j/w

w sumie tak to na chwile obecna mam rozwiazane. Powinno byc tez pomocne dla innych chcacych dekodowac sobie na ARM-e APRS :)

Na razie podlaczylem sobie w firmie plytke pod przenoske i czekam az cos sie pojawi :) ale cos cisza w Warszawie na APRS :) Ale moze uda sie zrobic jaki test jak to sprawdza sie przy podpieciu do radia...

Natomiast co do tego PDF-a to tez tak na czuja wszystko bo fakt google translator sobie nie radzi (a przynajmniej ja wiele nie zrozumialem z takiego tlumaczenia), zreszta kolega z firmy ktory dobrze zna niemiecki tez nie za wiele pomogl bo kilku technicznych slow nie znal :)


« Ostatnia zmiana: Styczeń 09, 2013, 11:41:56 LOC wysłana przez SP6VGX »
Zapisane
Tomek SP6VGX
QTH: Warszawa, LOKATOR: KO02NG
QRG: SR5WA (439.350)
D-STAR: SR5WW B (438.500) - REF032
DMR-ID: 2600023
Strony: 1 [2] 3 4 ... 6