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.

Programowy odtwarzacz/dyktafon na STM32F407VGT6

Tytus Kosiarski 28 Paź 2014 15:49 7650 14
  • Programowy odtwarzacz/dyktafon na STM32F407VGT6
    Witam wszystkich

    Tym razem chciałbym przedstawić jeszcze programowy projekt odtwarzacza i dyktafonu zrealizowany na STM32F4Discovery. Pisząc ten program, sporo rozwiązań wykorzystałem z mojego poprzedniego projektu małego odtwarzacza MP3 na ARM-ie, ale dołożyłem też dużo nowości i usprawnień. Obecnie program umożliwia odtwarzanie plików MP3, AAC-LC (również HE-AAC), MP4 (tylko ścieżka audio), WMA, FLAC ze zmiennym i stałym bitrate oraz szerokim zakresem fsample do 48kHz. Odtwarzane pliki pobierane są z karty SD poprzez interfejs SDIO 4-bit. Obecnie istnieje również możliwość przewijania w przód/tył odtwarzanych plików podczas grania, podobnie jak przewija się taśmę w magnetofonie. Program również umożliwia nagrywanie dźwięków lub mowy z mikrofonu elektretowego i zapisywanie nagrań na kartę SD w postaci plików FLAC do podkatalogu o ustalonej nazwie Records. Gdy program stwierdzi brak takiego podkatalogu na karcie, to sam utworzy ten podkatalog przed rozpoczęciem nagrywania. Maksymalny czas ciągłego nagrywania ustaliłem na 8 godzin, co w połączeniu z próbkowaniem z częstotliwością 22,05kHz jednego kanału audio (dźwięk monofoniczny) daje mi max rozmiar pliku wynikowego ok 360MB. Tworzone pliki przybierają nazwę MIC_dzien-miesiac-rok godzina_minuta_sekunda.flac. Sterowanie pracą odtwarzacza/dyktafonu oraz wizualizacja jego pracy odbywa się poprzez wyświetlacz LCD TFT 240x320 z rezystancyjnym panelem dotykowym. 8-bit dane do LCD przesyłane są przez interfejs FSMC, natomiast obsługą panela dotykowego zajmuje się ADC wbudowany w mikrokontroler. Gdy wybrany jest tryb odtwarzacza, na LCD wyświetlana jest przewijalna w górę/dół lista podkatalogów i plików. Wybór podkatalogu/pliku na tej liście odbywa się poprzez najechanie podświetleniem na interesujący wiersz tej listy i zatwierdzenie go przyciskiem Enter/Play (podobnie, jak w Windows Commander), przy czym gdy nazwa podświetlonego podkatalogu/pliku jest zbyt długa, by w całości wyświetlić się na LCD, to będzie przewijać się w poziomie. Gdy wybrany plik, odtwarzacz gra pliki począwszy od wybranej pozycji aż do końca listy. Oczywiście, w każdej chwili można zakończyć odtwarzanie/nagrywanie przyciskiem Pause/Stop. Również zapewniłem możliwość wymiany plików między kartą SD i komputerem poprzez interfejs USB.
    Zastosowałem przetworniki ADC/DAC wbudowane w układ kodeka TLV320AIC23, skonfigurowane do przetwarzania słów 16-bit, dane do przetworzenia/przetworzone są przesyłane miedzy mikrokontrolerem i kodekiem poprzez interfejs I2S. Dodatkowy interfejs SPI służy do konfigurowania kodeka.
    Do przechowywania odczytanego z SD drzewa podkatalogów/plików zastosowałem pamięć SPI 23K256. Takie rozwiązanie podyktowane było koniecznością zapewnienia całej wbudowanej w mikrokontrolerze pamięci RAM (128kB + 64kB TCM) dla dekodera WMA. Pozostałe moduły nie są już tak pamięciochłonne, toteż po rezygnacji z możliwości odtwarzania WMA, można by pozbyć się tej pamięci SPI, a drzewo podkatalogów/plików ulokować np. w TCM.





    Kilka filmików prezentuje działanie projektu.

    Biblioteki użyte w programie.
    Do odtwarzania plików MP3 i AAC oraz MP4 użyłem bibliotek z wcześniejszego projektu małego odtwarzacza MP3. Jedyną poważniejszą zmianą w stosunku do wcześniejszej wersji było uruchomienie dekodowania plików HE-AAC, co wiązało się z dołożeniem funkcji realizujących obliczenia SBR.
    Do odtwarzania plików WMA wykorzystałem stałoprzecinkowy dekoder WMA oparty na projekcie FFmpeg, którą pobrałem stąd: http://www.rockbox.org/tracker/task/4984 .Jako projekt referencyjny, potrzebny do usunięcia błędów, dopisania ekstrakcji danych z formatu ASF niezbędnych do dekodowania i uruchomienia powyższego dekodera wykorzystałem zmiennoprzecinkowy dekoder WMA pobrany stąd: http://en.pudn.com/downloads138/sourcecode/multimedia/audio/detail594413_en.html .Krótki opis "bojów" z tą biblioteką opisany jest we wcześniejszym projekcie.
    Do nagrywania i odtwarzania plików FLAC wykorzystałem otwartoźródłową bibliotekę FLAC w wersji 1.2.1 stąd: http://downloads.xiph.org/releases/flac/ ,którą musiałem dostosować do swojego projektu. Z ważniejszych przeróbek tej biblioteki mogę wymienić dostowanie jej do enkodowania danych "w locie" tzn. odbieranych z ADC, a nie z pliku WAV do pliku FLAC, jak w oryginale. Ten sam zabieg objął też dekodowanie FLAC, tyle, że w drugą stronę - zdekodowane dane z pliku FLAC wysyłane od razu do DAC, a nie do pliku WAV, jak w oryginale. Ponadto niezbędne było dorobienie buforowania danych przez zapisem do pliku FLAC podczas enkodowania, by wykorzystać zalety zapisu naraz kilku sektorów na SD - w oryginale na nośnik było zapisywane już niekiedy kilka bajtów danych, a w praktyce kilkaset (!= 512 * n, n - liczba naturalna) bajtów, co bardzo spowalniało zapis.
    Obsługą systemu plików FAT16/FAT32 na karcie SD zajmuje się biblioteka FAT16/32 File IO Library V2.6 pobrana z Ultra-Embedded.com .Tu również nie obeszło się bez ważniejszych zmian takich jak: zmniejszenie zajętości sekcji .bss (oryginał zajmował mi chyba ponad 4kB - deklaracje struktur w plikach *.h), dorobienie możliwości obsługi polskich znaków w nazwach plików i podkatalogów, przyspieszenie wyszukiwania klastrów pliku podczas odczytu/zapisu (w oryginale przeszukiwanie zawsze rozpoczynało się od początkowego klastra pliku - zmieniłem to tak, że poszukiwanie następnych klastrów rozpoczyna się od bieżącego klastra będącego w użyciu) oraz usunięciu błędu w kodzie polegającego na braku tworzenia podkatalogów "." oraz ".." przy tworzeniu podkatalogu "Records". W efekcie karta SD z takim niepełnym wpisem podkatalogu była naprawiana przez system Windows w sposób polegający na usunięciu tego podkatalogu wraz z jego zawartością :D
    Do programowania peryferiali mikrokontrolera (za wyjątkiem zegarów i GPIO - te zrobiłem na piechotę) użyłem bibliotek SPL STMicroelectronics.

    Program napisałem w środowisku Rowley Crossworks ver 2.0.11. Zajętość Flash przez obecny program 460kB. Częstotliwość zegara mikrokontrolera 96MHz.

    Zaproponowany schemat ideowy, to w zasadzie przerysowane fragmenty schematu zestawu Discovery, do tego doszedł schemat podłączenia LCD wzięty z wcześniej prezentowanego projektu zegarka na STM32F4Discovery oraz otoczenie kodeka TLV320 wzięte stąd: http://www.propox.com/download/docs/MMcodec01_sch.pdf .Nie projektowałem jeszcze zasilania, gdyż nie jest to zakończony projekt.

    W planach:
    Dorobienie radia internetowego na module WiFi. Obecnie przyciski "Radio" w głównym menu oraz "WiFi" w menu Settings są nieaktywne.
    Dorobienie dodatkowych przycisków (może wykorzystanie akcelerometru), by podstawowe funkcje odtwarzacza (regulacja głośności, pauza/wznowienie odtwarzania) realizować nie patrząc na jego wyświetlacz (np. jest w kieszeni).
    Zapakowanie całości do obudowy KM-22.
    Dorobienie zarządzania zasilaniem (regulacja jasności podświetlenia wyświetlacza, włączanie i wyłaczanie odtwarzacza, wizualizacja ładowania akumulatorka).

    Pozdrawiam, KT
    Programowy odtwarzacz/dyktafon na STM32F407VGT6








    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz pendrive 32GB.
  • #2 28 Paź 2014 18:02
    deton24
    Poziom 12  

    22,05kHz dyktafonu to nie jest jakaś specjalna jakość, pozornie do mowy wystarcza, ale nie jest specjalna.

  • #3 28 Paź 2014 19:45
    badworm
    Poziom 18  

    W przypadku dyktafonu i tak najwięcej zależy od przetwornika czyli mikrofonu.

    Sam projekt całkiem ciekawy aczkolwiek zastanawia planowany wybór obudowy - z pewnością dałoby się za rozsądne pieniądze znaleźć coś bardziej gustownego.

  • #4 28 Paź 2014 22:57
    Tytus Kosiarski
    Poziom 14  

    Mógłbyś, Badworm, coś podpowiedzieć odnośnie ładniejszej obudowy? Wstępnie wybrałem wspomnianą KM22 z uwagi na akceptowalne jej wymiary zewnętrzne oraz względnie łatwą możliwość upchnięcia całej elektroniki wraz z zasilaniem wewnątrz. Jednakże mogę zmienić swój wybór.
    Pozdrawiam, KT

  • #5 29 Paź 2014 07:27
    Freddy
    Poziom 43  

    deton24 napisał:
    22,05kHz dyktafonu to nie jest jakaś specjalna jakość, pozornie do mowy wystarcza, ale nie jest specjalna.
    To jest jakość taka jak na CD, no to rzeczywiście lipa :D. Autor napisał, że sygnał jest mono.

  • #6 29 Paź 2014 09:52
    Pokrentz
    Poziom 21  

    Freddy, ale CD próbkuje jeden kanał z częstotliwością 44,1 kHz, 16 bit, z tego, co pamiętam. Próbkowanie 22,05 kHz to połowa powyższego i pasmo przenoszenia obcięte do ok. 10 kHz. Ale do mowy, istotnie, wystarczy.

  • #7 29 Paź 2014 13:32
    Freddy
    Poziom 43  

    Pokrentz napisał:
    Freddy, ale CD próbkuje jeden kanał z częstotliwością 44,1 kHz, 16 bit, z tego, co pamiętam. Próbkowanie 22,05 kHz to połowa powyższego i pasmo przenoszenia obcięte do ok. 10 kHz. Ale do mowy, istotnie, wystarczy.
    Słyszałeś głosy około 10kHz, bo ja nie :P w radiach jest z tego co pamiętam 16kHz i to wystarcza

  • #8 29 Paź 2014 14:28
    Gigantor
    Poziom 18  

    Freddy napisał:
    w radiach jest z tego co pamiętam 16kHz i to wystarcza


    Do zapisu mowy przeciętnego człowieka, bez wielkich wymagań co do jakości, starczy cz. próbkowania 8kHz. Układ ISD1700 (message voice recorder) schodzi do 4kHz. Tak więc te ~22kHz to praktycznie szaleństwo.

  • #9 30 Paź 2014 21:24
    badworm
    Poziom 18  

    Tytus Kosiarski napisał:
    Mógłbyś, Badworm, coś podpowiedzieć odnośnie ładniejszej obudowy? Wstępnie wybrałem wspomnianą KM22 z uwagi na akceptowalne jej wymiary zewnętrzne oraz względnie łatwą możliwość upchnięcia całej elektroniki wraz z zasilaniem wewnątrz. Jednakże mogę zmienić swój wybór.

    Zobacz co jest w ofercie np. w reichelt.de Mają obudowy takich firm jak Bopla czy Teko - jakieś ładne i zgrabne pudełko powinieneś tam znaleźć. Do tego ceny są bardzo rozsądne - za jedną z obudów Bopla zapłaciłbym u nich mniej (cena brutto wraz z wysyłką kurierem) niż u jednego z polskich dostawców (cena netto bez wysyłki!).

  • #10 31 Paź 2014 20:39
    Tytus Kosiarski
    Poziom 14  

    Dzięki za info, Badworm. Jak znajdę chwilę czasu, to zerknę - może będą mieli obudowy z otworem przysłoniętym przeźroczystą folią akurat na wyświetlacz z panelem dotykowym - tak sobie gdybam.

  • #11 01 Lis 2014 08:18
    Freddy
    Poziom 43  

    Bopla prowadzi wiele firm w Polsce, choćby TME.
    Zerknij jeszcze na obudowy Gainta też są bez problemu w Poslce.

  • #12 04 Lis 2014 04:41
    Jogesh
    Poziom 28  

    Witam
    Czy dało by się zwiększyć próbkowanie nagrywanego sygnału? Czy kolega nie pokusiłby się o zrobienie "profesjonalnego" urządzenia do nagrywania w wersji stereo?
    Pozdrawiam

  • #13 04 Lis 2014 13:15
    deton24
    Poziom 12  

    Tak, jeden kanał to nie połowa częstotliwości, ale połowa bitrate. Powinno być słychać różnice, ale samo stereo nie powinno mieć wielkiego znaczenia, chyba że dla kompresji. To samo bitrate i częstotliwość stereo, a mono potrafi się gorzej skompresować.

  • #14 04 Lis 2014 21:23
    Tytus Kosiarski
    Poziom 14  

    Witam

    Da się, oczywiście, zwiększyć częstotliwość próbkowania, tak samo ilość kanałów. W tym celu wystarczy odpowiednio zmodyfikować zmienne: fsample oraz channels w funkcji create_file_and_start_record (plik record_files.c), skompilować i wgrać do mikrokontrolera. Sam też się bawiłem zmianą tych nastaw (ustawiłem 44,1kHz oraz 1 lub 2 kanały), różnica była taka, że było słychać więcej szumów (nagrania z mikrofonu), poza tym nie słyszałem jakichś innych różnic w nagranych dźwiękach, toteż zostawiłem takie nastawy, jak opisałem na początku. Ale jeszcze sprawdzę to, przy chwili wolnego czasu, chociażby po to, by wiedzieć, jak zwiększy się rozmiar nagrywanego pliku. Nie przewiduję budowy może nie profesjonalnego, ale bardziej rozbudowanego urządzenia, powiedzmy w wersji stacjonarnej lub większej przenośnej, bo akurat mi takie coś nie jest potrzebne. Ale prezentowany projekt może być bazą wyjściową do budowy takiego urządzenia. Na pewno można dorobić wejścia liniowe, regulację poziomu nagrywania, balansu, wyprowadzić wyjścia liniowe (TLV320 ma takie możliwości), dorobić dodatkowe pozycje w menu obsługujące te możliwości kodeka, oraz dodatkowe funkcje potrzebne w takim urządzeniu.

    Pozdrawiam

  • #15 16 Lis 2014 10:37
    Tytus Kosiarski
    Poziom 14  

    Witam

    W międzyczasie dorobiłem trochę usprawnień podczas nagrywania. Jedno z tych usprawnień polega na obliczeniu wolnego miejsca na karcie SD przed rozpoczęciem nagrywania. Stosownie do wyniku tego obliczenia są wyświetlone komunikaty o ilości wolnego miejsca na SD w MB i o przewidywanym maksymalnym czasie nagrywania.Gdy brak jest miejsca na SD, to wyświetlane jest info o braku wolnego miejsca na SD - wtedy niemożliwe jest rozpoczęcie nagrywania. Obliczenie wolnego miejsca polega na przepatrzeniu wpisów tablicy FAT, sprawdzeniu, które z tych wpisów są równe 0, zliczeniu ilości tych zerowych wpisów i pomnożeniu tej ilości przez rozmiar klastra w bajtach.
    Kolejnym usprawnieniem jest zwiększenie ilości 512-bajtowych paczek danych do zapisu na kartę z początkowych 4 do obecnych 16. Przyczyną zmiany był zbyt wolny zapis na niektórych kartach przy początkowej wartości ilości zapisywanych paczek.
    Przeniosłem nastawę ilości kanałów oraz częstotliwości próbkowania (zmienne channels oraz fsample) do pliku main.c. Zmiana była potrzebna, by obliczyć przewidywany czas nagrywania jeszcze przed rozpoczęciem nagrywania. Teraz te nastawy są przekazywane jako parametry dla funkcji create_file_and_start_record w pliku record_files.c.

    Przeprowadziłem próby nagrań mikrofonowych przy częstotliwości próbkowania 44,1kHz i ustawieniu 1 lub 2 kanały.
    8 godzin nagrania 1 kanału - plik o rozmiarze ok. 800MB.
    8 godzin nagrania 2 kanałów - plik o rozmiarze ok. 1,05GB


    Słuchowo jakość nagrywania przy tych nastawach - dźwięk trochę bogatszy w szczegóły, choć przy dwóch kanałach jest większa ilość szumów.


    Dołączony filmik prezentuje zmieniony sposób pracy nagrywarki.

    Pozdrawiam