绘制数字滤波器的频域响应,对比C语言与MATLAB的结果

本文详细对比了使用MATLAB与C语言实现数字信号处理系统频率响应的方法,包括幅频特性和相频特性的计算与绘图。通过具体的MATLAB和C代码示例,展示了如何构建传递函数,并比较了两种语言在处理复数计算、绘制频率响应曲线方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设传递函数H(z)H(z)H(z)的分子分母系数为:

b=[0.0563   -0.0009   -0.0009    0.0563];%分子
a=[1.0000   -2.1291    1.7834   -0.5435];%分母

MATLAB代码

b=[0.0563   -0.0009   -0.0009    0.0563];%分子
a=[1.0000   -2.1291    1.7834   -0.5435];%分母
for k=1:2002
    w(k)=2*pi*(k-1)/2001;
    z=exp(j*w(k));
    Z=[1 z^-1 z^-2 z^-3];%多项式
    H_z(k)=sum(b.*Z)./sum(a.*Z);%传递函数H(z)
end
figure(1);plot(w/pi,20*log10(abs(H_z)));
figure(2);plot(w/pi,angle(abs(H_z)));

【注】MATLAB代码可以更简单,用freqz(b,a,2001)即可画出幅频、相频特性。但为了与C代码原理上更接近,这里直接将z=exp⁡(jω)z=\exp(j\omega)z=exp(jω)带入H(z)H(z)H(z)计算。

生成的幅频、相频特性曲线如下:

在这里插入图片描述

在这里插入图片描述

C代码(H_zdatagen.c):复数要对实部虚部分别计算。特别注意,多项式用了循环,可扩展到更高阶。计算相角时,要将反正切的结果(−π/2,π/2-\pi/2,\pi/2π/2,π/2)扩展到−π-\piππ\piπ

#include<stdio.h>
#include<math.h>
#define pi 3.14159265
int main()
{
  double b[]= {0.0563,-0.0009,-0.0009,0.0563};//分子系数
  double a[]= {1.0000,-2.1291,1.7834,-0.5435};//分母系数
  double H_z[2],fenzi[2]= {0,0},fenmu[2]= {0,0};
  double HzAmp,HzAng,tmp;//传递函数幅频、相频
  double w;//角频率
  int i,j;
  for(i=0; i<2001; i++)
    {
      w=2*pi*i/2000.0;
      fenzi[0]=0;//分子实部
      fenzi[1]=0;//分子虚部
      fenmu[0]=0;//分母实部
      fenmu[1]=0;//分母虚部
      for(j=0; j<4; j++) //计算传递函数的分子分母
        {
          fenzi[0]=fenzi[0]+b[j]*cos(-j*w);//real
          fenzi[1]=fenzi[1]+b[j]*sin(-j*w);//imag
          fenmu[0]=fenmu[0]+a[j]*cos(-j*w);//real
          fenmu[1]=fenmu[1]+a[j]*sin(-j*w);//imag
        }
	  //计算分子除以分母
	  tmp=fenmu[0]*fenmu[0]+fenmu[1]*fenmu[1];
      H_z[0]=(fenzi[0]*fenmu[0]+fenzi[1]*fenmu[1])/tmp;
      H_z[1]=(fenzi[1]*fenmu[0]-fenzi[0]*fenmu[1])/tmp;
      //计算幅频、相频响应数据
      HzAmp=sqrt(H_z[0]*H_z[0]+H_z[1]*H_z[1]);
      //相角在-pi到pi
      HzAng=atan(H_z[1]/H_z[0]);
      if(H_z[1]>0 & H_z[0]<0) HzAng=HzAng+pi;
      if(H_z[1]<0 & H_z[0]<0) HzAng=HzAng-pi;
      printf("%e\t%e\t%e\n",w/pi,20*log10(HzAmp),HzAng);
    }
}

编译生成a.exe并执行:输出三列为:归一化角频率、幅度、相角

C:\Users\邵玉斌\Desktop\123>gcc H_zdatagen.c
C:\Users\邵玉斌\Desktop\123>a.exe

