Strumień bajtów mikrofon

Strumień bajtów mikrofon
T9
  • Rejestracja:prawie 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:4 minuty
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:prawie 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 3 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:około 17 lat
  • Ostatnio:16 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:4 minuty
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:prawie 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:4 minuty
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 3 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:prawie 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:4 minuty
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:prawie 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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)