Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

kolejny "analizator widma"

candle 22 Lip 2008 00:32 5349 13

  • witam
    jako ze ostatnio sie tego namnożyło, pragnę podzielić się i swoją wariacją na ten temat
    dzieło zostało napisane jako wprawka (dodam, że pierwsza w ogóle) do assemblera na procesory avr i przygotowanie sie do poważniejszego projektu
    nie jest to prawdziwy analizator widma - nie znajdziecie tam żadnego fft, ale dość ciekawie wygląda i sprzętowo jest bardzo minimalistyczny
    składa się jedynie z procesora (pod port pb0-4 podłączony jest lcd 2x16, sterowanie na pd7 i pd6), oraz źródła dźwięku odsprzężonego przez kondensator 2u2f podłączonego do adc5 (pulldown 220k do masy)
    atmega8 jest tatkowana 1mhz oscylatorem wewnętrznym - tak jak dala fabryka
    program wyświetla dane szybciej niż lcd jest w stanie je sensownie wyświetlić, przez co wizualnie prezentuje się to bardzo dobrze - niestety nie na filmie...

    dla ciekawych plik źródłowy w assemblerze do skompilowania pod avr studio 4 oraz hex dla leniwych...

    projekt powstaje jako coś zupełnie innego (generator video) stąd i inna nazwa plików w archiwum

    Kolego, przeczytaj proszę swoją wypowiedź, a następnie popraw ją w taki sposób żeby:
    - nie było już więcej raportów
    - przeciętny polak był w stanie to rozszyfrować.
    [CMS]


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #2 22 Lip 2008 00:55
    Balu
    Poziom 38  

    Fajnie...:> Przejrzałem źródła FFT to nie jest... na 16 filtrów cyfrowych też nie wygląda...:)
    A komentarze... ubogie;)

    Może jakieś krótkie wyjaśnienie?

    IMHO mrygacz słupkami, albo jesteś cudotwórcą... 1MIPS na takie coś w/g mnie nierealne.

    Dodano po 14 [sekundy]:

    Skreślam W/g mnie. NIEREALNE:)

  • #3 22 Lip 2008 01:05
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #4 22 Lip 2008 09:22
    candle
    Spec od monitorów

    mrygacz :]
    po uruchomieniu adc procedura przerwania końca przetwarzania adc czeka na sampla o wartości 0, od tego sampla zaczyna sczytywać kolejne 16 wartości, po zapełnieniu bufora przechodzi znów w tryb czekania na 0, wiec całość wygląda w miarę statycznie
    bardziej jest to "oscyloskop" z wyzwalaniem w zerze niż "analizator", ale wizualnie wygląda ciekawie
    następnym razem będzie pełne fft na wyświetlaczu 240x64, no ale to już nie na 1mhz oscylatorku :]

    pozdrawiam

    ps. tak jak pisałem na wstępie - to tylko wprawka w assemblerze w celu poznania przeciwnika, a że wyszło "fajnie" to postanowiłem się tym podzielić

  • #5 22 Lip 2008 14:53
    rmajda
    Poziom 20  

    candle: Co robisz z tymi 16 probkami, po prostu pakujesz ich wartość na LCD, odpowiednio skalując do wysokości słupka. Czy może coś bardziej zaawansowanego :-)

  • #6 22 Lip 2008 15:53
    candle
    Spec od monitorów

    skaluje.. :]
    a tak na poważnie proponuję czytać źródła

  • #7 22 Lip 2008 18:06
    pued
    Poziom 10  

    Hello.
    I want diy analyzer.I want schematic.you help
    thank you.

  • #8 22 Lip 2008 18:17
    Balu
    Poziom 38  

    It's not an analyzer. It only imitates it.
    If u want an analyzer U should look into ElektronikaPraktyczna (or ElektronikaDlaWszystkich - don't remember) magazine...
    BR Łukasz.

  • #9 22 Lip 2008 19:41
    MaThiR
    Poziom 16  

    Elektronika dla wszystkich nr.5/2008 - projekt okładkowy "Analogowo cyfrowy analizator widma". Tam układ realizował cyfrową obróbkę sygnału DSP. Też był zrobiony na podstawie ATMEGA8 tyle że taktowany 18MHz, do tego miał zabezpieczenie wejścia przetwornika ADC. Natomiast jako wyświetlacz zostały użyte diody LED (100 szt.).

  • #10 22 Lip 2008 19:55
    Balu
    Poziom 38  

    O to mi właśnie chodziło:)
    @pued u Should look into ElektronikaDlaWszystkich no 5/2008 :)

  • #11 23 Lip 2008 01:08
    szeryf.rm
    Poziom 22  

    Oczywiście że z zegarkiem 1MHz nie byłoby szans na analizę. Wystarczy podzielić. Gdybyśmy założyli, że ADC miałby 20kHz próbkowania, to przy 1MHz kod musiałby obrobić w czasie rzeczywistym każdą próbkę w nierealnych 50 cyklach. A w czasie nierzeczywistym musiałoby to być FFT (choć efekt raczej nie byłby ciekawy).

    Czyli jak to już zostało wyjaśnione to tylko imitacja :).

    A tak poza tym ostatnio planowałem zrobić filtry na atmega8 z zegarem 14-16MHz analizujące sygnał audio w czasie rzeczywistym z próbkowaniem ~50kHz. Według wszystkich przeliczeń jakie dokonałem wyszło, że przy 10 bitowym przetworniku dałbym radę wycisnąć 4 dowolne (górno- lub dolnoprzepustowy) filtry I rzędu. W zasadzie to dałbym radę wycisnąć 5 filtrów, ale jeszcze miałbyć program główny :)... Na tym zakończę, ponieważ w najbliższym czasie może zaprezentuję coś i tam o tym wspomnę.

  • #12 23 Lip 2008 01:10
    Balu
    Poziom 38  

    Było coś takiego niedawno w EdW. I tam się autor w asmie namęczył nad sztuczkami żeby 4 kanały wyciśnać, z tego co pamiętam.

  • #13 23 Lip 2008 01:17
    szeryf.rm
    Poziom 22  

    Chętnie bym zobaczył co koleś z EdW wymyślił :). Ja tam się przyznam, że specjalnie się nie wysiliłem, żeby w asm napisać jeden działający filtr. Wg. moich przeliczeń przy 16MHz miałbym 5 (6 jeśli wywalić kod główny) filtrów. Zakładając że miałbym ich 5 to wyszłoby 6 pasm :). A gdyby jeszcze zjechać z próbkowaniem to jeszcze dałoby się coś wycisnąć :). Ale dość chwalenia... to nie mój temat. Mój będzie niedługo.

  • #14 23 Lip 2008 18:07
    szeryf.rm
    Poziom 22  

    Przy pierwszej próbie i wstępnych testach mojej pierwszej wersji projektu, który już niebawem przedstawie, zamierzałem opublikować cały kod, bo przecież nikt by mi nie uwierzył :P. Niestety w praktyce zarzuciłem plan, ze względu na to, że potrzebowałem filtry IV rzędu a taki to 1 (górno- lub dolno- a ja w dodatku chciałem pasmowoprzepustowy) wyszedłby na atmedze8 przy zegarze 16MHz. Dlatego pomysł zarzuciłem. Nie chciałem robić FFT, bo to w moim przypadku nie miałbyć analizator widma a dynamika była w cenie.
    Mój kod w asm opierał się na arytmetyce stałoprzecinkowej z 16 bitami części całkowitej (dokładnie 10 bitów przetwornika, ale to w praktyce nic nie zmienia czy 10 czy 16, liczenie takie samo) oraz 16 bitami części ułamkowej. Całość opierała się na złożoności kodu O(1), bez żadnych pętli, więc przeliczenie cykli to pikuś, bo zawsze tyle samo. W praktyce gdyby spełnić następujące warunki:
    1. Cały kod ASM, z dopasowanym kodem głównym do analizy (np. żeby korzystać w kodzie głównym tylko z wybranych rejestrów) -> Mój kod był w C i ASM, a prog. głowny miał być w C, więc ten punkt odpada w takiej perspektywie i był dodatkowy kłopot
    2. W części rejestrów przechowywane są dane związane ze stanem wyjścia filtru i ze stałą potrzebną do liczenia, zamiast przechowywania wszystkich danych w pamięci -> Mój kod zakładał że wszystko będzie przechowywane zawsze w pamięci i tylko tymczasowo wczytywane do rejestru, a to dodatkowe obciążenie (wczytanie i zapisanie 6 bajtów do SRAM to 24 cykle + ustawienie adresu 2 cykle).
    3. Próbkowanie 44000 kHz lub mniejsze -> moje założenie znów był na przekór rozsądkowi, bo chciałem min. 50kHz
    4. Zegar 16MHz -> i nawet tutaj chciałem przesadzić, bo na upartego walczyłem, żeby wepchnąć tam 14.3MHz i wszystko liczyłem dokładnie dla 14.3MHz a to sporo :).

    Gdyby spełnić te 4 warunki, to jest spore pole do popisu i bez kłopotu dałoby się zrobić 4 filtry (dolno-, górnoprzepustowe I rzędu). Przy 16MHz i 40kHz próbkowania mamy 400 cykli. Przy 16 bitach całkowitych i 16 ułamkowych oraz przechowywaniu części w rejestrach to można się bawić. Mi w moich wyliczeniach przy odczycie i zapisie wszystkiego do pamięci wychodziło ok 70-80 cykli razem ze wszystkim (obliczenia i odczyt to około 55) na każdy filtr I rzędu.

    Tak wygląda teoria i moja praktyka. Sorki za ten wykład nie potwierdzony przykładem, ale mój kod który miałem był jedynie wersją całkowicie testową, bez komentarzy i obecnie nie przebywa już na dysku ze względu na jego małe znaczenie (łatwo przyszło, łatwo poszło :P).

    Proponuje popróbować. Arytmetyka stałoprzecinkowa z optymalizacją to kod pisany dosłownie na chłopski rozum. A w dodatku atmega8 ma już w asm instrukcję MUL więc to sporo ułatwia.

    pozdr.