( bzt | 2023. 09. 07., cs – 16:00 )

> Olyat, ami a generált/konvertált hangfájlokra stabil, vagy olyat, ami esélyesen jó régi magnófelvételeken is. E kettő nem zárja ki egymást. A mostani változat is stabil a konvertált hangfájlokra, szóval ezügyben nem kell tenni semmit. Szerintem a legjobb az, ami egy minimális heurisztikát tartalmaz, így jó eséllyel működni fog régi felvételekre is, de továbbra is kezeli a konvertált fájlokat. Legalábbis emulátor felhasználói szemszögből ez a legcélszerűbb (konvertált most is jó, legyen jó egy átlagos régi felvételre is, de túlbonyolítani, hogy extrém hangfájlokra is működjön nem kell). SZVSZ. > Így hirtelen azt nem látom pontosan, hogy hogyan lehet a bejövő adathalmazból a két várható értéket megmondani, anélkül persze, hogy előre tudom, hogy az egyik 0 körül van, a másik meg 1 körül, de biztos vannak erre jó matematikai módszerek. Pontosan úgy, ahogy írtam. 1. A float-ot át kell skálázni bájtra (mivel a float-nak túl sok lehetséges értéke van, a bájtnak meg csak 256). 2. Ezután össze kell gyűjteni egy a tömbbe, melyik minta hányszor fordul elő. 3. Mivel ahogy írtad, a legtöbb minta a 0-ás jelszint és az 1-es jelszint körül csoportosul (igen, ez egy feltételezés, de olyan, amire digitális jeleket tartalmazó hangfájlok esetén nyugodtan támaszkodhatunk), azért ennek a gyakoriságtömbnek a grafikonja tutira így fog kinézni:
előfordulás
  ^
  |
  |   /\
  |   ||      /\
  |   ||      ||
  |   | \__/\/ |
  |__/          \__
--+--------------------> mintaértékek
  |
4. Ebben a gyakoriságtömbben kell megkeresni a legelső és a legutolsó lokális maximumot (azért így, hogyha esetleg a zaj miatt három vagy mégtöbb csúcs is kialakulna, azok ne zavarjanak be). 5. Ezt a két lokális maximumot kell visszaskálázni floattá, és pont az lesz az általad keresett két érték. Ennek a két értéknek az átlagánál vágni pont ugyanaz, mint azt nézni, melyikhez esik közelebb az adott minta. "abs(top - sample) <= abs(bottom - sample)" === "sample > (top - bottom) / 2". De ez szerintem már bőven overkill, a legutóbbi kódom, ami a minimum és maximum átlagánál vág tökéletesen működött minden általatok linkelt hangfájlra (persze nem 100%-os megoldás, csupán csak minden eddigi mintára jól működő). De ha szeretnéd, nyugodtan berakhatod ezt a fenti algoritmust is a tape.js-be (elég könnyű lekódolni, és a emulátor többi részétől teljesen független, szóval nem para). Ld. https://www.statisticshowto.com/local-maximum/ (Behúzhatsz vagy implementálhatsz egy derivált-függvénykönyvtárat is, de szerintem hulla felesleges. Én kiváltanám egy kevésbé pontos, de jóval egyszerűbb megoldással: ciklus amíg a gyakoriság[i] <= gyakoriság[i + 1] - hiba. Azaz azt nézném, hogy hol esik először a grafikon, a hibát pedig a legnagyobb előforduló gyakoriság alapján határoznám meg. A legutolsó csúcs keresése tök ugyanez, csak tükrözve, a gyakoriság tömb végéről mennék a ciklussal.)