Skocz do zawartości

STM32 - odczyt z mikrofonów PDM


radek04

Pomocna odpowiedź

Cześć,

rozbudowując wcześniejszy projekt Akwizycja danych sensorycznych postanowiłem pobierać również danych z mikrofonów. Po długiej walce z konfiguracją interfejsu SAI, doszedłem do etapu konwersji sygnałów PDM na PCM w użyciem biblioteki pdm2pcm. Czy ktokolwiek z Was korzystał z niej wcześniej? Niby producent dostarcza sporo materiałów informacyjnych, ale nawet po kilkukrotnym ich obejrzeniu stanąłem w miejscu.

Parametry systemu:
- 4 mikrofony PDM podłączone do 1 linii SCK (3.072 MHz) i dwóch linii danych (2 pary po 2 mikrofony)
- długość ramki 32 bity (w ramce dane z wszystkich 4 mikrofonów)
- sampling rate 48 kHz (akwizycja dźwięku do 24 kHz)
- decimation factor 64
- wykorzystanie DMA.

Moim celem jest przerobienie danych PDM na PCM.
Chciałbym mieć 4 osobne tablice PCM, każda zawierająca dane z innego mikrofonu (oczywiście może być też 1 tablica, którą sobie "ręcznie" rozdzielę). Na razie chodzi mi o zarejestrowanie kilkuminutowej ścieżki audio i jej zapis na kartę pamięci w sposób umożliwiający rozdzielenie 4 ścieżek z różnych mikrofonów.

Jakich wielkości buforów na dane PDM oraz PCM powinienem użyć?
W CubeIDE przy pdm2pcm ustawić 1 kanał czy 4?
in_ptr_channels powinno być równe 4?
out_ptr_channels powinno być równe 1 czy 4?
Jaką wartość output_samples_number wybrać?

Producent podaje, że w PDM_filter_handler powinien być skonfigurowany dla każdego mikrofonu osobno, natomiast w CubeIDE generuje mi się tylko 1 handler w pliku pdm2pcm.c (jeżeli liczba kanałów jest równa 1). Czy zatem How many channel do you use? ustawić mam na 4?

Jeżeli ktokolwiek miał z tym do czynienia lub po prostu jest w stanie pomóc, proszę o informację.

Edytowano przez radek04
Link do komentarza
Share on other sites

(edytowany)

Zdaje się, że udało mi się dobrze skonfigurować wszystko w CubeIDE.

SAI_param.thumb.png.1c18e950e64d417f349f41bdffb5ce50.png

Nie do końca jestem pewny, czy DMA mam dobrze skonfigurowane. Ale skoro mam ramki 32-bitowe, to muszę mieć wybraną szerokość danych Word, prawda?

SAI_DMA.thumb.png.accac33e345144e8fa572ac22d8fe71a.png

Niestety podczas odczytu, niezależnie od wielkości tablicy danych PDM (PDM_buffer), zawsze 6 pierwszych i 2 ostatnie komórki tablicy są wypełnione zerami. Dlaczego?

SAI_main_DMA.png

Tryb przerwaniowy (IT) nie działa mi w ogóle (nie mam pojęcia dlaczego). Przy zwykłym blokującym trybie (HAL_SAI_Receive w pętli while) tablica wypełniana jest w całości, ale na taki tryb nie mogę sobie pozwolić.

 

Czy macie pomysły, co robię źle, albo jak to zrobić inaczej?

Edytowano przez radek04
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Brawo, udało Ci się odkryć jakie niespodzianki kryją w sobie układy F7/H7. Wspominałem o tym wcześniej, chyba w wątku, o i2c/DMA. Jak widać problem wcześniej, czy później jednak się pojawi.

  • Lubię! 1
Link do komentarza
Share on other sites

Zdaje się, że udało mi się przebrnąć przez te wszystkie niezrozumiałe dla mnie parametry, głównie metodą prób i błędów. Niestety dokumentacja techniczna (ani poradniki) nie tłumaczą wszystkiego. Niektóre ustawienia były dla mnie dużym zaskoczeniem, ale (czasami przypadkiem) udało się przez nie przebrnąć.

Zagadką pozostaje dla mnie znaczenie rozmiaru bufora PDM, a w zasadzie stosunek jego wielkości do wielkości bufora PCM (ustawianego np. w CubeIDE w miejscu PDM2PCM).
Sprawdziłem w praktyce i okazuje się, że prawidłowe działanie zaczyna się mniej więcej przy buforze PDM ok. 6x większym od PCM (tak naprawdę są pewne różnice w zależności od wielkości bufora PCM). Nie mam pojęcia dlaczego. Gdyby to było 8 razy, 16 razy itd, OK, przyjąłbym to bez większej refleksji. Ale 6??? Przy mniejszym PDM, w niektórych miejscach występuje nieciągłość sygnału PCM (skok wartości).

Czy dobrze rozumiem, że 8 bitów PDM przetwarzanych jest na pojedynczą próbkę PCM? Czy to niekoniecznie tak działa?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.