OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

HVDOSdev2019!

Právě je 23 srp 2019, 23:56

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 22 ]  Přejít na stránku Předchozí  1, 2
Autor Zpráva
PříspěvekNapsal: 27 led 2019, 16:55 
Offline
Kecka

Registrován: 28 říj 2016, 21:03
Příspěvky: 74
Has thanked: 6 times
Been thanked: 34 times
Pro doplnění ještě obrázek, jak vypadá signál ve wavu. Je tam jakýsi patrný rozdíl mezi šířkou 0 a 1 pulzu, ale jsou si dosti podobné.


Přílohy:
plan-mgf.png
plan-mgf.png [ 3.85 KiB | Zobrazeno 1376 krát ]
Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 18:59 
Offline
Kecálek

Registrován: 24 pro 2014, 16:11
Příspěvky: 202
Has thanked: 7 times
Been thanked: 28 times
Dělal jsem nějaké pokusy s kazetami ze ZX Spectra. Formát záznamu je sice odlišný, nicméně i zde dlouhá vlna=1, krátká vlna=0

Takže:
Téměř vždy signál plave, tj. kolísá mu ss složka. I když signál je víceméně symetrický vůči vodorovné ose. Důvod je jednoduchý, signálová cesta mgf je kapacitně vázaná s poměrně velkými kapacitami, aby stroj přenášel dobře i basy. Používá se přeci primárně na muziku. A kondenzátory se nabíjejí a vybíjejí.
Je tedy nutné udělat kruhový buffer, vzorky z wavu do něj zapisovat, průběžně vyhodnocovat minimální a maximální vzorek a z nich průměr. A proti tomu průměru vstupní signál testovat.

Zde je příslušný kousek z mého emulátoru Ondry v Javě.
první funkce je konstruktor, který inicializuje buffer
do druhé se vstupuje s 8bit vzorkem bez znaménka a výstupem je obdélník. Z toho se pak v emulátoru detekují hrany signálu.
Kód:
public class TapeSignalProc {
   
    private final int init = 128;
   
    private int buff[];
    private int buffsize;
    private int head;
    private int min, max, avg;
   
    public TapeSignalProc(int size) {
        buffsize = size;
        buff = new int[size];
        head = 0;
        for(int n=0; n<buffsize; n++) {
            buff[n] = init;
        }
    }
   
    public boolean addSample(int sample) {
        buff[head] = sample;
        max = init;
        min = init;
        for(int n=0; n<buffsize; n++) {
            if (buff[head] > max) {
                max = buff[head];
            }
            if (buff[head] < min) {
                min = buff[head];
            }
            head++;
            if (head==buffsize) {
                head = 0;
            }
           
        }
        head++;
        if (head==buffsize) {
            head = 0;
        }
           
        avg = (min + max) / 2
        return (sample > avg);
    }
}


Tenhle kousek kódu spolu s běžným měřením intervalu mezi hranami mi v Ondrovi přečetl zatím všechny wavy, co mi lidi poslali. Tedy pokud neměly vyloženě výpadek.

Jak z oscilogramu vyplývá, tak okolní bity se někdy docela ovlivňují, je to vidět třeba na sekvenci 101. Magnetický záznam je také od přírody dosti kmitočtově závislý, zvláště, když má někdo blbě seřízenou kolmost hlavy.

Stálo by za to vyvinout nějaký adaptabilní algoritmus, který by opravdu nějak analyzoval ty vlnovky. Jelikož všechny počítače jsou v podstatě o vzdálenosti hran v signálu, udělat něco univerzálního, do čeho by lezl wav a z něj by lezl soubor, kde jsou vzdálenosti mezi hranami. No a k tomu už je sranda udělat programy pro jednotlivé počítače.

Takhle je to udělané i v signálovém procesoru, co zpracovává signál z hlaviček ve skutečném HDD.

Možná by tu někdo dokázal rozpracovat takový algoritmus...


Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 19:03 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 558
Bydliště: Most, Praha
Has thanked: 167 times
Been thanked: 147 times
Brát za průchod nulou střed mezi špičkami vypadá být dobrá metoda. Jen v bufferu rozlišit kdy se mění křivka na opačný směr, aby se vyhodnotila jen 1 hrana - tedy jen sledovat znaménko rozdílu sousedních vzorků. Tj.:
- hledám maximum
- rozdíl je negativní?
- uchovám maximum a jeho čas
- hledám minimum
- rozdíl je pozitivní?
- uchovám minimum a jeho čas
- z rozdílu minima a maxima interpoluji přesný čas středu mezi nimi, to je 1 hrana signálu
Rozdíl vzorků na hraně považovat za platný jen pokud dosáhne nějaké minimální hodnoty, aby se tím odfiltrovaly malé šumy. Na hledání minima a maxima signálu není potřeba kruhový buffer, jen si uchovávat dosaženou nejlepší nalezenou hodnotu hranice a její čas.


Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 19:23 
Offline
Kecálek

Registrován: 24 pro 2014, 16:11
Příspěvky: 202
Has thanked: 7 times
Been thanked: 28 times
Panda38 píše:
Rozdíl vzorků na hraně považovat za platný jen pokud dosáhne nějaké minimální hodnoty, aby se tím odfiltrovaly malé šumy. Na hledání minima a maxima signálu není potřeba kruhový buffer, jen si uchovávat dosaženou nejlepší nalezenou hodnotu hranice a její čas.


To rozhodně, Za hranami to zakmitává dost často.


Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 19:25 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 558
Bydliště: Most, Praha
Has thanked: 167 times
Been thanked: 147 times
I u mgf záznamu? Tam jsou oříznuté výšky a je z toho skoro sinusovka, tam by to nemělo moc zakmitávat, nebo jo?


Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 20:25 
Offline
Kecálek

Registrován: 07 kvě 2014, 12:10
Příspěvky: 134
Bydliště: Jbc
Has thanked: 0 time
Been thanked: 26 times
Kdysi jsem resil prijem signalu z telefonni linky. Resenim bylo pocitat korelaci daneho mista s idealnim vzorkem pro 0 a 1. Vysledkem je ten stav, ktery dava vetsi hodnotu korelace - tedy miru podobnosti.
Dale se jeste resi casova synchronizace: kdyz uz vim, jake je hodnota bitu, udelam jeste dve korelace se signalem posunutym o neco (staci neco jako 1/10 periody rychlejsiho prubehu) dopredu a dozadu. Ted vezmu tu nejlepsi hodnotu ze tri korelaci. Pokud to je posunuta korelace, provedu korekci zacatku bitu a pokracuji na dalsi vzorek.

Stejnou metodu jsem nedavno aplikoval take na prijimac DCF. Ten mel rovnou digitalni vystup, takze to bylo jen porovnani nekolika binarnich masek a spocitani rozdilnych bitu. Pokud by se WAV po nacteni do pameti prevedl na binarni signal, tak by to slo vyhodnotit timto jednodussim zpusobem.


Nahoru
 Profil  
 
PříspěvekNapsal: 28 led 2019, 20:28 
Offline
Kecálek

Registrován: 24 pro 2014, 16:11
Příspěvky: 202
Has thanked: 7 times
Been thanked: 28 times
To zní zajímavě


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 22 ]  Přejít na stránku Předchozí  1, 2

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz