Strumień bajtów mikrofon

Strumień bajtów mikrofon
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

Chciałbym napisać/zrobić własny oscyloskop. Do próbkowania wykorzystał bym wejście na na mikron, ma ono częstotliwość próbkowania 44kHz, takie rzeczy już istnieją więc to nie jest science fiction. Problem jest taki że w językach wyższego poziomy garbacz kolektor się miesza we wszytko i powoduje utratę części danych próbek, i zastanawiam się czy w C/C++ istnieje możliwość pewnej rejestracji danych z mikrofonu. Pewnej znaczy żeby nie tracić próbek i nie mieszać kolejności, szybkość nie jest istotna nie potrzebuje ich real time. I drugie czy dało by rade pewnie wysłać te dane do innego programu, dużo szybciej można zrobić UI javie czy C# niz w c/c++.

Patryk27
To nie jest problem GC, tylko masz kijowo napisany kod. To tak, jak gdybyś nie puszczał sprzęgła przy ruszaniu samochodem i szedł kupować nowy samochód, ponieważ stary się przy takiej akcji trzepie :v
grzesiek51114
grzesiek51114
@Patryk27 no i widzisz... Jakbyś zrobił z tego posta to dostałbyś ode mnie punkcik, a tak... napiszę po prostu +1 :D
Patryk27
Na telefonie wygodniej pisze się komentarze - dlatego czekam na nowego Kojota =D
T9
ja nie mam kodu :), ktoś kto robił open sourcowe api do mikrofnu dla dot netu zaznaczał ze do przesyłania dźwięku się nadaje ale do intensywnego próbkowaniu już nie bo GC im miesza. Nie chciałbym spędzić nad czymś x-godzin tylko po to by się okazało że cały plan był z góry skazany na porażkę, bo zamist ++ miałem # po literce C
0

Jaki system operacyjny? Prawdopodobnie, aby mieć pewność, że wszystko odczytujesz, będziesz musiał dostać się do urządzenia bezpośrednio. W przypadku linux'a dostajesz się przez plik w /dev, oraz konfigurujesz różne ustawienia ioctl'em.
W windowsie jeżeli nic takiego nie istniej co pozwala na dostęp, prawdopodobnie będziesz musiał napisać własną wersję drivera?
Nie znam się na windowsach i ich budowie, ale co mogę Ci powiedzieć, to to, że w przypadku linux'a sprawę masz praktycznie załatwioną. Różna może być nazwa urządzenia dla róznych systemów, natomiast sama implementacja sprzętowa, programowa (niskiego poziomu), kompletnie Cię nie interesuje.

spartanPAGE
Żeś się rozpędził z tym.... Serio, własny driver? Może jeszcze własny windows?
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
3
topik92 napisał(a):

Problem jest taki że w językach wyższego poziomy garbacz kolektor się miesza we wszytko i powoduje utratę części danych próbek

Że co? Coś ci się miesza, albo przeczytałeś jakąś bzdurę w internecie.
Albo jakiś programisty mądry inaczej, w ten sposób umywa rączki od bug-a w swoim kodzie.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

