Ez matematikailag hogyan/mivel lehetne megoldható? [függvény visszakeresése mintavételi pontokból]
Tegyük fel, van egy periodikus, vagy erősen periodikus-szerű [pl.: cos(2*x)*3*e^(-x^2/240) | x>=0] hullámforma, amiről adott (elfogadható) sűrűséggel van nekem egy digitális mintavételezésem. Pl. -127 és +127 közötti egészes felbontással - magyarán 256 féle diszkrét értéken vannak ábrázolva a mintavételezés pontjai.
Amit szeretnék elérni, hogy a mintavételezett pontokból számolva legyen egy közelítő függvényem, ami esetén elég magát a függvény algebrai hozzárendelési szabályát eltárolnom, és abból az egy egyváltozós képletből az idő (mint változó) függvényében minden egyes mintavételi pontot újra tudok számolni.
Valami ilyesmi formában:
> Adott: f-függvény, a hozzárendelési szabály algebrai formája;
> Időtartomány felbontása: {t[1], t[2], t[3], ..., t[n]};
> Mintavételi pontok száma: n;
> Mintavételi pontosság: t[i+1] - t[i] | 0<i<(n-1) | i C N;
> Mintavételi pontok előállítása/számítása (minden esetben): y[i] = f(t[i]); y[i] :: i-edik mintavételi pont; t[i] :: i-edik időtartomány (az értelmezési tartomány i-edik felbontása)
Remélem érthető, hogy mire gondoltam.
Természetesen kisebb hibaeltérések elfogadhatók, de a minél elfogadhatóbb közelítési_pontosság/formula_kompaktság arány elérése a cél. (magyarán a függvény felírása se legyen irdatlan hosszú (pl. egy fél A4-es oldalnál több))
A függvényben benne lehetnek a legismertebb műveletek (szorzás, hatványozás, stb.) elemi függvények (szöggfüggvények, exp-függvények, logaritmus, előjel, inverzek, ect.), v. összegsor, produktum, esetleg integrált v. derivált, ha nagyon szükséges, de legjobb lenne mindig olyan, aminek a számolása számítógéppel algoritmizálható.
Példaként feltöltöttem egy apró illusztrációt is, hogy kb. mire gondoltam: [link]
A képen a felső sávban van pl. az, ami a digitalizált hullámjel. Sűrű mintavételezésnél szabad szemmel látszik is, hogy hogyan lehetne görbével összekötni az egyes pontokat, ami egy folytonos függvényt adna. Ez a folytonos függvény a második sávban van szemléltetve. Amit én valahogy vissza szeretnék keresni - aránylag tűrhető pontossággal - az magát a grafikont előállító egyváltozós függvény. Így a továbbiakban kizárólag a függvénnyel újra tudom generálni a mintavételi pontokat.
Huhh… Szerintem amire neked szükséged van az egy Fourier-transzformáció, pontosabban egy diszkrét Fourier-transzformáció.
De ne nagyon kérdezz tőlem matematikai mélységekben, nagyon régen tanultam ilyet, akkor sem voltam 100%-ig biztos a dolgomban, azóta viszont sokat felejtettem. :-)
De ez egy mód arra, hogy véges sok mintavételezési pont ismeretében generálj egy olyan függvényt, ami – a kívánt pontossággal – illeszkedik a mintavételi pontokra. Persze itt egy végtelen szummáról van szó, így ritkán lesz ebből egy A4-es papírra felírható hosszúságú képlet, de kellő elhanyagolással elérhető egy kívánt hosszúságú függvény.
Tulajdonképpen az MP3 tömörítés is erre az elvre épít, ahogy ott is, itt is az van, hogy a képletet sok paraméter határozza meg, minél többet hanyagolsz el, annál pontatlanabbul illeszkedik a függvényed a mintavételi pontokra, viszont annál kevesebb adatot jelent ezen paraméterek leírása. Minél pontosabb az illeszkedés, annál több paramétert kell bevonni a képletbe.
Nagyon sok változós egyenletrendszert kéne megoldanod ahhoz, hogy erre az adatsorra egy függvényt illessz. Ha tényleg periodikus (vagy ha akár nem is az), akkor általánosan az
y=A1*sin(ot)+A2*sin(2ot)+A3*sin(3ot)+... végtelen függvénysorral próbálkoznék. A feladat az A1,A2... és az o (omega) meghatározása.
Ha nem követeled meg, hogy mind a 256 pont illeszkedjen, mert nem akarsz ilyen sok paramétert, akkor valami legkisebb négyzetek módszerét lehetne elővenni. A végeredmény és a számítás is mindenképpen nagyon bonyolult lenne, szóval nem sokat érnél vele. A gép sokkal lassabban számolná ki a függvényből az értékeket, mintha egy tömbből kikeresné a legközelebbit, és a különbséget lineárisan illesztené.
Ha mégis csökkenteni akarod ezt a kikeresési időt is, akkor meg az a legegyszerűbb, ha egyszerűen csökkented a mintapontok számát. Tehát ebből a 256 pontból kiválasztasz mondjuk 100-at vagy 50-et, vagy 20-at, azok közt pedig lineárisan közelítesz.
Persze lehet, hogy nem ez a célod, de nem írtad le, hogy pontosan mi.
Ha csak a kompaktság, azt nem nagyon tudod jobban csökkenteni a fenti módszernél. Ha nem magukat az adatokat tárolod, akkor a függvény paramétereit kell.
Magát az egész függvényt lehetne tárolni, mintavételi pontokat viszont kb. semmiképp.
Ez a szinuszokra való bontás lehet, hogy megfontolandó... Viszont akkor ez valójában hogyan is történne?
Mert ugye ami 100%, hogy mindig csak mintavételi pontjaim vannak, függvényformula az nincs, max. ha azt valahogy visszakeresem a mintavételi pontokból!!!
Amúgy konkrétan, amit szeretnék megcsinálni, az egy kezdetleges szoftveres csembaló szintetizátor; és itt a hangképzést úgy szeretném megoldani, hogy először egy hangmintát periodikus-szerű blokkokra bontsak (pl. húr érintése, megpengetés effektje, csengés, húr elengedése), azokra közelítő függvényt írjak fel, majd a programban csak ezeket a közelítő függvényeket tárolom, ezekkel számoltatom ki a hangmintát, és azt küldöm ki a hangkártyára.
Függvénnyel való felírási mód azért is lenne jó, mert akkor nem kell mindegyik félhanghoz egyesével hangmintákat tároljak, hanem az időváltozó szorzásával/osztásával tudom a hangmagasságot is imitálni.
Váááá!! Hát most látom, az Audacity tud olyat fájlbaexportálással, amire nekem itt szükségem van!! :D
Csúcs!
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!