-
X-Received: by 2002:ac8:7fc4:0:b0:304:eed3:9336 with SMTP id
b4-20020ac87fc4000000b00304eed39336mr17975074qtk.284.1655697189901; Sun,
19 Jun 2022 20:53:09 -0700 (PDT)
X-Received: by 2002:ac8:7fc4:0:b0:304:eed3:9336 with SMTP id
b4-20020ac87fc4000000b00304eed39336mr17975074qtk.284.1655697189901; Sun,
19 Jun 2022 20:53:09 -0700 (PDT)
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.man.lodz.pl!newsfeed.pionier.net.p
l!2.eu.feeder.erje.net!feeder.erje.net!news2.arglkargh.de!news.mixmin.net!proxa
d.net!feeder1-2.proxad.net!209.85.128.88.MISMATCH!news-out.google.com!nntp.goog
le.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.misc.elektronika
Date: Sun, 19 Jun 2022 20:53:09 -0700 (PDT)
In-Reply-To: <6...@h...invalid>
Injection-Info: google-groups.googlegroups.com; posting-host=184.103.221.227;
posting-account=bYZEewoAAAAzKuHy481e1N4tOjIJZiD0
NNTP-Posting-Host: 184.103.221.227
References: <4...@g...com>
<6...@h...invalid>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <6...@g...com>
Subject: Re: Kodowanie dźwięku w starych urządzeniach / EPROM
From: Piotr C <k...@g...com>
Injection-Date: Mon, 20 Jun 2022 03:53:10 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Xref: news-archive.icm.edu.pl pl.misc.elektronika:772666
[ ukryj 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;
}
Następne wpisy z tego wątku
- 20.06.22 06:02 Piotr C
Najnowsze wątki z tej grupy
- Współczesne mierniki zniekształceń nieliniowych THD audio, produkują jakieś?
- Jaki silikon lub może klej?
- Smar do video
- Litowe baterie AA Li/FeS2 a alkaliczne
- "ogrodowa linia napowietrzna"
- jaki zasilacz laboratoryjny
- jaki zasilacz laboratoryjny
- Puszka w ziemię
- T-1000 was here
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
- Wyświtlacz ramki cyfrowej
Najnowsze wątki
- 2025-02-10 Spalił się spaliniak
- 2025-02-10 zarowka wifi - z sensowna apka lub lepiej albo lokalnie lub przez web. I zeby harmonogram miala
- 2025-02-10 Chrzanów => Programista NodeJS <=
- 2025-02-10 Kraków => DevOps Engineer (Junior or Regular level) <=
- 2025-02-10 Dlaczego takie preferencje banków?
- 2025-02-10 Białystok => iOS Developer (Swift) <=
- 2025-02-10 Mińsk Mazowiecki => Team Lead / Tribe Lead FrontEnd <=
- 2025-02-10 Białystok => System Architect (Java background) <=
- 2025-02-10 Współczesne mierniki zniekształceń nieliniowych THD audio, produkują jakieś?
- 2025-02-10 Szczecin => Senior Field Sales (system ERP) <=
- 2025-02-10 Gliwice => Business Development Manager - Dział Sieci i Bezpieczeńst
- 2025-02-10 Chrzanów => Specjalista ds. public relations <=
- 2025-02-10 Chrzanów => NodeJS Developer <=
- 2025-02-10 Warszawa => JavaScript / Node / Fullstack Developer <=
- 2025-02-10 Gliwice => Ekspert IT (obszar systemów sieciowych) <=