eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaKodowanie dźwięku w starych urządzeniach / EPROMRe: Kodowanie dźwięku w starych urządzeniach / EPROM
  • Data: 2022-06-20 05:53:09
    Temat: Re: Kodowanie dźwięku w starych urządzeniach / EPROM
    Od: Piotr C <k...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On Saturday, June 18, 2022 at 11:38:24 PM UTC-7, Arnold Ziffel wrote:
    > 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)?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;
    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: