matlab besself函数 C实现

继上一篇matlab ellip函数 C实现

这一篇实现besself(贝塞尔)

bessel滤波器属于模拟滤波器

直接上代码:

void bessel(int n, double Wn[], int type, double *ab, double *bb)
{
    double fs = 2;
    double u[2] = {0.0, 0.0};
    // step 1: get analog, pre-warped frequencies
    u[0] = Wn[0];

    if (type == 3 || type == 4)
    {
        u[1] = Wn[1];
    }

    // step 2: convert to low-pass prototype estimate
    double Bw = 0.0;
    if (type == 1 || type == 2)
    {
        Wn = u;
    }
    else if (type == 3 || type == 4)
    {
        Bw = u[1] - u[0];
        Wn[0] = sqrt(u[0] * u[1]); // center frequency
        Wn[1] = 0.0;
    }

    // step 3: Get N-th order Butterworth analog lowpass prototype
    int nz = 0;
    Complex *z = (Complex *)malloc(0 * sizeof(Complex));
    Complex *p = (Complex *)malloc(n * sizeof(Complex));
    double k = 0;
    besselap(n, p, &k);

    // Transform to state-space
    int a_size = n;
    double *a = (double *)malloc(sizeof(double) * n * n);
    double *b = (double *)malloc(sizeof(double) * n);
    double *c = (double *)malloc(sizeof(double) * n);
    double d;

    zp2ss(z, p, nz, n, k, a, b, c, &d);

    switch (type)
    {
    default:
    case 1: // Lowpass
        lp2lp(n, a, b, Wn[0]);
        break;
    case 2: // highpass
        lp2hp(n, a, b, c, &d, Wn[0]);
        break;
    case 3: // Bandpass
        lp2bp(n, &a, &b, &c, &d, Wn[0], Bw);
        a_size = 2 * n;
        break;
    case 4: // Bandstop
        lp2bs(n, &a, &b, &c, &d, Wn[0], Bw);
        a_size = 2 * n;
        break;
    }

    Complex *p1 = (Complex *)malloc(sizeof(Complex) * a_size);

    Complex *z1 = (Complex *)malloc(sizeof(Complex) * 0);
    ss2zp(a, b, c, &d, a_size, z1, p1, &k); 

    Complex *tempa = (Complex *)malloc(sizeof(Complex) * (a_size + 1));
    Complex *tempb = (Complex *)malloc(sizeof(Complex) * (a_size + 1));

    complex_poly(p1, a_size, tempa);
    complex_poly(z1, a_size, tempb);

    for (size_t i = 0; i < a_size + 1; i++)
    {
        ab[i] = tempa[i].real;
        bb[i] = 0;
    }

    bb[a_size] = k;

    free(a);
    free(b);
    free(z);
    free(p);
    free(p1);
    free(tempa);
    free(tempb);
}

其中besselap按照matlab函数实现来看是直接把系数罗列出来,且只支持25阶及以下(有兴趣的小小伙伴可以研究下):

