Czy Java obsługuje audio z częstotliwością próbkowania 384 kHz?

Czy Java obsługuje audio z częstotliwością próbkowania 384 kHz?
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

Witam, mam problem w kwestii pobierania danych z wejścia audio. Chciałbym osiągnąć częstotliwość próbkowania na poziomie 384 kHz, jako że używam wejścia audio do nietypowych zastosowań wymagających dużej dokładności w próbkowaniu. Mam taki kod:

Kopiuj
[...]
final static AudioFormat format = new AudioFormat(48000, 8, 1, true, true);
[...]
TargetDataLine line;
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
line=(TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
ByteArrayOutputStream out  = new ByteArrayOutputStream();
int numBytesRead;
byte[] data = new byte[16040];
numBytesRead =  line.read(data, 0, data.length);
[...]

Póki co, używam częstotliwości próbkowania 48 kHz, chciałbym jednak przenieść się na 384 kHz, a mogę uzyskać maksymalnie 200 kHz. Wszystko powyżej tej wartości zwraca błąd, że nie jest ona obsługiwana; mimo że moja karta dźwiękowa w pełni obsługuje aż 384 kHz. Pytanie więc, czy to Java nie obsługuje nic powyżej 200 kHz, czy może robię coś źle i da się to obejść żeby w pełni wykorzystać możliwości karty dźwiękowej. Z góry dzięki za odpowiedź.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:21 minut
0

Podaj stacktrace.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

Błąd z prostego programu testującego odczytywanie danych, z linijkami kodu identycznymi do tych z mojego pierwszego postu:

Exception in thread "main" javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 384000.0 Hz, 8 bit, mono, 1 bytes/frame, not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:513)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:121)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:153)
at testaudio.Testaudio.main(Testaudio.java:29)
C:\Users\Kacper\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

Linia 29:
line.open(format);

O ile o to chodziło.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:21 minut
1

Hmm, trochę pogrzebałem i wychodzi na to, że line.open wchodzi do com.sun.media.sound.DirectAudioDevice#nOpen, które jest już natywne i ciężko śledzić co się w środku dzieje.

Na twoim miejscu spróbowałbym wyciągnąć z Javy listę wspieranych formatów lub w pętli sprawdzałbym różne kombinacje parametrów dla AudioFormat aż do skutku.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

musisz mieć kartę, która obsługuje taką częstotliwość próbkowania. Standard (większość wbudowanych w płytę) to 44kHz, lepsze mają 96kHz ale to wyjście czyli przetwornik C/A. Natomiast kart z przetowornikiem A/C powyżej 96kHz nie udało mi się znaleźć w google. Pewnie dedykowany zewnętrzny przetwornik byś znalazł ale cena by pewnie była jak za niezły samochód.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

Spróbowałem wyciągnąć listę wspieranych formatów i wyszło mi coś takiego:
"[PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, , PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, ,[...]"
Nie zawiera to informacji o wspieranych częstotliwościach próbkowania. Próbowałem z różnymi formatami (np. 16 bitowy, 32 bitowy, mono, stereo) i nie udało się osiągnąć sukcesu. Cóż, jak ktoś ma jeszcze jakiś pomysł to proszę o pomoc.
Natomiast podstawowe pytanie: czy Java w ogóle wspiera chcianą przeze mnie częstotliwość próbkowania?

UP: mam kartę zgodną z Realtek High Definition Audio, które według specyfikacji wspiera 384 kHz częstotliwości próbkowania. Ale może jest tu jakiś błąd w moim rozumowaniu.

edytowany 1x, ostatnio: Kacper Gutowski
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

podaj model karty


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

Model karty to:
Intel 82801GB ICH7

Chyba gafę popełniłem bo jeszcze raz zajrzałem do dokumentacji High Definition Audio i napisane tam jest o wsparciu 192 kHz, natomiast już nie o 384 kHz, co może wyjaśniać fakt, że nie mogę osiągnąć częstotliwości wyższej od 200 kHz (zapewne producent dał dodatkową rezerwę powiększającą wspieraną częstotliwość o 8 kHz):

Sample rate support ranging from 6 kHz to 192 kHz

