matlab ellip函数 C实现

【 MATLAB 】ellip 函数介绍(椭圆滤波器设计) ellip Elliptic filter design Syntax [b,a] = ellip(n,Rp,Rs,Wp) [b,a] = ellip(n,Rp,Rs,Wp,ftype) [z,p,k] = ellip(___) [A,B,C,D] = ellip(___) [___] = ellip(___,'s') Description [b,a] = ellip(n,Rp... 阅读详情

继上一篇实现matlab cheby2函数 C实现

这篇实现ellip(椭圆)

特点

椭圆滤波器提供比巴特沃斯或切比雪夫滤波器更陡峭的滚降特性,但在通带和阻带都是等纹的。
椭圆滤波器满足给定的性能规格,具有任何滤波器类型中最低的阶数。

C代码

void ellip(int n, double rp, double rs, double Wn[], int type, int analog, double *ab, double *bb)
{
    double fs = 2;
    double u[2] = {0.0, 0.0};
    // step 1: get analog, pre-warped frequencies
    if (!analog)
    {
        if (type == 1 || type == 2)
        {
            fs = 2;
            u[0] = 2 * fs * tan(PI * Wn[0] / fs);
        }
        else
        {
            fs = 2;
            u[0] = 2 * fs * tan(PI * Wn[0] / fs);
            u[1] = 2 * fs * tan(PI * Wn[1] / fs);
        }
    }
    else if (type == 3 || type == 4)
    {
        if (type == 1 || type == 2)
        {
            u[0] = Wn[0];
        }
        else
        {
            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 = n % 2 == 0 ? n : n - 1;
    ZPK zpk = ellipap(n, rp, rs);

    double k = zpk.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(zpk.z, zpk.p, zpk.nz, zpk.np, 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;
    }

    if (!analog)
    {
        bilinear(a_size, a, b, c, &d, fs);
    }

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

    Complex *z1 = (Complex *)malloc(sizeof(Complex) * a_size);
    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] = tempb[i].real * k;
    }

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

其中ellipap

ZPK ellipap(int n, double rp, double rs)
{
    ZPK temp;
    double Gp = pow(10, -1.0 * rp / 20.0);
    double ep = sqrt(pow(10, rp / 10.0) - 1.0);
    double es = sqrt(pow(10, rs / 10.0) - 1.0);
    double k1 = ep / es;
    double k0 = ellipdeg(n, k1);

    int L = floor(n / 2);
    double r = n % 2;
    double *ui = (double *)malloc(sizeof(double) * L);
    for (size_t i = 0; i < L; i++)
    {
        ui[i] = (2.0 * (i + 1.0) - 1.0) / n;
    }

    double *zeta_i = cde(ui, L, k0, EPS);

    Complex *zt = (Complex *)malloc(sizeof(Complex) * L);
    Complex *pt = (Complex *)malloc(sizeof(Complex) * L);
    Complex c = create(0, 1.0);
    for (size_t i = 0; i < L; i++)
    {
        zt[i] = complex_divide_double(c, k0 * zeta_i[i]);
    }

    Complex v0 = asne(complex_divide_double(c, ep), k1, EPS);
    v0 = complex_multiply(create(0, -1), v0);
    v0 = complex_divide_double(v0, n);
    // p = j*cde(ui-1i*v0, k);
    for (size_t i = 0; i < L; i++)
    {
        pt[i] = complex_subtract(create(ui[i], 0), complex_multiply(create(0, 1), v0));
    }

    pt = complex_cde(pt, L, k0, EPS);

    // pt = complex_cde(pt, L, k0, EPS);
    for (size_t i = 0; i < L; i++)
    {
        pt[i] = complex_multiply(c, pt[i]);
    }

    Complex p0 = complex_multiply(create(0, 1), v0);
    p0 = complex_sne(p0, k0, EPS);
    p0 = complex_multiply(c, p0);

    //(L+1)*3的矩阵 A,B其实可以省略
    double *A = (double *)malloc(sizeof(double) * (L + 1) * 3);
    double *B = (double *)malloc(sizeof(double) * (L + 1) * 3);
    for (int i = 3; i < 3 * (L + 1); i++)
    {
        if ((i + 1) % 3 == 0)
        {
            A[i] = pow(get_modulus(complex_divide(create(1.0, 0.0), pt[i - L])), 2);
            B[i] = pow(get_modulus(complex_divide(create(1.0, 0.0), zt[i - L])), 2);
        }
        else if ((i + 1) % 3 % 2 == 0)
        {
            A[i] = -2 * complex_divide(create(1.0, 0.0), pt[i - L]).real;
            B[i] = -2 * complex_divide(create(1.0, 0.0), zt[i - L]).real;
        }
        else
        {
            A[i] = 1;
            B[i] = 1;
        }
    }

    if (r == 0)
    {
        A[0] = 1;
        A[1] = 0;
        A[2] = 0;
        B[0] = Gp;
        B[1] = 0;
        B[2] = 0;
    }
    else
    {
        A[0] = 1;
        A[1] = -complex_divide(create(1.0, 0.0), p0).real;
        A[2] = 0;
        B[0] = 1;
        B[1] = 0;
        B[2] = 0;
    }

    Complex *z = (Complex *)malloc(sizeof(Complex) * L * 2);
    Complex *p = (Complex *)malloc(sizeof(Complex) * L * 2);
    for (size_t i = 0; i < L; i++)
    {
        z[i] = zt[i];
        z[L + i] = complex_conj(zt[i]);
        p[i] = pt[i];
        p[L + i] = complex_conj(pt[i]);
    }
    cplxpair(z, 2 * L);
    cplxpair(p, 2 * L);

    temp.nz = 2 * L;
    temp.z = (Complex *)malloc(sizeof(Complex) * 2 * L);
    for (size_t i = 0; i < temp.nz; i++)
    {
        temp.z[i].real = z[i].real;
        temp.z[i].imaginary = z[i].imaginary;
    }

    if (r == 1)
    {
        temp.np = 2 * L + 1;
        temp.p = (Complex *)malloc(sizeof(Complex) * (2 * L + 1));
        for (size_t i = 0; i < 2 * L; i++)
        {
            temp.p[i] = p[i];
        }

        temp.p[2 * L].real = p0.real;
        temp.p[2 * L].imaginary = p0.imaginary;
    }
    else
    {
        temp.np = 2 * L;
        temp.p = (Complex *)malloc(sizeof(Complex) * 2 * L);
        for (size_t i = 0; i < 2 * L; i++)
        {
            temp.p[i] = p[i];
        }
    }

    double H0 = pow(Gp, 1 - r);
    Complex zprod=create(1.0,0.0);
    if(temp.nz>0)
    {
        zprod=complex_array_prod(temp.z, temp.nz);
    }
    temp.k = fabs(complex_multiply_double(complex_divide(complex_array_prod(temp.p, temp.np), zprod), H0).real);

    free(ui);
    free(zeta_i);
    free(zt);
    free(pt);
    free(z);
    free(p);

    return temp;
}

ellipdeg:

double ellipdeg(int n, double k1)
{

    if (k1 < KMIN)
    {
        return ellipdeg2(n, k1);
    }
    else
    {
        double k;
        int L = floor(n / 2);

        double kc = sqrt(1 - pow(k1, 2));
        double *ui = (double *)malloc(sizeof(double) * L);
        for (size_t i = 0; i < L; i++)
        {
            ui[i] = (2.0 * (i + 1.0) - 1.0) / n;
        }

        double *w = sne(ui, L, kc, EPS);
        double kp = pow(kc, n) * pow(double_array_prod(w, L), 4);
        k = sqrt(1 - pow(kp, 2));

        free(ui);
        return k;
    }
}

ellipdeg2:

double ellipdeg2(int n, double k1)
{
    double k;
    double M = 7; // 默认值
    double K, Kprime;
    ellipk(k1, EPS, &K, &Kprime);
    double q = exp(-PI * Kprime / K);
    double q1 = pow(q, n);
    // k = 4 * sqrt(q1) * ((1 + sum(q1.^(m.*(m+1))))/(1 + 2*sum(q1.^(m.*m))))^2;
    double *temp1 = (double *)malloc(sizeof(double) * M);
    double *temp2 = (double *)malloc(sizeof(double) * M);
    double sum1 = 0;
    double sum2 = 0;
    for (size_t i = 0; i < M; i++)
    {
        sum1 += pow(q1, (i + 1) * (i + 2));
        sum2 += pow(q1, (i + 1) * (i + 1));
    }

    k = 4 * sqrt(q1) * (1 + sum1) / pow(1 + 2 * sum2, 2);
    free(temp1);
    free(temp2);
    return k;
}

ellipk:

void ellipk(double k, double tol, double *K, double *Kprime)
{
    if (k == 0)
    {
        *K = INFINITY;
    }
    else if (k > KMAX)
    {
        double kp = sqrt(1 - pow(k, 2));
        double L = -log(kp / 4.0);
        *K = L + (L - 1) * pow(kp, 2) / 4.0;
    }
    else
    {
        int nv = 0;
        double *v = landen(k, tol, &nv);
        for (size_t i = 0; i < nv; i++)
        {
            v[i] += 1;
        }

        *K = double_array_prod(v, nv) * PI / 2.0;
        free(v);
    }

    if (k == 0)
    {
        *Kprime = INFINITY;
    }
    else if (k < KMIN)
    {
        double L = -log(k / 4.0);
        *Kprime = L + (L - 1) * pow(k, 2) / 4.0;
    }
    else
    {
        double kp = sqrt(1 - pow(k, 2));
        int nvp = 0;
        double *vp = landen(kp, tol, &nvp);
        for (size_t i = 0; i < nvp; i++)
        {
            vp[i] += 1.0;
        }

        *Kprime = double_array_prod(vp, nvp) * PI / 2.0;

        free(vp);
    }
}

cde为带复参数的归一化Jacobi椭圆函数,代码如下:

double *cde(double *u, int nu, double k1, double tol)
{
    int nv = 0;
    double *v = landen(k1, tol, &nv);

    double *w = (double *)malloc(sizeof(double) * nu);
    for (size_t i = 0; i < nu; i++)
    {
        w[i] = u[i] * PI / 2.0;
        w[i] = cos(w[i]);
    }

    for (int i = nv - 1; i >= 0; i--)
    {
        for (size_t j = 0; j < nu; j++)
        {
            w[j] = (1 + v[i]) * w[j] / (1 + v[i] * pow(w[j], 2));
        }
    }

    free(v);

    return w;
}

复数形式代码:

Complex *complex_cde(Complex *u, int nu, double k1, double tol)
{
    int nv = 0;
    double *v = landen(k1, tol, &nv);
   
    Complex *w = (Complex *)malloc(sizeof(Complex) * nu);
    for (size_t i = 0; i < nu; i++)
    {
        w[i] = complex_multiply_double(u[i], PI / 2.0);
        w[i] = complex_cosine(w[i]);
    }

    for (int i = nv - 1; i >= 0; i--)
    {
        for (size_t j = 0; j < nu; j++)
        {
            Complex t1 = complex_multiply_double(w[j], 1 + v[i]);
            Complex t2 = complex_multiply_double(complex_power(w[j], 2), v[i]);
            t2 = complex_add_double(t2, 1.0);
            w[j] = complex_divide(t1, t2);
        }
    }

    free(v);
    return w;
}

landen:

double *landen(double k, double tol, int *n)
{
    double tempv[1000];
    *n = 0;
    while (k > tol)
    {
        k = pow(k / (1 + sqrt(1 - pow(k, 2))), 2);
        tempv[*n] = k;
        *n = *n + 1;
    }
    int length=*n;
    double *temp = (double *)malloc( length* sizeof(double));
   
    for (size_t i = 0; i < *n; i++)
    {
        temp[i] = tempv[i];
    }

    return temp;
}

sne为正弦振幅的Jacobi椭圆函数,代码如下:

double *sne(double *u, int nu, double k, double tol)
{
    int nv = 0;
    double *v = landen(k, tol, &nv);
    double *w = (double *)malloc(sizeof(double) * nu);
    for (size_t i = 0; i < nu; i++)
    {
        w[i] = sin(u[i] * PI / 2.0);
    }

    for (int i = nv - 1; i >= 0; i--)
    {
        for (size_t j = 0; j < nu; j++)
        {
            w[j] = ((1.0 + v[i]) * w[j]) / (1.0 + v[i] * pow(w[j], 2.0));
        }
    }

    free(v);
    return w;
}

asne为正弦振幅的Jacobi椭圆函数的逆,代码如下:

Complex asne(Complex w, double k1, double tol)
{
    Complex rst = acde(w, k1, tol);
    rst = complex_subtract(create(1.0, 0.0), rst);
    return rst;
}

Complex acde(Complex w, double k1, double tol)
{
    int nv = 0;
    double *v = landen(k1, tol, &nv);
    Complex wt;
    wt.real = w.real;
    wt.imaginary = w.imaginary;
    for (size_t i = 0; i < nv; i++)
    {
        double v1 = i == 0 ? k1 : v[i - 1];
        // w = w./(1 + sqrt(1 - w.^2 * v1^2)) * 2/(1+v(n))
        //(1 + sqrt(1 - w.^2 * v1^2))
        Complex temp = complex_power(w, 2);
        temp = complex_multiply_double(temp, pow(v1, 2));
        temp = complex_subtract(create(1.0, 0.0), temp);
        temp = complex_square_root(temp);
        temp = complex_add_double(temp, 1.0);
        temp = complex_divide(w, temp);
        w = complex_multiply_double(temp, 2.0 / (1.0 + v[i]));
    }

    Complex u = complex_arccosine(w);
    u = complex_multiply_double(u, 2.0 / PI);
    double K, Kprime;
    ellipk(k1, tol, &K, &Kprime);
    double R = Kprime / K;

    u = complex_add_double(complex_multiply_double(create(0, 1.0), srem(u.imaginary, 2 * R)), srem(u.real, 4));

    free(v);

    return u;
}

acde:

Complex acde(Complex w, double k1, double tol)
{
    int nv = 0;
    double *v = landen(k1, tol, &nv);
    Complex wt;
    wt.real = w.real;
    wt.imaginary = w.imaginary;
    for (size_t i = 0; i < nv; i++)
    {
        double v1 = i == 0 ? k1 : v[i - 1];
        // w = w./(1 + sqrt(1 - w.^2 * v1^2)) * 2/(1+v(n))
        //(1 + sqrt(1 - w.^2 * v1^2))
        Complex temp = complex_power(w, 2);
        temp = complex_multiply_double(temp, pow(v1, 2));
        temp = complex_subtract(create(1.0, 0.0), temp);
        temp = complex_square_root(temp);
        temp = complex_add_double(temp, 1.0);
        temp = complex_divide(w, temp);
        w = complex_multiply_double(temp, 2.0 / (1.0 + v[i]));
    }

    Complex u = complex_arccosine(w);
    u = complex_multiply_double(u, 2.0 / PI);
    double K, Kprime;
    ellipk(k1, tol, &K, &Kprime);
    double R = Kprime / K;

    u = complex_add_double(complex_multiply_double(create(0, 1.0), srem(u.imaginary, 2 * R)), srem(u.real, 4));

    free(v);

    return u;
}

srem:

double srem(double X, double Y)
{
    double Z;

    Z = fmod(X, Y);

    // Bring into interval [-Y/2, Y/2]
    Z -= Y * ((Z > Y / 2) - (Z < -Y / 2));

    return Z;
}

测试

与matlab测试结果对比,matlab中最高阶49阶,C代码可确保47阶,且误差小于小数点后10位小数

下一篇: matlab besself函数 C实现

【MATLAB】数字滤波器的设计 一、引言 在信号处理过程中,所处理的信号往往混有噪声,从接收到的信号中消除或减弱噪声是信号传输和处理中十分重要的问题。根据有用信号和噪声的不同特性,提取有用信号的过程称为滤波,实现滤波功能的系统称为滤波器。在以往的模拟电路中用的都是模拟滤波器,在近代电信设备和各类控制系统中,由于数字化的普及,数字滤波器已得到了广泛的应用。数字滤波器与传统模拟滤波器在实现方式上存在很大的差异。传统的模拟滤波器主要是硬件实现,它的硬件部分主要包括电容,电感和电阻等元件,而数字滤波器在硬件实现上主要涉及A/D转换器、D/A转换 阅读详情

相关推荐

matlab设计椭圆低通滤波器,【 MATLAB 】ellip 函数介绍(椭圆滤波器设计)

ellipElliptic filter designSyntax[b,a] = ellip(n,Rp,Rs,Wp)[b,a] = ellip(n,Rp,Rs,Wp,ftype)[z,p,k] = ellip(___)[A,B,C,D] = ellip(___)[___] = ellip(___,'s')Description[b,a] = ellip(n,Rp,Rs,Wp)返回具有归一化通带边...

weixin_39616003的博客 2413

matlab常用了滤波函数小结

在IIR数字滤波器设计中有把模拟的原型滤波器转变成相应的数字滤波器,即通过已知S变换中模拟滤波器的系数求数字滤波器的系数。其中有两种方法来进行这种变换,一种是激冲不变法,另一种是双线性Z变换法。bilinear 函数便是双线性Z变换法。函数中的b和a是原模拟滤波器S变换中的分子和分母系数,该函数可以用来求得系统的频率响应,以及求得序列的离散时间傅里叶变换(DTFT)。's'表示模拟滤波器,缺省时该函数适用于数字滤波器。1,ellipord函数。3,bilinear函数。4,freqz()函数。...

weixin_46817835的博客 1万+

MATLAB椭圆滤波器设计:从阶数计算到FPGA/嵌入式实现

在数字信号处理中,滤波器设计是核心基础技术,用于从含噪信号中提取目标频段。其原理是通过系统函数对信号频谱进行整形,实现频率选择性。椭圆滤波器因其在通带和阻带具有等波纹特性,能以最低阶数实现最陡峭的过渡带,技术价值在于为资源受限的硬件系统(如FPGA和嵌入式MCU)提供了高效的滤波解决方案。在通信、音频处理等应用场景中,精确确定滤波器阶数至关重要,它直接影响硬件资源消耗和实时性。本文以MATLAB的ellipord函数为核心,详细解析如何根据通带截止频率、阻带衰减等指标计算最小阶数,并深入探讨从系数生成、定点

weixin_30535843的博客 373

常用模拟低通滤波器的设计~经典 IIR 滤波器之椭圆滤波器

椭圆滤波器又称考尔滤波器,是在通带和阻带范围内都具有等波纹的一种滤波器。椭圆滤波器相比其他类型的滤波器,在阶数相同的条件下有最小的通带和阻带波动这一点区别于在通带和阻带都平坦的巴特沃斯滤波器,以及通带平坦、阻带等波纹或是阻带平坦、通带等波纹的切比雪夫滤波器。椭圆滤波器振幅平方函数为:其中,为雅可比椭圆函数,L 为一个表示波纹性质的参量。在 Matlab 中,函数ellipap、ellipord、ellip 用于设计椭圆滤波器。

yishuihanq的博客 7828

Matlab数字滤波器设计及GUI界面

本文将介绍如何使用Matlab设计数字滤波器,并附带GUI界面实现滤波器的可视化操作。为了方便使用者进行滤波器的操作,我们可以设计出一个GUI界面,实现滤波器的可视化操作。Matlab中,设计数字滤波器主要有三种方法:巴特沃斯滤波器、切比雪夫滤波器和椭圆滤波器。以上代码中,我们实现了GUI界面的设计,包括选择音频文件、设定滤波器参数等操作。其中,ellipord函数计算了滤波器的阶数和通带截止频率,ellip函数则用于进行滤波器的设计。首先,需要确定滤波器的类型和滤波器的阶数(即有几个级联的二阶滤波器)。

BUG?不存在的! 629

基于FPGA的IIR滤波器的实现— MATLAB函数实现

根据MATLAB提供的多种设计IIR数字滤波器的函数设计滤波器,采用根据原型转换法原理实现的四种IIR设计函数:butter、cheby1、cheby2、ellip、yulewalk一、采用butter(巴特沃斯函数)设计butter函数可以直接设计各种形式的数字滤波器,同时也可以设计模拟滤波器。butter形式:butter函数可以设计低通、高通、带通、带阻等各种形式的滤波器。

qq_46475176的博客 370

matlab besself函数 C实现

IIR滤波器 besself bessel besselap

CSharp_Beginner的博客 746

数字调制解调技术的MATLAB与FPGA实现-FPGA实现数字信号处理基础 【2.7】

利用“「z,p,kl=ellip(n,Rp,Rs,Wn)”及“[z,p,k]=ellip(n,Rp,Rs,Wn,’ftype’)’可以得到滤波器的零、极点和增益表达式:利用“[A,B,C,D]=ellip(n,Rp,Rs,Wn)'及“[A,B,C,D]=ellip(n,Rp,Rs,Wn,’fype’)”可以得到滤波器的状态空间表达形式,实际设计中很少使用这种语法形式。只是利用chebyl函数设计的滤波器在通带是等波纹的,在阳带是单调的,而利用cheby2函数设计的滤波器在阻带是等波纹的,在通带是单调的。

qq_43416206的博客 1078

IIR滤波器设计:从原理到Matlab实现与工程部署

在数字信号处理中,滤波器是提取有效信号、抑制噪声的核心工具。其基本原理是根据信号的频率特性进行选择性通过或衰减。IIR滤波器凭借其递归结构,能以较低的阶数实现陡峭的频率选择性,在计算资源和实时性要求严格的嵌入式系统、生物信号处理等领域具有极高的技术价值。本文聚焦于IIR滤波器的设计全流程,深入解析了巴特沃斯、切比雪夫等经典模拟原型的选型考量,并详细演示了如何利用Matlab完成从指标定义、系数计算、性能分析到级联型结构实现的完整步骤。针对工程实践中常见的稳定性与系数量化问题,文章提供了级联二阶节实现、定点化

weixin_30444111的博客 259

椭圆数字滤波器(内含完整的MATLAB代码)

椭圆数字滤波器(内含完整的MATLAB代码)

TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)

1 基础知识讲解 1.1 在RAM中运行还是在flash中运行指的是什么? 1.1.1 背景:程序编译完之后生成的.bin文件,.bin文件中包含代码段,代码段中全是汇编指令,而汇编指令中包含多个函数,各函数头的地址不同,如存在A函数和B函数,假设RAM地址区间是0x0000-0x8000,flash的地址区间是0xA000-0xF000,A函数要调用B函数,则A函数调用B函数的那段汇编指令中包含的是B函数头的存储地址,A函数和B函数都在flash中有存储 1.1.2 情况1:B函数是配置为在RAM中运行,

weixin_43776284的博客 8063

别再只调巴特沃斯了!用MATLAB ellip函数5分钟搞定陡降的椭圆滤波器设计

本文介绍了如何使用MATLAB的ellip函数高效设计高性能椭圆滤波器,相比传统的巴特沃斯和切比雪夫滤波器,椭圆滤波器在相同阶数下具有更陡峭的过渡带和更优的性能。文章详细讲解了ellipord、ellipap和ellip三个关键函数的使用方法,并提供了参数选择和性能验证的实用技巧,帮助工程师快速掌握椭圆滤波器设计。

weixin_30340819的博客 532

STM32F4实战:手把手教你实现USB OTG双模式切换(Host/Slave)

本文详细介绍了如何在STM32F4上实现USB OTG双模式切换(Host/Slave),包括硬件架构解析、软件实现机制、主机模式下的U盘读写以及从机模式下的自定义设备开发。通过实战案例和优化技巧,帮助开发者快速掌握USB双角色功能,提升嵌入式系统开发的灵活性和效率。

u9v0w的博客 728

基于FPGA的IIR滤波器的实现(1)— MATLAB函数实现

本章讲解根据MATLAB提供的多种设计IIR数字滤波器的函数设计滤波器,采用根据原型转换法原理实现的四种IIR设计函数:butter、cheby1、cheby2、ellip、yulewalk。

qq_52450571的博客 2822

深度学习、图像分类入门,从VGG16卷积神经网络开始

刚开始接触深度学习、卷积神经网络的时候非常懵逼,不知道从何入手,我觉得应该有一个进阶的过程,也就是说,理应有一些基本概念作为奠基石,让你有底气去完全理解一个庞大的卷积神经网络: 本文思路: 一、我认为学习卷积神经网络必须知道的几个概念: 1、卷积过程:   我们经常说卷积神经网络卷积神经网络,到底什么才是卷积?网络层卷积过程到底怎么实现?我们在这里借鉴了另一位博客大牛的动态图来给大

Errors_In_Life的博客 16万+

史上最详细的sqlmap使用教程

sqlmapsqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等Sqlmap采用了以下5种独特的SQL注入技术基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。

大河之犬的博客 5万+

matlab ellip,IIR濾波器設計(調用MATLAB IIR函數來實現) | 學步園

%IIR濾波器設計%目的:設計一個採樣頻率為1000Hz、通帶截止頻率為50Hz、阻帶截止頻率為100Hz的低通濾波器,並要求通帶最大衰減為1dB,阻帶最小衰減為60dB。clc;clear;closeall;%1.產生信號(頻率為10Hz和100Hz的正弦波疊加)Fs=1000;%採樣頻率1000Hzt=0:1/Fs:1;s10=sin(20*pi*t);%產生10Hz正弦波s...

weixin_36241866的博客 517

白鲸优化算法(BWO)详解:从生物灵感 to 工程实践

白鲸优化算法(BWO)是一种新型的群体智能优化算法,模拟白鲸的游泳、捕食和鲸落行为。该算法通过平衡因子控制探索与开发阶段的转换:探索阶段采用正弦/余弦函数模拟白鲸的同步游泳,开发阶段引入莱维飞行增强局部搜索,鲸落阶段通过随机更新避免局部最优。BWO具有参数少、实现简单、收敛速度快等优点,已在多个优化问题上展现出优异性能。其数学模型将白鲸的三种核心行为抽象为位置更新公式,实现了全局搜索与局部开发的自然平衡。

qq_42212808的博客 290

IIR滤波器设计(调用MATLAB IIR函数来实现)

转载请注明文章来源 – http://blog.youkuaiyun.com/v_hyx ,请勿用于任何商业用途       对于滤波器设计,以前虽然学过相关的理论(现代数字信号处理和DSP设计),但一直不求甚解,也没用过。趁着最近使用了一下,就来重学一回,温故而知新。       先来说说IIR滤波器设计,理论与原理参考如下博客,写得简明易懂,不错。 http://blog.youkuaiyun.com/

分享快乐 1万+

在移动固态上安装ubuntu系统,重启后卡住报错:blk_update_request: I/O error, dev sda, sector ... op 0x0 (READ)如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1794

DC/DC开关电源学习笔记(十五)四开关Buck-Boost-FSBB升降压电路拓扑与工作原理

在DCDC领域,最为常见的是buck拓扑,其次是boost拓扑,而buck-boost的关注度相对较低。但是在电池供电场景日益普及的现在,升降压的需求在不断上升,现在更加关注buck-boost这个拓扑。而在所有buck-boost拓扑中,四开关buck-boost最受欢迎。四开关buck-boost的拓扑很简单,如下图。

小幽余生不加糖 5984

别再只懂巴特沃斯了!用MATLAB ellip函数5分钟搞定一个高性能椭圆滤波器

本文深入解析了MATLAB中ellip函数设计高性能椭圆滤波器的实用技巧。通过对比巴特沃斯、切比雪夫等IIR滤波器,展示椭圆滤波器在阶数效率和过渡带陡峭度上的优势,并提供从参数计算到实现的完整MATLAB代码示例,帮助工程师快速掌握这一数字信号处理的利器。

weixin_42683392的博客 325

YOLO11改进 - 卷积Conv | DEGConv(方向引导边缘门控卷积) : 空间分块、方向先验、轻量边缘增强

本文介绍了方向引导边缘门控卷积(DEGConv),一种专为增强边缘敏感度与方向感知能力设计的轻量级模块。该方法通过 Sobel 算子生成方向嵌入,结合条纹卷积提取水平与垂直边缘特征,并利用门控机制动态抑制背景噪声,从而精准捕捉细粒度结构。我们将 DEGConv 成功集成进 YOLO11,在 Backbone 的 SPPF 后及 Neck 的 P3、P4 分支中引入该模块以优化特征提取。实验证明,集成 DEGConv 的 YOLO11 在检测任务中表现优异,有效提升了模型对复杂边缘与方向特征的建模能力。

魔改工程师的博客 674

matlab一直系统函数画脉冲响应,MATLAB之使用 impz 函数计算并画出脉冲响应

EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册x' C" [+ n1 g# Q- ]" A这篇在于讨论 impz 函数的使用。|9 u8 v8 }& H9 m/ `# g% a+ k% ~/ J6 C0 d, [4 Q" VMATLAB帮助文档对impz的介绍:8 c# D4 {$ U/ X" |/ r0 r6 a! y, ]; S8 o$ g我在 MATLAB 中...

weixin_32103009的博客 1791

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

matlab ellipord函数 C实现

matlab ellipordC语言 椭圆最小阶 信号处理

CSharp_Beginner的博客 861

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: matlab cheby2函数 C实现
下一篇: matlab besself函数 C实现
zzzLeaon
博客等级 码龄10年 159粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值