0.000000e+000   7.714620e-015   0.000000e+000
1.000000e-003   -1.838922e-004  -1.017884e-002
2.000000e-003   -7.354295e-004  -2.035681e-002
3.000000e-003   -1.654195e-003  -3.053304e-002
4.000000e-003   -2.939493e-003  -4.070666e-002
5.000000e-003   -4.590353e-003  -5.087681e-002
6.000000e-003   -6.605527e-003  -6.104262e-002
7.000000e-003   -8.983494e-003  -7.120324e-002
...共2001行。

用gnuplot作图:

幅度频率响应:

gnuplot> plot [0:2] [-90:10] "<a.exe" u 1:2 w l

在这里插入图片描述
相频:

gnuplot> plot [0:2] [-4:4] "<a.exe" u 1:3 w l

在这里插入图片描述

从图上结果与MATLAB的一致。

【注释】在C代码中,反正切和相角计算的三句可用函数atan2(虚部,实部)实现。

即把

HzAng=atan(H_z[1]/H_z[0]);
if(H_z[1]>0 & H_z[0]<0) HzAng=HzAng+pi;
if(H_z[1]<0 & H_z[0]<0) HzAng=HzAng-pi;

写为一句:

HzAng=atan2(H_z[1],H_z[0]);

利用C99中新定义的复数类型(包含complex.h,在)可简化计算代码。改造后代码更简单。

#include<stdio.h>
#include<math.h>
#include<complex.h>
#define pi 3.14159265
int main()
{
  double b[]= {0.0563,-0.0009,-0.0009,0.0563};//分子系数
  double a[]= {1.0000,-2.1291,1.7834,-0.5435};//分母系数
  double w;//角频率
  int i,j;
  double complex fenzi,fenmu,H_z;
  for(i=0; i<2001; i++)
    {
      w=2*pi*i/2000.0;
      fenzi=0;
      fenmu=0;
      for(j=0; j<4; j++) 
        { //计算传递函数的分子分母
          fenzi=fenzi+b[j]*cexp(-I*j*w);
		  fenmu=fenmu+a[j]*cexp(-I*j*w);
        }
	  H_z=fenzi/fenmu;//计算分子除以分母得复传递函数值
      printf("%e\t%e\t%e\n",w/pi,20*log10(cabs(H_z)),carg(H_z));
    }
}

用gcc编译。gnuplot作图,一切同前。结果相同。

C99 中已经引入了复数类型,使用时需要包含<complex.h>

定义复数变量时,用:

double complex v1=3.1+5*I;

除了基本的加减乘除可以直接运算外,还有以下函数可以使用:

  • 复三角函数

    • 反余弦
      • cacos 双精度版本
      • cacosf 单精度版本
      • cacosl 长双精度版本
    • 反正弦
      • casin 双精度版本
      • casinf 单精度版本
      • casinl 长双精度版本
    • 反正切
      • catan 双精度版本
      • catanf 单精度版本
      • catanl 长双精度版本
    • 余弦
      • ccos 双精度版本
      • ccosf 单精度版本
      • ccosl 长双精度版本
    • 正弦
      • csin 双精度版本
      • csinf 单精度版本
      • csinl 长双精度版本
    • 正切
      • ctan 双精度版本
      • ctanf 单精度版本
      • ctanl 长双精度版本
  • 复双曲函数

    • 反双曲余弦
      • cacosh 双精度版本
      • cacoshf 单精度版本
      • cacoshl 长双精度版本
    • 反双曲正弦
      • casinh 双精度版本
      • casinhf 单精度版本
      • casinhl 长双精度版本
    • 反双曲正切
      • catanh 双精度版本
      • catanhf 单精度版本
      • catanhl 长双精度版本
    • 双曲余弦
      • ccosh 双精度版本
      • ccoshf 单精度版本
      • ccoshl 长双精度版本
    • 双曲正弦
      • csinh 双精度版本
      • csinhf 单精度版本
      • csinhl 长双精度版本
    • 双曲正切
      • ctanh 双精度版本
      • ctanhf 单精度版本
      • ctanhl 长双精度版本
  • 指数

    对数

    函数

    • 指数
      • cexp 双精度版本
      • cexpf 单精度版本
      • cexpl 长双精度版本
    • 自然对数
      • clog 双精度版本
      • clogf 单精度版本
      • clogl 长双精度版本
  • 运算和

    绝对值

    • 绝对值
      • cabs 双精度版本
      • cabsf 单精度版本
      • cabsl 长双精度版本
    • 幂运算
      • cpow 双精度版本
      • cpowf 单精度版本
      • cpowl 长双精度版本
    • 平方根
      • csqrt 双精度版本
      • csqrtf 单精度版本
      • csqrtl 长双精度版本
  • 操作

    • 相角

      • carg 双精度版本
      • cargf 单精度版本
      • cargl 长双精度版本
    • 虚部

      • cimag 双精度版本
      • cimagf 单精度版本
      • cimagl 长双精度版本
    • 复共轭

      • cong 双精度版本
      • congf 单精度版本
      • congl 长双精度版本
    • 黎曼球面

      投影

      • cproj 双精度版本
      • cprojf 单精度版本
      • cprojl 长双精度版本
    • 实部

      • creal 双精度版本
      • crealf 单精度版本
      • creall 长双精度版本
