Csináltam egy digitális visszhangosító cuccot elektromos gitárhoz dsPIC30F3014-gyel, de egy kis problémába ütköztem. Az lenne a feladat, hogy pl. 20kHz-el mintát veszek a gitárjelből, ezt RAM-ban tárolom, aztán pedig hozzáadom a mostani érékhez egy régebbi érték n-szeresét (n: 0...1) és kirakom a kimenetre. C-ben írtam az egészet MPLAB C30 fordítóval.
Ezzel nincs is baj amíg a régi jelet egy egésszel (pl 2-vel) osztom és azt adom hozzá a mostanihoz, így működik is. Ha azonban egy float-tal akarok szorozni (pl 0.8), akkor meghal az egész mert nincs ideje kiszámolni. Kicsit utánajártam ennek a szorzás dolognak és kiderült, hogy az MPLAB szimulátor szerint 1998, igazi mérés alapján pedig kb 500 db utasítás alatt fejeződik be egy ilyen szorzás. Ezt pedig elég soknak tartom. A fordítóban az optimalizálás a leggyorsabbra van állítva, de így is nagyon lassú.
Van valakinek ötlete, hogy miért ilyen lassú a szorzás?
Nem önmagában a szorzás a lassú, hanem a float típusú számok kezelése. Ugye először a minta egész szám, ebből kell float-ot csinálni, majd két float típust összeszorozni, és utána float-ot visszaalakítani egésszé, hogy a kimenetre kirakhasd. Nem tudnád az egészet egész számokra visszavezetni? A gitárjelből vett minta ugye eleve egész számú érték. Ha ezt 0..1 közötti valós szám helyett 0..255 közötti egész számmal szoroznád, az csak néhány utasítást jelent, és nem veszítenél el vele semmit, csak a szorzás eredményének a felső bájtját kellene használni a továbbiakban. Én ebbe az irányba mennék a helyedben.
Jó ötlet, megpróbálom ezt megcsinálni. Igazából azért akartam float-tal szorozni, hogy menet közben egy potival be lehessen állítani hogy mennyi visszhang jöjjön vissza.
Azt gondoltam én is hogy float kezelés miatt van valami de szerintem akkor is sok az 500 utasítás egy 16bites dsPIC-től...
Átalakítottam egész számokra. Kipróbáltam, a gitárjel kb 500 és -500 között mozog, így még 64-gyel tudok szorozni meg osztani hogy még beleférjen az int típusba. 64 állás meg bőven elég egy potihoz. Köszönöm a segítséget, nekem ez eszembe nem jutott volna!
Engem nagyon érdekelne ez a project!
Ha úgy döntesz, hogy publikálod, én nagyon kíváncsi lennék rá!
Esetleg a későbbiekben talán összekapcsolható lenne ezzel: Midi lábkapcsoló
Mondjuk van egy olyan tippem, hogy az egészet meg lehetne csinálni egy jóval olcsóbb és egyszerűbb 8 bites AVR-rel (pl. ATmega8). Azért vettem dsPIC-et mert ebben van 12 bites A/D konverter, ami viszonylag jó minőséget produkál. Viszont a RAM és a DAC SPI porton megy, és még csak számolni se kell sokat, szóval szerintem menne AVR-rel is. Kell nagy órajel hogy elég gyors legyen az ADC, a DAC és a RAM-ok, aztán a többi már szinte mindegy. Mi a véleményetek?
Egész számok szorzása, osztása nem szabad, hogy probléma legyen egy DSPIC kontrollernek! Ráadásul erre találták ki. De azt kell, hogy mondjam, hogy ezt a feladatot, - ha kettő hatványaival osztanál (SHL, SHR)- a 16F sorozat is könnyen venné.
A RAM kezelés a DMA miatt, a codec, avagy a DAC kezeléséhez (sőt van olyan amibe be van építve) miatt meg végképp az egyik legjobb választás lenne a DSPic.
Ebben igazad van, de ahogy írtam, soros (SPI-os) RAM-ot és DAC-ot használok, szóval gyakorlatilag teljesen mindegy a kontroller típusa. Az a lényeg hogy gyors legyen az SPI.
dsPIC-ek AD-jával lehet közvetlenül fractalban mintavézelezni, és akkor így gyorsabban tudsz szorzásokat is végezni. Fractional-al szorzod meg. És ezt egy óra jel alatt eltudják végezni.