void besselap(int n, Complex *p, double *k)
{
    *k = 1;
    switch (n)
    {
    case 1:
        p[0] = create(-1.0, 0.0);
        break;
    case 2:
        p[0] = create(-0.8660254037844386467637229, 0.4999999999999999999999996);
        p[1] = create(-0.8660254037844386467637229, -0.4999999999999999999999996);
        break;
    case 3:
        p[0] = create(-0.9416000265332067855971980, 0.0);
        p[1] = create(-0.7456403858480766441810907, -0.7113666249728352680992154);
        p[2] = create(-0.7456403858480766441810907, 0.7113666249728352680992154);
        break;
    case 4:
        p[0] = create(-0.6572111716718829545787781, -0.8301614350048733772399715);
        p[1] = create(-0.6572111716718829545787781, 0.8301614350048733772399715);
        p[2] = create(-0.9047587967882449459642637, 0.2709187330038746636700923);
        p[3] = create(-0.9047587967882449459642637, 0.2709187330038746636700923);
        break;
    case 5:
        p[0] = create(-0.9264420773877602247196260, 0.0);
        p[1] = create(-0.8515536193688395541722677, -0.4427174639443327209850002);
        p[2] = create(-0.8515536193688395541722677, 0.4427174639443327209850002);
        p[3] = create(-0.5905759446119191779319432, -0.9072067564574549539291747);
        p[4] = create(-0.5905759446119191779319432, 0.9072067564574549539291747);
        break;
    case 6:
        p[0] = create(-0.9093906830472271808050953, -0.1856964396793046769246397);
        p[1] = create(-0.9093906830472271808050953, 0.1856964396793046769246397);
        p[2] = create(-0.7996541858328288520243325, -0.5621717346937317988594118);
        p[3] = create(-0.7996541858328288520243325, 0.5621717346937317988594118);
        p[4] = create(-0.5385526816693109683073792, -0.9616876881954277199245657);
        p[5] = create(-0.5385526816693109683073792, 0.9616876881954277199245657);
        break;
    case 7:
        p[0] = create(-0.9194871556490290014311619, 0.0);
        p[1] = create(-0.8800029341523374639772340, -0.3216652762307739398381830);
        p[2] = create(-0.8800029341523374639772340, 0.3216652762307739398381830);
        p[3] = create(-0.7527355434093214462291616, -0.6504696305522550699212995);
        p[4] = create(-0.7527355434093214462291616, 0.6504696305522550699212995);
        p[5] = create(-0.4966917256672316755024763, -1.002508508454420401230220);
        p[6] = create(-0.4966917256672316755024763, 1.002508508454420401230220);
        break;
    case 8:
        p[0] = create(-0.9096831546652910216327629, -0.1412437976671422927888150);
        p[1] = create(-0.9096831546652910216327629, 0.1412437976671422927888150);
        p[2] = create(-0.8473250802359334320103023, -0.4259017538272934994996429);
        p[3] = create(-0.8473250802359334320103023, 0.4259017538272934994996429);
        p[4] = create(-0.7111381808485399250796172, -0.7186517314108401705762571);
        p[5] = create(-0.7111381808485399250796172, 0.7186517314108401705762571);
        p[6] = create(-0.4621740412532122027072175, -1.034388681126901058116589);
        p[7] = create(-0.4621740412532122027072175, 1.034388681126901058116589);
        break;
    case 9:
        p[0] = create(-0.9154957797499037686769223, 0);
        p[1] = create(-0.8911217017079759323183848, -0.2526580934582164192308115);
        p[2] = create(-0.8911217017079759323183848, 0.2526580934582164192308115);
        p[3] = create(-0.8148021112269012975514135, -0.5085815689631499483745341);
        p[4] = create(-0.8148021112269012975514135, 0.5085815689631499483745341);
        p[5] = create(-0.6743622686854761980403401, -0.7730546212691183706919682);
        p[6] = create(-0.6743622686854761980403401, 0.7730546212691183706919682);
        p[7] = create(-0.4331415561553618854685942, -1.060073670135929666774323);
        p[8] = create(-0.4331415561553618854685942, 1.060073670135929666774323);
        break;
    case 10:
        p[0] = create(-0.9091347320900502436826431, -0.1139583137335511169927714);
        p[1] = create(-0.9091347320900502436826431, 0.1139583137335511169927714);
        p[2] = create(-0.8688459641284764527921864, -0.3430008233766309973110589);
        p[3] = create(-0.8688459641284764527921864, 0.3430008233766309973110589);
        p[4] = create(-0.7837694413101441082655890, -0.5759147538499947070009852);
        p[5] = create(-0.7837694413101441082655890, 0.5759147538499947070009852);
        p[6] = create(-0.6417513866988316136190854, -0.8175836167191017226233947);
        p[7] = create(-0.6417513866988316136190854, 0.8175836167191017226233947);
        p[8] = create(-0.4083220732868861566219785, -1.081274842819124562037210);
        p[9] = create(-0.4083220732868861566219785, 1.081274842819124562037210);
        break;
    case 11:
        p[0] = create(-0.9129067244518981934637318, 0);
        p[1] = create(-0.8963656705721166099815744, -0.2080480375071031919692341);
        p[2] = create(-0.8963656705721166099815744, 0.2080480375071031919692341);
        p[3] = create(-0.8453044014712962954184557, -0.4178696917801248292797448);
        p[4] = create(-0.8453044014712962954184557, 0.4178696917801248292797448);
        p[5] = create(-0.7546938934722303128102142, -0.6319150050721846494520941);
        p[6] = create(-0.7546938934722303128102142, 0.6319150050721846494520941);
        p[7] = create(-0.6126871554915194054182909, -0.8547813893314764631518509);
        p[8] = create(-0.6126871554915194054182909, 0.8547813893314764631518509);
        p[9] = create(-0.3868149510055090879155425, -1.099117466763120928733632);
        p[10] = create(-0.3868149510055090879155425, 1.099117466763120928733632);
        break;
    case 12:
        p[0] = create(-0.9084478234140682638817772, -9.5506365213450398415258360e-27);
        p[1] = create(-0.9084478234140682638817772, 9.5506365213450398415258360e-27);
        p[2] = create(-0.8802534342016826507901575, -0.2871779503524226723615457);
        p[3] = create(-0.8802534342016826507901575, 0.2871779503524226723615457);
        p[4] = create(-0.8217296939939077285792834, -0.4810212115100676440620548);
        p[5] = create(-0.8217296939939077285792834, 0.4810212115100676440620548);
        p[6] = create(-0.7276681615395159454547013, -0.6792961178764694160048987);
        p[7] = create(-0.7276681615395159454547013, 0.6792961178764694160048987);
        p[8] = create(-0.5866369321861477207528215, -0.8863772751320727026622149);
        p[9] = create(-0.5866369321861477207528215, 0.8863772751320727026622149);
        p[10] = create(-0.3679640085526312839425808, -1.114373575641546257595657);
        p[11] = create(-0.3679640085526312839425808, 1.114373575641546257595657);
        break;
    case 13:
        p[0] = create(-0.9110914665984182781070663, 0);
        p[1] = create(-0.8991314665475196220910718, -0.1768342956161043620980863);
        p[2] = create(-0.8991314665475196220910718, 0.1768342956161043620980863);
        p[3] = create(-0.8625094198260548711573628, -0.3547413731172988997754038);
        p[4] = create(-0.8625094198260548711573628, 0.3547413731172988997754038);
        p[5] = create(-0.7987460692470972510394686, -0.5350752120696801938272504);
        p[6] = create(-0.7987460692470972510394686, 0.5350752120696801938272504);
        p[7] = create(-0.7026234675721275653944062, -0.7199611890171304131266374);
        p[8] = create(-0.7026234675721275653944062, 0.7199611890171304131266374);
        p[9] = create(-0.5631559842430199266325818, -0.9135900338325109684927731);
        p[10] = create(-0.5631559842430199266325818, 0.9135900338325109684927731);
        p[11] = create(-0.3512792323389821669401925, -1.127591548317705678613239);
        p[12] = create(-0.3512792323389821669401925, 1.127591548317705678613239);
        break;
    case 14:
        p[0] = create(-0.9077932138396487614720659, -8.2196399419401501888968130e-26);
        p[1] = create(-0.9077932138396487614720659, 8.2196399419401501888968130e-26);
        p[2] = create(-0.8869506674916445312089167, -0.2470079178765333183201435);
        p[3] = create(-0.8869506674916445312089167, 0.2470079178765333183201435);
        p[4] = create(-0.8441199160909851197897667, -0.4131653825102692595237260);
        p[5] = create(-0.8441199160909851197897667, 0.4131653825102692595237260);
        p[6] = create(-0.7766591387063623897344648, -0.5819170677377608590492434);
        p[7] = create(-0.7766591387063623897344648, 0.5819170677377608590492434);
        p[8] = create(-0.6794256425119233117869491, -0.7552857305042033418417492);
        p[9] = create(-0.6794256425119233117869491, 0.7552857305042033418417492);
        p[10] = create(-0.5418766775112297376541293, -0.9373043683516919569183099);
        p[11] = create(-0.5418766775112297376541293, 0.9373043683516919569183099);
        p[12] = create(-0.3363868224902037330610040, -1.139172297839859991370924);
        p[13] = create(-0.3363868224902037330610040, 1.139172297839859991370924);
        break;
    case 15:
        p[0] = create(-0.9097482363849064167228581, 0);
        p[1] = create(-0.9006981694176978324932918, -0.1537681197278439351298882);
        p[2] = create(-0.9006981694176978324932918, 0.1537681197278439351298882);
        p[3] = create(-0.8731264620834984978337843, -0.3082352470564267657715883);
        p[4] = create(-0.8731264620834984978337843, 0.3082352470564267657715883);
        p[5] = create(-0.8256631452587146506294553, -0.4642348752734325631275134);
        p[6] = create(-0.8256631452587146506294553, 0.4642348752734325631275134);
        p[7] = create(-0.7556027168970728127850416, -0.6229396358758267198938604);
        p[8] = create(-0.7556027168970728127850416, 0.6229396358758267198938604);
        p[9] = create(-0.6579196593110998676999362, -0.7862895503722515897065645);
        p[10] = create(-0.6579196593110998676999362, 0.7862895503722515897065645);
        p[11] = create(-0.5224954069658330616875186, -0.9581787261092526478889345);
        p[12] = create(-0.5224954069658330616875186, 0.9581787261092526478889345);
        p[13] = create(-0.3229963059766444287113517, -1.149416154583629539665297);
        p[14] = create(-0.3229963059766444287113517, 1.149416154583629539665297);
        break;
    case 16:
        p[0] = create(-0.9072099595087001356491337, -7.214211304111732602882395e-26);
        p[1] = create(-0.9072099595087001356491337, 7.214211304111732602882395e-26);
        p[2] = create(-0.8911723070323647674780132, -0.2167089659900576449410059);
        p[3] = create(-0.8911723070323647674780132, 0.2167089659900576449410059);
        p[4] = create(-0.8584264231521330481755780, -0.3621697271802065647661080);
        p[5] = create(-0.8584264231521330481755780, 0.3621697271802065647661080);
        p[6] = create(-0.8074790293236003885306146, -0.5092933751171800179676218);
        p[7] = create(-0.8074790293236003885306146, 0.5092933751171800179676218);
        p[8] = create(-0.7356166304713115980927279, -0.6591950877860393745845254);
        p[9] = create(-0.7356166304713115980927279, 0.6591950877860393745845254);
        p[10] = create(-0.6379502514039066715773828, -0.8137453537108761895522580);
        p[11] = create(-0.6379502514039066715773828, 0.8137453537108761895522580);
        p[12] = create(-0.5047606444424766743309967, -0.9767137477799090692947061);
        p[13] = create(-0.5047606444424766743309967, 0.9767137477799090692947061);
        p[14] = create(-0.3108782755645387813283867, -1.158552841199330479412225);
        p[15] = create(-0.3108782755645387813283867, 1.158552841199330479412225);
        break;
    case 17:
        p[0] = create(0.0, -0.9087141161336397432860029);
        p[1] = create(-0.9016273850787285964692844, -0.1360267995173024591237303);
        p[2] = create(-0.9016273850787285964692844, 0.1360267995173024591237303);
        p[3] = create(-0.8801100704438627158492165, -0.2725347156478803885651973);
        p[4] = create(-0.8801100704438627158492165, 0.2725347156478803885651973);
        p[5] = create(-0.8433414495836129204455491, -0.4100759282910021624185986);
        p[6] = create(-0.8433414495836129204455491, 0.4100759282910021624185986);
        p[7] = create(-0.7897644147799708220288138, -0.5493724405281088674296232);
        p[8] = create(-0.7897644147799708220288138, 0.5493724405281088674296232);
        p[9] = create(-0.7166893842372349049842743, -0.6914936286393609433305754);
        p[10] = create(-0.7166893842372349049842743, 0.6914936286393609433305754);
        p[11] = create(-0.6193710717342144521602448, -0.8382497252826992979368621);
        p[12] = create(-0.6193710717342144521602448, 0.8382497252826992979368621);
        p[13] = create(-0.4884629337672704194973683, -0.9932971956316781632345466);
        p[14] = create(-0.4884629337672704194973683, 0.9932971956316781632345466);
        p[15] = create(-0.2998489459990082015466971, -1.166761272925668786676672);
        p[16] = create(-0.2998489459990082015466971, 1.166761272925668786676672);
        break;
    case 18:
        p[0] = create(-0.9067004324162775554189031, -6.427924106393069383936068e-25);
        p[1] = create(-0.9067004324162775554189031, 6.427924106393069383936068e-25);
        p[2] = create(-0.8939764278132455733032155, -0.1930374640894758606940586);
        p[3] = create(-0.8939764278132455733032155, 0.1930374640894758606940586);
        p[4] = create(-0.8681095503628830078317207, -0.3224204925163257604931634);
        p[5] = create(-0.8681095503628830078317207, 0.3224204925163257604931634);
        p[6] = create(-0.8281885016242836608829018, -0.4529385697815916950149364);
        p[7] = create(-0.8281885016242836608829018, 0.4529385697815916950149364);
        p[8] = create(-0.7726285030739558780127746, -0.5852778162086640620016316);
        p[9] = create(-0.7726285030739558780127746, 0.5852778162086640620016316);
        p[10] = create(-0.6987821445005273020051878, -0.7204696509726630531663123);
        p[11] = create(-0.6987821445005273020051878, 0.7204696509726630531663123);
        p[12] = create(-0.6020482668090644386627299, -0.8602708961893664447167418);
        p[13] = create(-0.6020482668090644386627299, 0.8602708961893664447167418);
        p[14] = create(-0.4734268069916151511140032, -1.008234300314801077034158);
        p[15] = create(-0.4734268069916151511140032, 1.008234300314801077034158);
        p[16] = create(-0.2897592029880489845789953, -1.174183010600059128532230);
        p[17] = create(-0.2897592029880489845789953, 1.174183010600059128532230);
        break;
    case 19:
        p[0] = create(-0.9078934217899404528985092, 0.0);
        p[1] = create(-0.9021937639390660668922536, -0.1219568381872026517578164);
        p[2] = create(-0.9021937639390660668922536, 0.1219568381872026517578164);
        p[3] = create(-0.8849290585034385274001112, -0.2442590757549818229026280);
        p[4] = create(-0.8849290585034385274001112, 0.2442590757549818229026280);
        p[5] = create(-0.8555768765618421591093993, -0.3672925896399872304734923);
        p[6] = create(-0.8555768765618421591093993, 0.3672925896399872304734923);
        p[7] = create(-0.8131725551578197705476160, -0.4915365035562459055630005);
        p[8] = create(-0.8131725551578197705476160, 0.4915365035562459055630005);
        p[9] = create(-0.7561260971541629355231897, -0.6176483917970178919174173);
        p[10] = create(-0.7561260971541629355231897, 0.6176483917970178919174173);
        p[11] = create(-0.6818424412912442033411634, -0.7466272357947761283262338);
        p[12] = create(-0.6818424412912442033411634, 0.7466272357947761283262338);
        p[13] = create(-0.5858613321217832644813602, -0.8801817131014566284786759);
        p[14] = create(-0.5858613321217832644813602, 0.8801817131014566284786759);
        p[15] = create(-0.4595043449730988600785456, -1.021768776912671221830298);
        p[16] = create(-0.4595043449730988600785456, 1.021768776912671221830298);
        p[17] = create(-0.2804866851439370027628724, -1.180931628453291873626003);
        p[18] = create(-0.2804866851439370027628724, 1.180931628453291873626003);
        break;
    case 20:
        p[0] = create(-0.9062570115576771146523497, -57961780277849516990208850.0E-27);
        p[1] = create(-0.9062570115576771146523497, 57961780277849516990208850.0E-27);
        p[2] = create(-0.8959150941925768608568248, -0.1740317175918705058595844);
        p[3] = create(-0.8959150941925768608568248, 0.1740317175918705058595844);
        p[4] = create(-0.8749560316673332850673214, -0.2905559296567908031706902);
        p[5] = create(-0.8749560316673332850673214, 0.2905559296567908031706902);
        p[6] = create(-0.8427907479956670633544106, -0.4078917326291934082132821);
        p[7] = create(-0.8427907479956670633544106, 0.4078917326291934082132821);
        p[8] = create(-0.7984251191290606875799876, -0.5264942388817132427317659);
        p[9] = create(-0.7984251191290606875799876, 0.5264942388817132427317659);
        p[10] = create(-0.7402780309646768991232610, -0.6469975237605228320268752);
        p[11] = create(-0.7402780309646768991232610, 0.6469975237605228320268752);
        p[12] = create(-0.6658120544829934193890626, -0.7703721701100763015154510);
        p[13] = create(-0.6658120544829934193890626, 0.7703721701100763015154510);
        p[14] = create(-0.5707026806915714094398061, -0.8982829066468255593407161);
        p[15] = create(-0.5707026806915714094398061, 0.8982829066468255593407161);
        p[16] = create(-0.4465700698205149555701841, -1.034097702560842962315411);
        p[17] = create(-0.4465700698205149555701841, 1.034097702560842962315411);
        p[18] = create(-0.2719299580251652601727704, -1.187099379810885886139638);
        p[19] = create(-0.2719299580251652601727704, 1.187099379810885886139638);
        break;
    case 21:
        p[0] = create(-0.9072262653142957028884077, 0);
        p[1] = create(-0.9025428073192696303995083, -0.1105252572789856480992275);
        p[2] = create(-0.9025428073192696303995083, 0.1105252572789856480992275);
        p[3] = create(-0.8883808106664449854431605, -0.2213069215084350419975358);
        p[4] = create(-0.8883808106664449854431605, 0.2213069215084350419975358);
        p[5] = create(-0.8643915813643204553970169, -0.3326258512522187083009453);
        p[6] = create(-0.8643915813643204553970169, 0.3326258512522187083009453);
        p[7] = create(-0.8299435470674444100273463, -0.4448177739407956609694059);
        p[8] = create(-0.8299435470674444100273463, 0.4448177739407956609694059);
        p[9] = create(-0.7840287980408341576100581, -0.5583186348022854707564856);
        p[10] = create(-0.7840287980408341576100581, 0.5583186348022854707564856);
        p[11] = create(-0.7250839687106612822281339, -0.6737426063024382240549898);
        p[12] = create(-0.7250839687106612822281339, 0.6737426063024382240549898);
        p[13] = create(-0.6506315378609463397807996, -0.7920349342629491368548074);
        p[14] = create(-0.6506315378609463397807996, 0.7920349342629491368548074);
        p[15] = create(-0.5564766488918562465935297, -0.9148198405846724121600860);
        p[16] = create(-0.5564766488918562465935297, 0.9148198405846724121600860);
        p[17] = create(-0.4345168906815271799687308, -1.045382255856986531461592);
        p[18] = create(-0.4345168906815271799687308, 1.045382255856986531461592);
        p[19] = create(-0.2640041595834031147954813, -1.192762031948052470183960);
        p[20] = create(-0.2640041595834031147954813, 1.192762031948052470183960);
        break;
    case 22:
        p[0] = create(-0.9058702269930872551848625, -5.2774908289999045189007100E-27);
        p[1] = create(-0.9058702269930872551848625, 5.2774908289999045189007100E-27);
        p[2] = create(-0.8972983138153530955952835, -0.1584351912289865608659759);
        p[3] = create(-0.8972983138153530955952835, 0.1584351912289865608659759);
        p[4] = create(-0.8799661455640176154025352, -0.2644363039201535049656450);
        p[5] = create(-0.8799661455640176154025352, 0.2644363039201535049656450);
        p[6] = create(-0.8534754036851687233084587, -0.3710389319482319823405321);
        p[7] = create(-0.8534754036851687233084587, 0.3710389319482319823405321);
        p[8] = create(-0.8171682088462720394344996, -0.4785619492202780899653575);
        p[9] = create(-0.8171682088462720394344996, 0.4785619492202780899653575);
        p[10] = create(-0.7700332930556816872932937, -0.5874255426351153211965601);
        p[11] = create(-0.7700332930556816872932937, 0.5874255426351153211965601);
        p[12] = create(-0.7105305456418785989070935, -0.6982266265924524000098548);
        p[13] = create(-0.7105305456418785989070935, 0.6982266265924524000098548);
        p[14] = create(-0.6362427683267827226840153, -0.8118875040246347267248508);
        p[15] = create(-0.6362427683267827226840153, 0.8118875040246347267248508);
        p[16] = create(-0.5430983056306302779658129, -0.9299947824439872998916657);
        p[17] = create(-0.5430983056306302779658129, 0.9299947824439872998916657);
        p[18] = create(-0.4232528745642628461715044, -1.055755605227545931204656);
        p[19] = create(-0.4232528745642628461715044, 1.055755605227545931204656);
        p[20] = create(-0.2566376987939318038016012, -1.197982433555213008346532);
        p[21] = create(-0.2566376987939318038016012, 1.197982433555213008346532);
        break;
    case 23:
        p[0] = create(-0.9066732476324988168207439, 0.0);
        p[1] = create(-0.9027564979912504609412993, -0.1010534335314045013252480);
        p[2] = create(-0.9027564979912504609412993, 0.1010534335314045013252480);
        p[3] = create(-0.8909283242471251458653994, -0.2023024699381223418195228);
        p[4] = create(-0.8909283242471251458653994, 0.2023024699381223418195228);
        p[5] = create(-0.8709469395587416239596874, -0.3039581993950041588888925);
        p[6] = create(-0.8709469395587416239596874, 0.3039581993950041588888925);
        p[7] = create(-0.8423805948021127057054288, -0.4062657948237602726779246);
        p[8] = create(-0.8423805948021127057054288, 0.4062657948237602726779246);
        p[9] = create(-0.8045561642053176205623187, -0.5095305912227258268309528);
        p[10] = create(-0.8045561642053176205623187, 0.5095305912227258268309528);
        p[11] = create(-0.7564660146829880581478138, -0.6141594859476032127216463);
        p[12] = create(-0.7564660146829880581478138, 0.6141594859476032127216463);
        p[13] = create(-0.6965966033912705387505040, -0.7207341374753046970247055);
        p[14] = create(-0.6965966033912705387505040, 0.7207341374753046970247055);
        p[15] = create(-0.6225903228771341778273152, -0.8301558302812980678845563);
        p[16] = create(-0.6225903228771341778273152, 0.8301558302812980678845563);
        p[17] = create(-0.5304922463810191698502226, -0.9439760364018300083750242);
        p[18] = create(-0.5304922463810191698502226, 0.9439760364018300083750242);
        p[19] = create(-0.4126986617510148836149955, -1.065328794475513585531053);
        p[20] = create(-0.4126986617510148836149955, 1.065328794475513585531053);
        p[21] = create(-0.2497697202208956030229911, -1.202813187870697831365338);
        p[22] = create(-0.2497697202208956030229911, 1.202813187870697831365338);
        break;
    case 24:
        p[0] = create(-0.9055312363372773709269407, -48440066540478700874836350.0E-27);
        p[1] = create(-0.9055312363372773709269407, 48440066540478700874836350.0E-27);
        p[2] = create(-0.8983105104397872954053307, -0.1454056133873610120105857);
        p[3] = create(-0.8983105104397872954053307, 0.1454056133873610120105857);
        p[4] = create(-0.8837358034555706623131950, -0.2426335234401383076544239);
        p[5] = create(-0.8837358034555706623131950, 0.2426335234401383076544239);
        p[6] = create(-0.8615278304016353651120610, -0.3403202112618624773397257);
        p[7] = create(-0.8615278304016353651120610, 0.3403202112618624773397257);
        p[8] = create(-0.8312326466813240652679563, -0.4386985933597305434577492);
        p[9] = create(-0.8312326466813240652679563, 0.4386985933597305434577492);
        p[10] = create(-0.7921695462343492518845446, -0.5380628490968016700338001);
        p[11] = create(-0.7921695462343492518845446, 0.5380628490968016700338001);
        p[12] = create(-0.7433392285088529449175873, -0.6388084216222567930378296);
        p[13] = create(-0.7433392285088529449175873, 0.6388084216222567930378296);
        p[14] = create(-0.6832565803536521302816011, -0.7415032695091650806797753);
        p[15] = create(-0.6832565803536521302816011, 0.7415032695091650806797753);
        p[16] = create(-0.6096221567378335562589532, -0.8470292433077202380020454);
        p[17] = create(-0.6096221567378335562589532, 0.8470292433077202380020454);
        p[18] = create(-0.5185914574820317343536707, -0.9569048385259054576937721);
        p[19] = create(-0.5185914574820317343536707, 0.9569048385259054576937721);
        p[20] = create(-0.4027853855197518014786978, -1.074195196518674765143729);
        p[21] = create(-0.4027853855197518014786978, 1.074195196518674765143729);
        p[22] = create(-0.2433481337524869675825448, -1.207298683731972524975429);
        p[23] = create(-0.2433481337524869675825448, 1.207298683731972524975429);
        break;
    case 25:
        p[0] = create(-0.9062073871811708652496104, 0);
        p[1] = create(-0.9028833390228020537142561, -93077131185102967450643820.0E-27);
        p[2] = create(-0.9028833390228020537142561, 93077131185102967450643820.0E-27);
        p[3] = create(-0.8928551459883548836774529, -0.1863068969804300712287138);
        p[4] = create(-0.8928551459883548836774529, 0.1863068969804300712287138);
        p[5] = create(-0.8759497989677857803656239, -0.2798521321771408719327250);
        p[6] = create(-0.8759497989677857803656239, 0.2798521321771408719327250);
        p[7] = create(-0.8518616886554019782346493, -0.3738977875907595009446142);
        p[8] = create(-0.8518616886554019782346493, 0.3738977875907595009446142);
        p[9] = create(-0.8201226043936880253962552, -0.4686668574656966589020580);
        p[10] = create(-0.8201226043936880253962552, 0.4686668574656966589020580);
        p[11] = create(-0.7800496278186497225905443, -0.5644441210349710332887354);
        p[12] = create(-0.7800496278186497225905443, 0.5644441210349710332887354);
        p[13] = create(-0.7306549271849967721596735, -0.6616149647357748681460822);
        p[14] = create(-0.7306549271849967721596735, 0.6616149647357748681460822);
        p[15] = create(-0.6704827128029559528610523, -0.7607348858167839877987008);
        p[16] = create(-0.6704827128029559528610523, 0.7607348858167839877987008);
        p[17] = create(-0.5972898661335557242320528, -0.8626676330388028512598538);
        p[18] = create(-0.5972898661335557242320528, 0.8626676330388028512598538);
        p[19] = create(-0.5073362861078468845461362, -0.9689006305344868494672405);
        p[20] = create(-0.5073362861078468845461362, 0.9689006305344868494672405);
        p[21] = create(-0.3934529878191079606023847, -1.082433927173831581956863);
        p[22] = create(-0.3934529878191079606023847, 1.082433927173831581956863);
        p[23] = create(-0.2373280669322028974199184, -1.211476658382565356579418);
        p[24] = create(-0.2373280669322028974199184, 1.211476658382565356579418);
        break;
    default:
        break;
    }
}

测试

对比matlab测试结果,基本没有区别

常用IIR滤波器就写完了。后续根据情况更新其他IIR滤波器的实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值