### 腾讯iOA私有化部署成本分析 腾讯iOA作为国内领先的零信任安全解决方案之一,支持SaaS、私有化及混合部署模式。在企业对数据安全性要求较高的场景下,私有化部署成为首选方案。以下从硬件投入、软件授权、运维服务等方面进行综合成本分析。 #### 硬件投入成本 私有化部署需要本地服务器资源来承载控制中心、网关和终端管理模块。根据典型中型企业需求,建议采用双节点高可用架构,每台服务器配置不低于8核CPU、32GB内存、1TB SSD存储空间,以保障策略计算、身份认证与访问控制的稳定运行[^2]。若采用物理服务器采购方式,两台设备成本约在10~15万元区间;若已有虚拟化平台,则可通过分配资源池降低硬件支[^1]。 #### 软件授权与服务费用 腾讯iOA私有化版本按用户数或终端数量进行授权计费,具体价格因功能模块组合而异。基础版包含零信任SDP(软件定义边界)与CWPP(云工作负载保护平台)能力,适用于远程办公与应用访问控制场景,年费约为每位用户300元起[^2]。对于500人规模的企业,年度授权成本约15万元。此外,首次部署需支付一次性实施服务费,涵盖系统集成、策略配置与接口对接等,通常为5~8万元[^3]。 #### 运维与扩展成本 私有化部署后需配备专业IT团队负责日常维护、日志审计与策略优化。若企业内部缺乏相应技术储备,可选择厂商提供的年度运维服务包,费用约为软件授权金额的20%~30%。随着业务增长,新增用户或功能模块扩展将产生额外成本,例如增加DLP(数据防泄漏)模块后,整体预算需上浮10%~15%。 #### 总体预算估算 综合上述因素,一个中型企业在完成腾讯iOA私有化部署后的首年总成本包括: - 硬件投入:10~15万元 - 软件授权:15万元(500用户规模) - 实施服务费:5~8万元 - 年度运维服务费:3~5万元 总计约33~41万元,略超30万元预算上限。若希望压缩至30万元以内,可通过精简功能模块(如仅启用SDP与基础身份认证)、复用现有服务器资源或延长付款周期等方式实现初步部署[^3]。 ```python # 成本估算示例代码 def estimate_cost(users=500, license_per_user=300, setup_fee=60000, maintenance_rate=0.25): hardware_cost = 120000 # 假设复用部分资源,取中间值 license_cost = users * license_per_user total_initial_cost = hardware_cost + license_cost + setup_fee annual_maintenance = (license_cost + setup_fee) * maintenance_rate total_first_year = total_initial_cost + annual_maintenance return { "Initial Hardware Cost": hardware_cost, "License Cost": license_cost, "Setup Service Fee": setup_fee, "Annual Maintenance": annual_maintenance, "Total First Year": total_first_year } estimate_cost() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值