RTV forum PL | NewsGroups PL

Jak zdekodować zapowiedzi dźwiękowe z EPROM amerykańskiego automatu z lat 90.?

Kodowanie dźwięku w starych urządzeniach / EPROM

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zdekodować zapowiedzi dźwiękowe z EPROM amerykańskiego automatu z lat 90.?

Goto page Previous  1, 2

Arnold Ziffel
Guest

Sun Jun 19, 2022 11:40 pm   



Dawid Rutkowski <drutkow1@wp.pl> wrote:

Quote:
Pobawiłem się chwilę:

No ale słychać coś sensownego?
Są dwa zestawy językowe?

Słychać, zobacz link z mojego posta (albo z posta Krzysztofa niżej), to
link do pliku audio.

--
Przychodzi mrówka do krawca i mówi:
- Jest nitka?
- Jest!
- Cale dwa cm proszę!
- Zapakować???
- Nie! Powieszę się na miejscu!

Piotr C
Guest

Mon Jun 20, 2022 5:45 am   



Mała errata:
Quote:
po całkowaniu. Czerwone - po uśrednieniu.
oczywiście chodzi o zielony wykres.


Quote:
Program jest tutaj:
prawidłowo: http://mabanana.com/elcotel/main.c i są zachowane wcięcia


Dodam jeszcze że częstotliwość próbkowania wyszła 9690 Hz (zapis próbki PCM po co drugim bicie wej.). Pod koniec wersji angielskiej jest sygnał zgłoszenia, który powinien mieć 350&440Hz więc łatwo było to obliczyć.

P.

Piotr C
Guest

Mon Jun 20, 2022 5:45 am   



On Saturday, June 18, 2022 at 11:38:24 PM UTC-7, Arnold Ziffel wrote:
Quote:
Baza do dalszych zabaw:

Dzięki - Tobie i innym, fajna zabawa! Chyba wrócę do kodowania. Ulepszyłem trochę program i:
- nie ma składowej stałej
- jest głośno, pełna dynamika

Co zmieniłem: generalnie Ty traktowałeś każdy oktet osobno, a myśle że lepiej przesuwać bit po bicie i całkować z wagą: przykładowo: n=0.3 dla ostatniego bitu i (1-n) dla poprzedniej wartości próbki. W zależności od współczynnika n, któryś najstarszy bit [-x] przestanie mieć znaczenie (będzie zgubiony przez poziomy kwantyzacji). Im 'n' większe, tym krótsza (bardziej stroma) odpowiedź impulsowa, im mniejsze - tym dłużej 'wybrzmiewa' każdy bit. Myślę że w realizacji analogowej, większe n to mniejsza pojemność kondensatora całkującego.
Teraz, przy stałym poziomie czyli ciągu 01010101... będzie oscylacja, więc uśredniam dwie ostatnie scałkowane wartości.
http://mabanana.com/elcotel/wykres.png
Na wykresie to widać ładnie, jak przebieg ładowania kondensatora. Czerwone kropki to bity na wejściu. Szare - po całkowaniu. Czerwone - po uśrednieniu. Dałem przykład z ciągiem "1", potem ciąg "0", a potem naprzemienne.
**** Ulepszone nagranie: http://mabanana.com/elcotel/output.wav
Eksperymentalnie dobrałem n=0.2151. Przy 8-bitowym wyjściu ze znakiem (signed) filtr powinien "pamiętać" do 20 ostatnich bitów, poprzednie będą "zgubione" przez rozdzielczość wyjścia. Można n wyliczyć tak: n = 1- sqrt(1/127, ile_bitów).
Teraz: mimo że dynamika jest OK, to są szumy. Nie wiem jak to zrealizować lepiej. Próbowałem uśredniać 3 próbki wyjściowe - ścina pasmo, szum jest "niżej" ale jest. Nie wiem. Ta realizacja jest myśle bliska filtrowi RC 1-rzędu.

Program jest tutaj: http://192.168.0.200/elcotel/main.c - wrzucę jeszcze poniżej bo te pliki będą skasowane.

Natomiast w kwestii kodowania mam szybkie pytanka:
- co robi #v+ ?
- fputc() - jest odpowiednik do zapisu int-a 16- lub 32 bit, lub całego obszaru pamięci (wskaźnik)?

Programowałem w C chyba jedynie na studiach 20 lat temu, zawodowo nigdy. Wcześniej od dzieciaka TurboPascal i Delphi już quasi-zawodowo.. I chyba nadal lubię ten poziom (kiedyś to się nazywało programowanie wysokopoziomowe, dzisiaj już raczej nie. Ale skręca mnie jak widzę nowoczesne języki, jakieś dziedziczenia templejtów, nejmspejsy itd itd. Taka chyba przypadłość jeśli się zaczynało w 1992 r.).

pozdrawiam

#include <stdio.h>
#include <assert.h>
#include <inttypes.h>


int main(void) {
FILE *ifp, *ofp;
uint8_t src_value; //odczytany bajt
float DSP_0 = 0; //aktualne wyjście integratora
float DSP_1 = 0; //popczednia wartość integratora (potrzebne do uśredniania 2 próbek)
float n = 0.2151; // współczynnik filtra - znaczenie nowego bitu
int8_t out_value; //wyjściowy bajt PCM (signed 8-bit)
int b=0; //bity, konwertowany do +/-1
int bitstream=0, bitstreammax=0; //aktualny i najdłuższy ciąg jednakowego bitu

ifp = fopen("VOICE_ROM_TMS27C010A.BIN", "rb");
ofp = fopen("output.raw", "wb");
assert(ifp);
assert(ofp);

do {
src_value = fgetc(ifp);
for (int i=0; i<8; i++) {
DSP_1=DSP_0;
b=(src_value&1)?1Sad-1); //+1 dla 1, -1 dla 0
src_value>>=1;
DSP_0=DSP_0*(1-n)+n*b;
out_value=round((DSP_0/2+DSP_1/2)*127); //uśredniamy 2 próbki + przeskalwanie +/-1 na +/-127 (signed int8)
if (i&1) fputc(out_value, ofp); //zapisujemy wyjście co drugi bit
}
} while (!feof(ifp));

fclose(ofp);
fclose(ifp);

return 0;
}

Goto page Previous  1, 2

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zdekodować zapowiedzi dźwiękowe z EPROM amerykańskiego automatu z lat 90.?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map