Przeczytałem :(. Moze to dotyczyło tylko ich Api, moze ktoś to zmyślił, moze to prawda, nie wiem :(

edytowany 1x, ostatnio: topik92
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

z GC jest taki problem, że w nieprzewidywalnym momencie może odpalić przerywając działanie programu, i próbki w tym czasie nadchodzące rzeczywiście mogą być tracone, bo nie będą odbierane na czas.
I wcale nie chodzi tu o bugi w kodzie.
Chociaż nowsze wersje .NETa (od 4 w górę) podobno są pod tym względem lepsze.
Można też zmniejszyć prawdopodobieństwo odpalenia kolektora nie alokując żadnych nowych obiektów podczas próbkowania.

Z drugiej strony 44 kHz to nie jest jakoś strasznie dużo i myślę że wyolbrzymiasz problem.

zastanawiam się czy w C/C++ istnieje możliwość pewnej rejestracji danych z mikrofonu

Oczywiście.

edytowany 1x, ostatnio: Azarien
MarekR22
naprawdę GC może powadzić do utraty próbek? Przy takiej pauzie w działaniu programu, próbki powinny lądować w buforze nie kontrolowanym przez GC (np sterownik). Jedyny przypadek który sobie wyobrażam, że GC coś psuje to przetrwanie danych w czasie rzeczywistym, np wytwarzanie dźwięku na podstawie dźwięku wejściowego, program z powodu czkawki spowodowanej przez GC nie zdążył wypełnić bufora wyjściowego. Przypadek opisany tutaj nie powinien stanowić problemu.
Azarien
@MarekR22: nie wiem czy może. teoretycznie może. teoretycznie w C++ też może, przy bardzo dużym obciążeniu systemu innymi procesami. Windows nie jest systemem czasu rzeczywistego.
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:9 dni
0

Jak chcesz się bawić czymś nowym (i mniej błędogennym niż C/C++) to masz https://github.com/RustAudio/rust-portaudio


MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
0

Według mnie jedyny przypadek kiedy w takim programie GC może coś bruździć, to generowanie sygnału na karcie dźwiękowej, przepuszczanie go przez badany układ elektroniczny i analizowanie sygnału jaki dociera do wejścia mikrofonowego.
Jeśli program nie zdąży wygenerować danych wyjściowych to wtedy faktycznie jest problem, ale wtedy brakuje próbek dla karty dźwiękowej, a nie dla programu.
Natomiast w przypadku próbek wejściowych problemu nie powinno być, bo próbki powinny być zbuforowane w czasie gdy działa GC.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

Okazało się że przez braki dokładności przy pomiarze czasu nie da rady dobrze zaimplementować jednej fikcjonalności <3

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
1
topik92 napisał(a):

Okazało się że przez braki dokładności przy pomiarze czasu nie da rady dobrze zaimplementować jednej fikcjonalności <3

?
Dziwne. Można pobrać częstotliwość próbkowania karty dźwiękowej i uznać, że czas między próbkami jest stały, nie wiem po co ci jakieś dodatkowe pomiary czasu.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 2 godziny
0

Okazało się że przez braki dokładności przy pomiarze czasu nie da rady dobrze zaimplementować jednej fikcjonalności

„fikcjonalności” to chyba rzeczywiście nie :-)

Może napisz do czego ci pomiar czasu. QueryPerformanceTimer/QueryPerformanceFrequency przy próbkowaniu 44 kHz powinno wystarczyć aż nadto.

T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

W telegraficznym skrócie powiedzmy że ambitnie chce wyświetlić sygnał o częstotliwości 1kHz(okres 1ms) 44,1 próbki wiec jakość będzie to wyglądać. Oscyloskop ma taką opcje że wyświetla że wyświetla x ms potem kolejne i jak trafi się w okres to robi się stan quasi-ustalony sygnał "stoi" lub lekko płynie. Monitor mogę odświeżać tylko 60 razy na sekundę(16 ms-16 okresów). więc muszę sobie wartości kolejnych próbek do wyrzucenia na monitor estymować. Żeby przewidzieć co trzeba z dokładnością 1% bład na okres musi być mniejszy niż 0,000625 ms. 44,1 próbek na ms "to taka sobie "wartość więc muszę uwzględniać dt na początku i na końcu okresu żeby obraz nie skakał i uwzględniać je przy kolejnych estymacjach. Z biblioteki która Jest(i innej nie mam) mogę odbierać dane w postaci tablicy co ~100 ms. Dziesiąte części sekundy mają się tak do milionowych części sekundy że o pomiarze czasu jakimkolwiek timerem nie ważne jak dokładnym, mogę zapomnieć. Uroku dodaje fakt że kontrolka z wykresem jest w UI thread, i nie mogę jej od tak zmieniać z innego wątku, i odświeżam ją winformsowym timerem o rozdzielczości ~16ms :D.

Syzyfowa robota zamiast tego wykrywam zbocze narastające, i przejście przez 0 :P

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
1

Używałeś kiedyś oscyloskopu? Rozumiesz jak działa? Wygląda na to, że nie.
To, że sygnał "robi się stan quasi-ustalony" to jest wynik ustawienie właściwego trigera na oscyloskopie. Oscyloskop nie wyświetla wszystkiego jak leci, ale tylko wybrane ramki czsowe, które zostaną wykryte przez "triger".
Chodzi mi o to, że nie masz wyświetlać wszystkich próbek. Nie jest ci to potrzebne (jeśli ma się to zachowywać jak oscyloskop).
Równocześnie musisz napisać mechanizm, który będzie odtwarzał zachowanie trigera (np przejście w "góre" do jakiejś wartości wyznacza ci jakiś moment na osi czasowej).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
T9
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:329
0

Oscyloskop ma taką funkcje jak napisałem, z reguły korzysta sie z wyzwalaczy bo są bardziej praktyczne, ale MA taką funkcje. Możesz sprawdzić w pisując oscilloscope free running mode, w google

Nie pisałem też o wyświetlaniu wszystkich próbek, wręcz przeciwnie, tylko o wyświetlaniu tylko tego co trzeba czyli okna czasowego co 16ms czyli 60hz czyli tyle żeby "ekran chodził płynnie".

Poza tym o wykrywaniu przejścia przez 0 i zbocza narastającego pisałem, na dole tam tego postu.

edytowany 6x, ostatnio: topik92

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.