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

Dzień dobry,

Wątpie czy ktoś coś poradzi ale nie mam innego pomysłu. Amerykański automat telefoniczny z lat 90., odczytałem EPROM z zapowiedziami słownymi (wrzuć monetę itd itd) jednak nie potrafię tego zdekodować. To nie jest zwykłe PCM, próbowałem też ADPCM (import poprzez soundforge lub goldwave) i też nic, GSM też nie. Biorąc pod uwagę że procek to Zilog Z180 to nie może być nic zaawansowanego. Może ktoś rozpracowywał podobne urządzenia i miałby szybką poradę?

Plik leży tutaj:

formatting link
pozdrawiam Piotr

Reply to
Piotr C
Loading thread data ...

Na poczatku widze cos jakby "spis tresci", czyli adres i dlugosc, po 2 bajty

0190h 06B4 08F4 0B15 0D93 itp

Ale plik 2x dluzszy ... no pod 10000h jakby drugi spis tresci.

Sa tam dluzsze sekwencje AA i 55 ... podejrzewam jakies delta modulation, ale 1 bit/probke, czy 2 bity/probkę

A tu MS poszedl z postępem i wyciął wszystkie stare narzędzia.

J.

Reply to
J.F

W dniu 17.06.2022 o 18:47, Piotr C pisze:

Zdumpuj program.

MJ

Reply to
Michał Jankowski

Prawda! Myślę że jeden będzie po angielsku, drugi po hiszpańsku.

Michał Jankowski wrote:

formatting link
łem deasemblacji, są nawet narzędzia online ale wychodzi za przeproszeniem kupa. Powinno startować z 0000 a są tam jakieś głupoty, nie widzę jumpa do niczego sensownego. Od offsetu 0098 jest napis "PCM 05.04.04 (C) COPYRIGHT BY ELCOTEL,INC. 1986 - 1999050404" i jest on deasemblowany jako kod... Ogólnie program nie będzie prosty bo wbrew temu że automat wygląda topornie, to jest mocno rozbudowany jeśli chodzi o programowanie, taryfy itd.

P.

Reply to
Piotr C

Bingo! 55 i AA ot najczęściej występujące wartości. w bin to: 01010101 10101010 czyli naprzemiennie 0 i 1, co w modulacji gęstości impulsów (wynik 1-bitowego kodowania sigma-delta) oznacza stały sygnał (za wiki:

formatting link
Zapewne coś miałem o tym na studiach, ale już słabo pamiętam. Programowo jak to zrealizować - nie wiem, uśredniać ostatnie n bitów i tak przesuwać po całej zawartości? Czy stosować jakieś wagi?

W ogóle zapomniałem zaznaczyć - ten temat nie jest jakoś szczególnie ważny. Ot, kupiłem programator (polecam - działa:

formatting link
aby dobrać się do EPROMu, co nb. poszło mizernie, boję się wylutowywać wielką pamięć bo zniszczę PCB a procek jednak nie jest w podstawce. Ale korzystając z okazji zczytałem ROM z programem i zapowiedziami bardziej do zabawy niż jakichś wielkich projektów. Dzięki za zainteresowanie bo mimo wszystko ciekawi mnie to bardzo!

P.

Reply to
Piotr C

Weź pod uwagę, że linie adresowe procka nie muszą być podłączone 1:1 do pamięci. Warto to sprawdzić, bo może eprom wymaga wymieszania adresów przed disasemblacją.

Czyli linie danych nie są wymieszane.

Reply to
Zbych

Najpierw uśrednić ostatnich n bitïe i posłuchać. Skoro są 55 i AA, to wag raczej nie będzie.

Reply to
Dawid Rutkowski

piątek, 17 czerwca 2022 o 23:32:12 UTC+2 Zbych napisał(a):

Miałem urządzenie od tskuego dowcipnisia. Do tego mieszał GALem, więc skomplikowaniej niż po prostu pozamieniać.

Mogą być, bo przecież ten napis się raczej nigdzie nie wyświetla.

Reply to
Dawid Rutkowski

Piotr C napisał(a):

... voice instruction set stored in PROM and played back through D/A circuitry into the receiver

Niezwykły:)

“PCM” (Payphone Control Module)

Coś z internetów idzie wyciągnąć.

Reply to
alojzy nieborak

Kurde prawda! Nie wpadłbym, ale mogli przekodować napis aby w kodzie wyglądał normalnie. Dzisiaj przedzwonie linie danych. Spróbuje też zdekodować dźwięk, chociaż od ostatniego czasu gdy coś kodowałem w C minęło ładnych pare lat.

Reply to
Piotr C

Mało prawdopodobne. Kod to kod. a wsad to wsad. Bez sensu jest żeby upiększać wsad. Mogą być pomieszane linie adresowe i/lub linie danych ale to się robi żeby uprościć płytkę (sam tak robiłem), a nie żeby utrudnić kopiowanie. Linii danych IMHO nie masz pomieszanych skoro widać napis. Może być kolejność bitów zamieniona do dekodowania (MSB/LSB). Linie adresowe raczej też nie są, aczkolwiek napis może się mieścić akurat w bloku niezmieszanym.

Reply to
Mirek

Pobawiłem się chwilę:

formatting link
Baza do dalszych zabaw:

#v+ #include <stdio.h>

#include <assert.h>

#include <inttypes.h>

int main(void) { FILE *ifp, *ofp; uint8_t value = 0x80; uint8_t dir = 0;

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

for (;;) { const uint8_t ch = fgetc(ifp); int i;

if (feof(ifp)) break;

for (i = 0; i < 8; ++i) { if (dir ^ !!(ch & (1 << i))) { if (value == 0xff) dir ^= 1; else value++; } else { if (value == 0x00) dir ^= 1; else value--; }

fputc(value, ofp); } }

fclose(ofp); fclose(ifp);

return 0; } #v-

I potem komenda:

sox -b 8 -c 1 -e unsigned-integer -r 22050 -t raw output.raw output.wav

Na pewno należałoby sparsować strukturę i resetować dekoder przy każdym nowym komunikacie -- to powinno usunąć DC bias.

Reply to
Arnold Ziffel

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

Reply to
Dawid Rutkowski

Jest Sun, 19 Jun 2022 02:37:06 -0700 (PDT), Dawid Rutkowski pisze:

Słychać.

formatting link

Nie inaczej.

ATSD, bardzo fajne wykopalisko.

k.

Reply to
Krzysztof Gajdemski

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

Reply to
Arnold Ziffel

O kurczę. Faktycznie, wystawiłeś od razu audio. Byłem przekonany, że to link do kodu i nawet nie zajrzałem. Niepotrzebne powielanie bytów (bajtów?). :/

BTW, wydaje mi się, że docelowo próbki miały być odtwarzane wolniej. Tak na ucho, to jakieś x 0,85 – 0,87% tego co wychodzi jako output.wav.

k.

Reply to
Krzysztof Gajdemski

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.

formatting link
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:
formatting link
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)?1:(-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; }

Reply to
Piotr C

Mała errata:

oczywiście chodzi o zielony wykres.

prawidłowo:

formatting link
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.

Reply to
Piotr C

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.