Witam,
Znajdziecie tu program na ATMEGA8 (docelowo też na... TINY13?!), który jest przeróbką oryginału z niemieckiej strony http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega robionego na podstawie noty AVR223. Jego twórca najwyraźniej jest krótkofalowcem i oryginał ma służyć m.in. do filtrowania sygnału SSTV.
No ale nie samą SSTV człowiek żyje, ja od dłuższego czasu szukałem czegoś do dodania realizmu gierkom strzelanym w necie. Mój pierwowzór wykonany na wzmacniaczach operacyjnych (FGP 4. rzędu 600Hz + FDP 2. rzędu 6kHz) często wywołuje pozytywne zainteresowanie na tzw. respie. Chciałem jednak spróbować zrobić to na procku, zarówno dla sprawdzenia czy to prawda że AVR 8bit da radę pociągnąć filtrowanie audio w czasie rzeczywistym (nie licząc wielu projektów analizatorów widma m.cz.), jak i w nadziei że uda się uzyskać większą elastyczność i... gorszą jakość audio:). Ideał - głos po przetworzeniu brzmi jak z krótkofalówki na amerykańskich filmach;). No ale do tego jeszcze daleko. Tymczasem zamieszczam pierwszą działającą wersję, jest to nadal ów filtr SSTV, ale jakiś efekt już jest. Źródło programu przerobiłem tak, żeby bez problemu kompilowało go AVRStudio. Nie usuwałem oryginalnych linii, a jedynie remowałem/poprawiałem co było trzeba, więc każdy może zobaczyć różnice. Każdy może eksperymentować z częstotliwością kwarcu (lub generatora wewn.) czy częstotliwością taktowania ADC i natychmiast słyszeć różnicę. Jako że u mnie obrabiany jest sygnał mikrofonowy, został on wzmocniony ok 11x i podany przez kondensator na AIN0 (oczywiście można przełączyć wedle uznania modyfikując ADMUX - ale np. AIN4 i AIN5 mają większe zakłócenia). Wejście przetwornika wstępnie polaryzuję połową Aref - u mnie wewnętrzne źródło 2,56V (oryginał używa Avcc). Odpowiedni dzielnik dla Vcc 5V to np. 68k górny i 22k dolny rezystor (wiem, zaraz ktoś zacznie że w sumie powinno być <10kiloomów, a jest ok. 17k - ale do tego jest jeszcze wyjście przedwzmacniacza no i można dać 1 - 10nF do masy. No i łapie wszystkie śmieci z zasilania). Na wyjściu OC1B dałem "FDP" 4k7 + 22nF, resztę załatwiają filtry karty muzycznej. OC1A odłączyłem (w oryginale niby było podłączone, ale... nic na nie nie trafiało - w założeniu miał chyba tam iść sygnał prosto z ADC?). Co ciekawe, obecność OC1A chyba można wykorzystać do zrobienia mostkowego wyjścia na słuchawki, wystarczy odwrócić fazę PWM A bitami COM1A1:COM1A0 (11) i ładować OCR1AL tą samą wartością co OCR1BL - ale należy zabezpieczyć oba wyjścia szeregowymi rezystorami po minimum 100 omów i połączyć obie słuchawki szeregowo (czyli Ro minimum 250 - 260 omów). Dodałem też SLEEP (w oryginale brak), poprawia się trochę sygnał/szum. Niestety tylko w trybie IDLE, tryb ADC NOISE REDUCTION powoduje wzbudzanie się filtrów (wyłączałem free run etc., na razie bez efektu). Pomysłów jest więcej, m.in dodanie generatora szumu pseudolosowego (tło a'la radio), przełączanie efektów (w ATMEGA8 trochę się ich zmieści), dodanie kolejnych ogniw filtrujących, zrobienie wersji na ATTINY13 (wygląda na to, że jeden efekt (trzy filtry 2. rzędu) spokojnie się mieści i sprzętowo też ogarnia - to dopiero wygar! Taki maluch!), no ale najważniejsze to rozgryzienie współczynników filtrów aby zacząć eksperymenty z własnymi. FilterFree jest potencjalnym kandydatem, ale jego obliczenia trzeba jeszcze przerobić. Obecnie w procu siedzą trzy moduły filtrów 2. rzędu, z których wyraźnie dwa są FDP, a jeden FGP. Pierwszym krokiem powinna być zmiana na jeden FDP i dwa FGP, a potem dobranie reszty parametrów. Zachęcam do eksperymentów i ewentualnego dzielenia się uzyskanymi efektami, podając współczynniki, nastawy ADC i f zegara. Wspólnie może uda się znaleźć ciekawe rozwiązania do wykorzystania w necie. Załączam pliki asm i hex (zmienione rozszerzenia), fusy poniżej, zegar 11,0592MHz - będzie chodzić i z mniejszymi, i z większymi. Z prymitywnym filtrem DP 1. rzędu na wejściu aliasing dla mowy praktycznie nie występuje, dla innych sygnałów być może trzeba dać coś więcej.
Pisane na szybko, więc w razie czego dajcie znać jeżeli coś zakręciłem - "sie poprawi". Komentarze w kodzie źródłowym powinny też nieco wyjaśnić. Wszystkie ewentualne pytania zadawajcie na forum, żeby każdy mógł skorzystać. Na PW nie odpowiadam.
Fusebity:

Znajdziecie tu program na ATMEGA8 (docelowo też na... TINY13?!), który jest przeróbką oryginału z niemieckiej strony http://www.mikrocontroller.net/articles/Digitalfilter_mit_ATmega robionego na podstawie noty AVR223. Jego twórca najwyraźniej jest krótkofalowcem i oryginał ma służyć m.in. do filtrowania sygnału SSTV.
No ale nie samą SSTV człowiek żyje, ja od dłuższego czasu szukałem czegoś do dodania realizmu gierkom strzelanym w necie. Mój pierwowzór wykonany na wzmacniaczach operacyjnych (FGP 4. rzędu 600Hz + FDP 2. rzędu 6kHz) często wywołuje pozytywne zainteresowanie na tzw. respie. Chciałem jednak spróbować zrobić to na procku, zarówno dla sprawdzenia czy to prawda że AVR 8bit da radę pociągnąć filtrowanie audio w czasie rzeczywistym (nie licząc wielu projektów analizatorów widma m.cz.), jak i w nadziei że uda się uzyskać większą elastyczność i... gorszą jakość audio:). Ideał - głos po przetworzeniu brzmi jak z krótkofalówki na amerykańskich filmach;). No ale do tego jeszcze daleko. Tymczasem zamieszczam pierwszą działającą wersję, jest to nadal ów filtr SSTV, ale jakiś efekt już jest. Źródło programu przerobiłem tak, żeby bez problemu kompilowało go AVRStudio. Nie usuwałem oryginalnych linii, a jedynie remowałem/poprawiałem co było trzeba, więc każdy może zobaczyć różnice. Każdy może eksperymentować z częstotliwością kwarcu (lub generatora wewn.) czy częstotliwością taktowania ADC i natychmiast słyszeć różnicę. Jako że u mnie obrabiany jest sygnał mikrofonowy, został on wzmocniony ok 11x i podany przez kondensator na AIN0 (oczywiście można przełączyć wedle uznania modyfikując ADMUX - ale np. AIN4 i AIN5 mają większe zakłócenia). Wejście przetwornika wstępnie polaryzuję połową Aref - u mnie wewnętrzne źródło 2,56V (oryginał używa Avcc). Odpowiedni dzielnik dla Vcc 5V to np. 68k górny i 22k dolny rezystor (wiem, zaraz ktoś zacznie że w sumie powinno być <10kiloomów, a jest ok. 17k - ale do tego jest jeszcze wyjście przedwzmacniacza no i można dać 1 - 10nF do masy. No i łapie wszystkie śmieci z zasilania). Na wyjściu OC1B dałem "FDP" 4k7 + 22nF, resztę załatwiają filtry karty muzycznej. OC1A odłączyłem (w oryginale niby było podłączone, ale... nic na nie nie trafiało - w założeniu miał chyba tam iść sygnał prosto z ADC?). Co ciekawe, obecność OC1A chyba można wykorzystać do zrobienia mostkowego wyjścia na słuchawki, wystarczy odwrócić fazę PWM A bitami COM1A1:COM1A0 (11) i ładować OCR1AL tą samą wartością co OCR1BL - ale należy zabezpieczyć oba wyjścia szeregowymi rezystorami po minimum 100 omów i połączyć obie słuchawki szeregowo (czyli Ro minimum 250 - 260 omów). Dodałem też SLEEP (w oryginale brak), poprawia się trochę sygnał/szum. Niestety tylko w trybie IDLE, tryb ADC NOISE REDUCTION powoduje wzbudzanie się filtrów (wyłączałem free run etc., na razie bez efektu). Pomysłów jest więcej, m.in dodanie generatora szumu pseudolosowego (tło a'la radio), przełączanie efektów (w ATMEGA8 trochę się ich zmieści), dodanie kolejnych ogniw filtrujących, zrobienie wersji na ATTINY13 (wygląda na to, że jeden efekt (trzy filtry 2. rzędu) spokojnie się mieści i sprzętowo też ogarnia - to dopiero wygar! Taki maluch!), no ale najważniejsze to rozgryzienie współczynników filtrów aby zacząć eksperymenty z własnymi. FilterFree jest potencjalnym kandydatem, ale jego obliczenia trzeba jeszcze przerobić. Obecnie w procu siedzą trzy moduły filtrów 2. rzędu, z których wyraźnie dwa są FDP, a jeden FGP. Pierwszym krokiem powinna być zmiana na jeden FDP i dwa FGP, a potem dobranie reszty parametrów. Zachęcam do eksperymentów i ewentualnego dzielenia się uzyskanymi efektami, podając współczynniki, nastawy ADC i f zegara. Wspólnie może uda się znaleźć ciekawe rozwiązania do wykorzystania w necie. Załączam pliki asm i hex (zmienione rozszerzenia), fusy poniżej, zegar 11,0592MHz - będzie chodzić i z mniejszymi, i z większymi. Z prymitywnym filtrem DP 1. rzędu na wejściu aliasing dla mowy praktycznie nie występuje, dla innych sygnałów być może trzeba dać coś więcej.
Pisane na szybko, więc w razie czego dajcie znać jeżeli coś zakręciłem - "sie poprawi". Komentarze w kodzie źródłowym powinny też nieco wyjaśnić. Wszystkie ewentualne pytania zadawajcie na forum, żeby każdy mógł skorzystać. Na PW nie odpowiadam.
Fusebity:

Cool? Ranking DIY