Mam natomiast inne pytanie. Co jeśli chcę wyciągnąć z wejścia audio 2-bajtowe dane zamiast 1-bajtowych, lub gdy chcę wyciągnąć dane z dwóch kanałów? Jak one się wtedy układają w tablicy bajtów?

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
0

za http://www.realtek.com.tw/products/productsView.aspx?Conn=4&Langid=1&Level=5&PFid=28&ProdID=44

All DACs support 44.1k/48k/96k/192kHz sample rate
All ADCs support 44.1k/48k/96kHz sample rate

jak widzisz przetworniki A/C mają max 96kHz


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:21 minut
0

Jak one się wtedy układają w tablicy bajtów?

Na pewno zależy to od tzw endianess, które może być big endian, little endian lub mixed endian (ale to przy 32-bitach dopiero).

Z tego co widziałem to API Javowe pozwala chyba wczytać WAVy nieskompresowane, więc ogarnij format takiego pliku, wpisz tam bajty 1, 2, 3, 4, 5 itd w miejsce danych dźwiękowych, a potem wczytaj w Javie i podejrzyj co tam wyszło w strumieniach :]


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

@Wibowit
Dzięki, ogarnąłem już że bajty układają się tak, że np. jeśli zapisują się do tablicy dwa bajty i mamy tablicę 16 000 bajtów to wartość pierwszego bajta jest w numerze [0], a druga w numerze [8000] i trzeba je pomnożyć i wyjdzie wynik odczytu.

@abrakadaber
Dzięki za źródło. Przeanalizowałem metodę nagrywania dźwięku za pomocą programu Audacity - połączyłem kablem wejście audio z wyjściem audio tak, żeby odtwarzany z komputera dźwięk się nagrał, włączyłem dźwięk i nagrywanie i odkryłem jedną rzecz. Mianowicie przy użyciu nagrywania z częstotliwością 384 kHz sygnał był co prawda nagrany z mniejszą dynamiką (96 kHz), ale ani nie wywaliło błędu, ani nie było widać "zębów", sample były ładnie zaokrąglone. I chciałbym coś takiego uzyskać w moim programie pisanym w Javie. Tak więc ponownie wraca temat ograniczenia do 200 kHz. Zależy mi na wyższej częstotliwości próbkowania ze względu na to, że potrzebuję móc na podstawie odczytanych sampli obliczyć wartość modulacji częstotliwości, a do tego potrzebna jest jak największa gęstość próbek na sekundę.

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:21 minut
1

trzeba je pomnożyć i wyjdzie wynik odczytu.

Skąd ci wyszło, że trzeba pomnożyć? Jeśli chcesz z dwóch bajtów złożyć wartość 16-bitową to powinieneś raczej zastosować przesunięcia bitowe, np:
```word = (hibyte << 8) + lobyte``

Poza tym zmianę częstotliwości próbkowania można przeprowadzić programowo. Jakości to nie doda (co najwyżej stracimy), ale jeśli nie poradzisz sobie z oryginalną to możesz sobie jakimś gotowcem przekonwertować. Wyguglaj "java resampling".


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
KG
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:39
0

Witam ponownie po dłuższym czasie. Z programu nie zrezygnowałem, a wręcz udoskonaliłem jego technikę działania, tak aby dokładniej wykorzystywał dane na wejściu. Mimo wszystko i tak więcej bym osiągnął mając wyższą częstotliwość próbkowania. Specyfika programu sprawia, że sztuczny resampling nie poprawia odczytu, tu potrzebne jest fizyczne zwiększenie gęstości próbek. Zastanawia mnie czy wirtualna maszyna Javy w ogóle obsługuje chcianą przeze mnie częstotliwość próbkowania; bo jak tak, to może pomoże zmiana z domyślnej biblioteki Javy na jakąś inną. Macie jakieś sugestie co do wyboru biblioteki? Nacisk kładę na prostotę odczytu surowych danych z wejścia, bo właściwie to na razie jedyna rzecz którą ma ta biblioteka w moim programie robić. Z góry dzięki a odpowiedź.

@Wibowit
Dzięki za odpowiedź, przesunięcia bitowe to jednak lepsze rozwiązanie niż moje

edytowany 2x, ostatnio: Kacper Gutowski
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)