desc:FIR Demo in_pin:input out_pin:L out_pin:R @init filtlen=25; filtinbuf=0; // size filtlen filtoutbuf=filtinbuf+filtlen; // size filtlen filtb=filtoutbuf+filtlen; // size filtlen memset(filtinbuf, 0, filtlen); memset(filtoutbuf, 0, filtlen); filtidx=0; // srate 44100 upsampled 1X 25-order 0.5442176870748299Hz, 0.1360544217687075Hz-width linear phase FIR lowpass // e.g. at 44.1k that's a 13kHz cutoff with 3kHz transition filtb[0] = 0.0091963860038402379937227948403233313001692295074462890625000000000000000000000000000000000000000000; filtb[1] = -0.0005273944578769450578989430589160747331334277987480163574218750000000000000000000000000000000000000; filtb[2] = -0.0158207382460329240569940623117872746661305427551269531250000000000000000000000000000000000000000000; filtb[3] = 0.0064986359775633835422770090417543542571365833282470703125000000000000000000000000000000000000000000; filtb[4] = 0.0234734319608064789797197136067552492022514343261718750000000000000000000000000000000000000000000000; filtb[5] = -0.0186748638570902840416732004769073682837188243865966796875000000000000000000000000000000000000000000; filtb[6] = -0.0311832449255542779043004486538848141208291053771972656250000000000000000000000000000000000000000000; filtb[7] = 0.0416596341228940431067329086545214522629976272583007812500000000000000000000000000000000000000000000; filtb[8] = 0.0378134743105224477299763918836106313392519950866699218750000000000000000000000000000000000000000000; filtb[9] = -0.0912224930616892942802920174472092185169458389282226562500000000000000000000000000000000000000000000; filtb[10] = -0.0422995827078950017985370379847154254093766212463378906250000000000000000000000000000000000000000000; filtb[11] = 0.3110192063217576130540464873774908483028411865234375000000000000000000000000000000000000000000000000; filtb[12] = 0.5401350971175091775222654177923686802387237548828125000000000000000000000000000000000000000000000000; filtb[13] = 0.3110192063217576130540464873774908483028411865234375000000000000000000000000000000000000000000000000; filtb[14] = -0.0422995827078950017985370379847154254093766212463378906250000000000000000000000000000000000000000000; filtb[15] = -0.0912224930616892942802920174472092185169458389282226562500000000000000000000000000000000000000000000; filtb[16] = 0.0378134743105224477299763918836106313392519950866699218750000000000000000000000000000000000000000000; filtb[17] = 0.0416596341228940431067329086545214522629976272583007812500000000000000000000000000000000000000000000; filtb[18] = -0.0311832449255542779043004486538848141208291053771972656250000000000000000000000000000000000000000000; filtb[19] = -0.0186748638570902840416732004769073682837188243865966796875000000000000000000000000000000000000000000; filtb[20] = 0.0234734319608064789797197136067552492022514343261718750000000000000000000000000000000000000000000000; filtb[21] = 0.0064986359775633835422770090417543542571365833282470703125000000000000000000000000000000000000000000; filtb[22] = -0.0158207382460329240569940623117872746661305427551269531250000000000000000000000000000000000000000000; filtb[23] = -0.0005273944578769450578989430589160747331334277987480163574218750000000000000000000000000000000000000; filtb[24] = 0.0091963860038402379937227948403233313001692295074462890625000000000000000000000000000000000000000000; @sample // fir newx=spl0; newy=newx*filtb[0]; loopidx=0; loop(filtlen-1, newy += filtinbuf[(filtidx+loopidx)%filtlen]*filtb[loopidx+1]; loopidx+=1; ); filtidx-=1; filtidx<0?filtidx=filtlen-1; filtinbuf[filtidx]=newx; spl0=newy; spl1=newy;