logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak napisać analizator widma akustycznego w Bascom dla LCD i Atmela?

bartods 05 Mar 2006 21:48 26173 86
Najlepsze odpowiedzi

Jak zrealizować analizator widma akustycznego na AVR w Bascomie z wyświetlaniem na LCD?

Zrób to przez próbkowanie sygnału audio, zebranie np. 128 próbek i policzenie DFT/FFT, a jeśli chcesz wykrywać tylko konkretne składowe, rozważ algorytm Goertzela; częstotliwość próbkowania musi być co najmniej dwukrotnie większa od szerokości pasma sygnału [#2380245] BASCOM jest do takiego zadania zwykle zbyt wolny, więc najlepiej pisać całość w ASM albo C [#2380245] Da się jednak zrobić DFT w Bascomie z wstawkami ASM — w wątku pokazano działający projekt z odświeżaniem około 25 Hz [#2381173] Wyniki widma możesz potem wyświetlać na LCD, ale trzeba liczyć się z ograniczeniami wydajności mikrokontrolera [#2380245][#2381173]
Wygenerowane przez model językowy.
REKLAMA
  • #1 2379457
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    Mam pytanie odnośnie Bascoma.
    Mógł by mnie ktoś naprowadzić jak napisać w Bascomie analizator widma akustycznego dla LCD podłączonego do Atmela.
    Narazie nie mam na czym się oprzeć.
    Domyślam się jednak że potrzeba by było rozdzielić częstotliwości i z osobna analizować programowo każdą z nich ale jak?
    Jeśli się mylę i jest jakiś inny sposób to czy mógł by mi ktoś pomóc.
  • REKLAMA
  • #2 2380245
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Właśnie zabieram się za taki projekt, ale o BASCOMie zapomnij. Jest za wolny i za mało efektywny. Najlepiej napisać wszystko w asm, ew. C. OK, nie wiem ile wiesz na temat cyfrowego przetwarzania sygnałów, ale z grubsza rzecz biorąc robisz tak:
    1. Próbkujesz sygnał akustyczny z wybraną częstotliwością, lecz musi być ona dwukrotnie większa niż szerokość pasma tego sygnału.
    2. Zbierasz sobie niejako powiedzmy 128 próbek i dokonujesz transformaty DFT (tutaj lepiej FFT, bo szybsza) można jeszcze zastanowić się nad użyciem algorytmu Goertzela (zwłaszcza, jeśli mamy wykrywać konkretne harmoniczne). Algorytm ten jest stosowany w cyfrowych centralach telefonicznych do detekcji przy wybieraniu tonowym (DTMF).
    3. Policzone próbki widma sygnału wyświetlasz na przykład na graficznym LCD.

    Podstawowym problemem jest tu moc obliczeniowa procesora. Jednak liczenie widma do zadań łatwych nie należy.
    Pozdrawiam.
  • REKLAMA
  • #5 2381982
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    Bardzo bym prosił o źródło jeśli można.
    Czytałem troszkę jak męczyłeś się nad tym projektem, a innymi słowy czy uzyskałeś jakieś konkretne rezultaty?
    I czy da radę napisać całość w Bascomie bo z asemblera i C++ jestem nie kumaty.
    W razie jakich kolwiek problemów pomógł byś?
    Chciałem zrobić sobie przedwzmaka z LCD wyświetlającym analizator widma.
    :D
  • Pomocny post
    #6 2382082
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    układzik ten skonczył jako praca dyplomowa w technikóm tak że moge też to wrzucić. jest tak troche komętaży do programu i schemat.
    w razie czego pytaj. dodam że widziałem gdzieś w sieci takie samo użądzonko tylko napisane w asm, i tam była wykożystane fft zamiast dft.
    miało ono chba więcej widm i działało szybciej.

    moje wypociny zamieszcze tu:
    Załączniki:
    • Praca_v1.2.rar (161.15 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • dft_8535.rar (27.63 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 2383262
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    przestudiowałem po krótce twoją pracę i mam pytanie czy nie prościej było ci zrobić takie użądzonko na LCD na sterowniku HD...?
    A jak by dało radę zmienić twój program aby to było wyświetlane na LCD.
  • REKLAMA
  • #8 2383458
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    no teoretycznie dało by się ale ja chciałem to zrobić na diodach.
    jesli chciał być to przerobić na lcd to musiał być zablokować przerwanie odświeżajace diody czyli usunąc linijkę
    Enable Timer0
    w pliku config.bas
    oraz dodać wyświatlanie czyli zmienić procedure save w pliku led.bas

    w sumie to część kodu nie będzie wtedy używana ale ale nie spowoduje to zadnych negatywnych skutków a z tego co pamiętam to zostało tam jeszcze troche dodatkowego flasha.

    mozesz wtedy zmienić procesor na ATmega8 bo jest tańszy.

    mogą sie pojawić tylko porblemy z wydajnością bo wyświetlacz lcd jest bardzo wolny ale chyba da rade.
  • #9 2383474
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A może na graficznym by było lepiej :?:
    Z resztą to był by taki niby efekt bluru :)

    Wiesz co przeglądając twój program doszedłem do wniosku że mało jeszcze wiem i że zrobienie tego zajmie mi duuuuuuuużo czasu :cry: .

    A swoją drogą jak jak wsadziłeś to wszystko w jeden mikrokontroler :?:

    Niestety moja przygoda z Atmelkami dopiero się zaczyna a zabawa z zapalaniem i gaszeniem diody na atmelku już mnie nudzi i postanowiłem zrobić coś poważniejszego.

    Wiesz może czy Atmelik poradzi sobie z graficznym LCD 128x48 i czy da się użyć twój programik do obsługi tego :?:
  • #10 2383744
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    no to zależy do lcd, a konkretnie od przesyłu ale coś mi się zdaję ze na 1 uP może nie pociągnąc z graficznym lcd.
    zawsze mozna dać 2 jeden będzie robił filtracje a drugi wyświetlał na lcd.

    co do tego programu to od pomysłu do zakończenia mineło pół roku takze mi też to troche zajeło.

    pozdrawiam
  • #11 2385893
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A maxymalnie jaki graficzny chodzi mi o pixele mógł by pociągnąć taki układ dwóch atmeli :?:
    Może da się skorzystać z LCD bez kontrolera np. od laptopa 640x480 mono :?:
  • #12 2386203
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    kiedyś podłaczyłem lcd bez sterownika do AVR ale to był 320x240 (czarnobiały) i sądze że nic wiecej sie nie da. soft był pisany w 60% w asm (cała obsługa odświeżania).
    także 640x240 w kolorze bez sterownika to niema szans.
    kiedyś ktoś sterowałtaką matryca za pomocą karty graficznej na pci ale to juz całkiem inna historia.

    PS. wydaje mi się że na diodach to i tak najlepiej wyjdze.
  • #13 2386753
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A masz może jakieś schemaciki lub kod od tego LCD 320x240 :?:
    O i mam pytanie czy nie da się podzielić takiej matrycy aby np sterować z każdego atmela każdą częścią osobno :?:
  • #14 2387164
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    niewiem czy ci się cos z tego przyda ale moge zamieścić.
    w sumie to niedokonczony projekt i wyświetlacz niebył do niczego użyty i program też nie jest super dopracowany. ale działa.
    Grafic_card_1.2.bas to najnowszy plik.
    Załączniki:
    • LCD_320x240.rar (78.32 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #15 2387276
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam.
    Ciekawy jest ten Twoj projekcik analizatora widma pod Bascomem.
    Zdziwilo mnie ze bascomsobie z tym poradzil i wyciaga do 20 wyswietlen na sekunde.
    Mysle nad podobnym ukladem, ale program chcialem napisac w C.
    Mam pytanie co do samego DFT, jest u Ciebie w kodzie zaraz na poczatku fragment ,gdzie zapisujesz do RAMu wartosci sinusow kątów i okna .
    Jak powinny wygladac te tabice, tzn jakie maja wartosci (Sinus(k + 1) , Lookup(k , Okno_blackman) itp ) ?
  • #16 2387345
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    wszystkie stałe są w pliku data.bas
    sinus to poprostu funkcja sinus pomnożona przez 256 aby uzyskać przyzwoitą liczbę i nietrzeba było się zajmować zmiennym przecinkiem.

    Okno_blackman to zbiór stałych które przydają sie w procesie okienkowania danych wejsciowych. robi sie to po to aby łagodnie wyciszyć sygnał na poczatku i na końcu zbioru prubek.
  • #17 2389449
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Brakuje tam funkcji mull_add . Pisales ja osobno w assemblerze?
  • REKLAMA
  • #18 2389511
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    co do tego mull_add to dobrze nie pamietam ale nie moge tego teraz znalęść. gdzie jest odwolanie do tej procedury ???

    bo pamietam że pisałem coś takiego ale ostatecznie chyba nie nie wykożystywałem tego.
  • #19 2389722
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Odwolanie do tej procedury wystepuje w prau miejscach i wydaje mi sie ze jest niezbedne. Dokladnie sa tam dwie takie funkcje , jedna wlasnie mull_add ,a druga do dzielenia pzrez 256. Chociaz moze masz racje , bo znalazlem inna wersje Twojego programu gdzie tych funkcji nie ma.

    Czy przetworniki AD odczytuja napiecie ze znakiem czy tylko dodatnie wartosci?

    Jeszcze jedno :
    beta = Pina And &B11000000
    For K = 0 To 31
    Sinus(k + 1) = Lookup(k , Tab_sin)

    Select Case beta
    Case 0
    Okno(k + 1) = 255
    Case 64
    Okno(k + 1) = Lookup(k , Okno_blackman)
    Case 128
    Okno(k + 1) = Lookup(k , Okno_hamming)
    Case 192
    Okno(k + 1) = Lookup(k , Okno_hanning)
    End Select
    Next K

    po co sprawdza sie stany pinow 6 i 7 portu A ?, skoro tam sa wejscia przetworniko ADC z ktorych odczytywane jest napiecie. Poza tym ten fragment wykonywany jest tylko raz i zapisuje tablice . Nie bardzo rozumiem tego fragmentu kodu .
  • #20 2389816
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    już tłumacze.
    porta.6 i porta.7 służyły do konfiguracji urządzenia. można było (poprzez podanie sygnałów logicznych ze zworek) wybrać różne rodzaje okna.
    jak projektowałem to znalazłem różne rodzaje okien i chciałem spróbować jak się które sprawdzają w praktyce. w sumie dużych różnic nie było.

    Można znaleźć w całym programie jeszcze kilka razy sprawdzam stany pinów , na pewno można było jeszcze włączać i wyłączać tak zwany efekt peeks

    cała ta pętla poważa się 32 razy i odczytuje wartości sinusów i właśnie okien z flasha i zapisuje je w pamięci ram. tak żeby było szybciej bo w tym projekcie czas był największym wrogiem.

    tamte procedury o których mówisz były w asm ale one chyba nie działały tak jak powinny i w końcu zrezygnowałem z ich wstawiania.
  • #21 2391129
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Aha, to juz rozumiem. Pytanie jeszcze dotyczace samych przetwornikow , mierzone sa napiecia dodatnie i nie uzywasz nigdzie wartosci ujemnych?

    Efekt Peak - najwyzej zapalone diody oapadaja powoli w dol po zaniku okreslonej czestotliowsci , tak ?
  • #22 2391187
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    efekt peaks tak najwyższa dioda opada powoli.
    szło przełaczaś że był tylko peaks, peaks + słupek i tylko słupek
    ale to tylko wyświetlanie danych.

    co do wartości ujenych to fragmęt kodu
    Poziom = 0
    
       For K = 1 To 32
          Sample(k) = Sample(k) / 2
          Poziom = Poziom + Sample(k)
       Next K
    
       Poziom = Poziom \ 32
    
       For K = 1 To 32
          Dane(k) = Sample(k) - Poziom
          Dane(k) = Dane(k) * Okno(k)
          Dane(k) = Dane(k) / 256
       Next K

    liczy srednią sygnału wejścowego (czyli defakto poziom składowej stałej) i odejmuje go od każdej probki
    potem mniży razy wartość okna (poddaje procesowi okienkowania)[/code]
  • #23 2391335
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Aha, to juz mniej wiecej wiem o co biega :)

    a np. ten fragment gdzie kopiujesz dane do ramu:

    Sinus(k + 1) = Lookup(k , Tab_sin)
    , nie mozna bezposrednio czytac danych z pamieci programu , trzeba je kopiowac do ramu ??
    Nie pamietam za bardzo polecen z BASCOMa , funkcja LookUP odczytuje po prostu dana o indeksie k z tablicy Tab_sin tak ?
  • #24 2391392
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    nigdzie nie mogę znaleźć specyfikacji tego LCD 320x240 którego użyłeś w projekcie... mam pytanie czy ten LCD ma wbudowany sterownik :?:
    a i do których nóg atmela podłączyć wejścia od LCD :?:
  • #25 2391434
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    co do lcd to był on kupiony na allegro za śmieszne pieniądze 30PLN ale niestety sterownika nie miał. atmega musi cały obraz 70x na sekunde wysłąć na lcd. to naprawde dużo i niezostaje mu dużo czasu na reszte zadań do tego potrzebuje przynajmniej 10kRamu na zapisanie obrazu.
    co do karty katalogowej to wzorowałem sie na hlm6323.
    ten wyświetlacz jest w sumie cienki i lepiej chba kupić na allegro 128*128 z właśnym sterownikiem one chba chodza po 80PLN

    teraz tak co do
    Sinus(k + 1) = Lookup(k , Tab_sin)
    masz racje że można to robić bezpośednio z pamięci ale zauważ że sinus jest wywołtwany w programie bardzo wiele razy a odczyt z flasha jest bardzo powolny, nawet jak chciał by to robić w asm, i mocno opużniał program.

    jak juz pisąłem walka z czasem była straszna na początku osiagnołem 2-3 odświeżeń na sekunde a po wszystkich ulepszeniach około 20
  • #26 2391455
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    A jak by jeden atmel był odpowiedzialny za obliczenia a drugi za wyświetlanie (tak jak już wcześniej wspominałeś) :?:
    O i czy jak bym to spioł z LCD 640x480 mono to czy by było wyświetlane na 1/4 ekranu (ten twój projekcik pod 320x240) czy na całości jeżeli by w ogóle ruszyło :?:
    A żal mi tego LCD bo leży już od dłuższego czasu u mnie pod biurkiem i zbiera się na nim kurz.
  • #27 2391958
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    najpierw znajdź dokumentacje do swojego LCD, potem spróbuj go podpiąć do AVR. (jeśli niema sterownika to najlepiej jakiś z możliwością podpięcia zewnętrznego ramu)
    potem zrób drugiego AVR na którym zrobisz dft (ATmega8 lub coś z ADC)

    spięcie tego w całość to już będzie pikuś.

    wiem jedno że będzie to dość skomplikowane i naprawdę czasochłonne zadanie ale jest to wykonalne na 2 AVR (pod warunkiem że ten twój wyświetlacz dało by się podłączyć do AVR)
  • #28 2394311
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Hunterhouse, znow pytanko do Ciebie :)

    Tym razem chodzi mi juz o sama funkcje obliczajaca DFT

    Dft:
    For K = 1 To 15
    Rex_t = 0
    Imx_t = 0

    For I = 0 To 31

    Beta = I * K
    Beta = Beta And 31 // dlaczego Beta And 31 ???

    Tmp_s = Sinus(beta + 1) * Dane(i + 1)
    Tmp_c = Sinus(beta + 9) * Dane(i + 1) // dlaczego tutaj zaczynasz tabele od (beta +9 ) ?? i co konkretnie oznacza Tmp_s i Tmp_c ??


    (Czy w bascomie And i Or to logiczne operacje na liczbach czy na bitach ? )
    'Tmp_s = Tmp_s / 256
    'Tmp_c = Tmp_c / 256


    Tmp_s = High(tmp_s)
    If Tmp_s.7 = 1 Then
    Tmp_s = Tmp_s Or &HFF00
    Incr Tmp_s
    End If

    Tmp_c = High(tmp_c)
    If Tmp_c.7 = 1 Then
    Tmp_c = Tmp_c Or &HFF00
    Incr Tmp_c
    End If


    Rex_t = Rex_t + Tmp_c
    Imx_t = Imx_t - Tmp_s

    Next I

    Rex_t = Rex_t \ 8
    Imx_t = Imx_t \ 8

    Tmp_c = Rex_t * Rex_t
    Tmp_s = Imx_t * Imx_t


    Tmp_c = Tmp_c + Tmp_s
    Rex(k + 1) = Sqr(tmp_c)
    Next K
    Return

    Porownuje ten kod z wzorem na liczenie DFT i tak nie dokonca mi to wszystko pasuje :)
  • #29 2394533
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    Beta = I * K
    Beta = Beta And 31 // dlaczego Beta And 31 ???

    - to jest obliczenie kąta (i*k)
    and 31 to zamiana na kąt z przedziału do 0 do 2pi.
    bo w moim programie są 32 prubki numerowana od 0 do 31 czyli kąt też jest od 0 do 31. 31 to poprostu kąt 360st czyli 2pi.
    AND działa na bitach czyli m tym przypadku daje nam reszte z dzielenia przez 32.
    troche to dziwnie tłumacze ale chba wiesz o co chodzi ??
    ____________________________________________
    Tmp_s = Sinus(beta + 1) * Dane(i + 1)
    Tmp_c = Sinus(beta + 9) * Dane(i + 1) // dlaczego tutaj zaczynasz tabele od (beta +9 ) ?? i co konkretnie oznacza Tmp_s i Tmp_c ??

    tmp_s i tmp_c to zmienne tymczasowe temp_sinus i temp_cosinus tylko w skrucie.
    cos(x)=sin(x+90st) a 90 stopni to w moim programie 8 ( 1/4 * 32 )
    no i +1 bo bascom dziwnie numeruje tablice (od 1)
    taka sztuczka zeby nie trzymać w pamięcie osobno tablicy sinusów i cosinusów
    ________________________________________
    'Tmp_s = Tmp_s / 256
    'Tmp_c = Tmp_c / 256
    to jest komętaż bascom tego nie kompiluje była to wczesna wersja programu
    zato to
    Tmp_s = High(tmp_s)
    If Tmp_s.7 = 1 Then
    Tmp_s = Tmp_s Or &HFF00
    Incr Tmp_s
    End If

    Tmp_c = High(tmp_c)
    If Tmp_c.7 = 1 Then
    Tmp_c = Tmp_c Or &HFF00
    Incr Tmp_c
    End If

    to jest dzielenie przez 256 tylko że zrobione w pokrętny sposub.
    obcina młodszy bajt i koryguje jeśli liczba była ujemna

    to dzielenie jest przez to że sinus był z zakresu -256 - 256 zamiast -1 - 1
    dzieki temu niemuszę liczyć na zmiennym przecinku tylko na normalnych liczbach.
    ________________________________________

    Tmp_c = Rex_t * Rex_t
    Tmp_s = Imx_t * Imx_t

    Tmp_c = Tmp_c + Tmp_s
    Rex(k + 1) = Sqr(tmp_c)

    oblicza modól liczy zespolonej bo w sumie wynikiem DFT jest moc prązka ale w postaci zespolonej.
  • #30 2394607
    bartods
    Poziom 16  
    Posty: 356
    Ocena: 258
    niestety nie mogłem znaleźć kompletnej dokumentacji mojego LCD ale znam przynajmniej oznaczenia pinów.
    "LM64P728" niewiesz czy z tego LCD można coś zrobić i czy można podpiąć do tego pamięć :?:

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji analizatora widma akustycznego w Bascomie dla mikrokontrolerów Atmel z wyświetlaczem LCD. Podstawowym problemem jest ograniczona moc obliczeniowa AVR, co utrudnia implementację szybkiej transformaty Fouriera (FFT) lub DFT w Bascomie, dlatego zalecane jest stosowanie asemblera lub C dla efektywności. Proponowane metody obejmują próbkowanie sygnału z częstotliwością co najmniej dwukrotnie większą niż pasmo sygnału, zbieranie próbek (np. 32 lub 128) i obliczanie widma za pomocą FFT lub algorytmu Goertzela. Wyniki widma można wyświetlać na graficznym LCD lub diodach LED, jednak wyświetlacze graficzne bez sterownika (np. SHARP LM64P728 640x480) wymagają bardzo dużej przepustowości i pamięci RAM, co przekracza możliwości pojedynczego AVR. Rozwiązaniem może być zastosowanie dwóch mikrokontrolerów – jeden do obliczeń, drugi do wyświetlania – jednak wymaga to zaawansowanej synchronizacji i szybkiej pamięci zewnętrznej. W Bascomie brak natywnego wsparcia dla wyświetlaczy graficznych bez sterownika, co wymusza ręczne programowanie obsługi pikseli i czcionek. Dyskutowano także o problemach z programowaniem mikrokontrolerów ATTiny2313 za pomocą prostych programatorów, gdzie istotne są poprawne połączenia, ekranowanie kabli, odpowiednie ustawienia portu LPT i stabilne zasilanie 5V. Wątki obejmowały także implementację funkcji DFT, zarządzanie tablicami sinusów i okienkowania (Blackman, Hamming, Hanning), obsługę wartości ujemnych w obliczeniach, oraz skalowanie i logarytmowanie wyników do wyświetlania na LED. Podkreślono, że Bascom jest dobrym narzędziem, jeśli zna się jego ograniczenia i potrafi optymalizować kod, ale dla bardziej zaawansowanych projektów lepszy jest C lub asembler. Wskazano na konieczność posiadania dokumentacji LCD i dobranie odpowiedniego wyświetlacza z wbudowanym sterownikiem dla łatwiejszej obsługi.
Wygenerowane przez model językowy.
REKLAMA