【模拟滤波与数字滤波区别】--双线性变换的预畸变处理理解及验证;matlab中freqz、freqs、loglog、bode函数绘图的区别

【模拟滤波与数字滤波区别】--双线性变换的预畸变处理理解及验证;matlab中freqz、freqs、loglog、bode函数绘图的区别

前言

作者耗时4天,翻阅了不低于20篇文章,关于在模拟滤波及数字滤波设计时遇到的问题,一点点总结出相应的解决及验证方法;希望能帮助广大读者,节约时间。
主要问题包括如下:

  • 双线性变换为什么要进行预畸变处理,预畸变处理后为什么我绘制的bode图截止频率对不上?[^1]
  • 为什么系统使用c2d函数或者d2c函数后,绘制的bode图不一致?
  • 为什么loglog和plot函数的图特么对不上,不理解?
    最后给出了matlab测试代码,包含如下内容:
  • freqz、freqs、loglog、bode、plot函数在数字滤波和模拟滤波中的使用及区别(有注释)
  • 基于低通滤波器设计 双线性变化进行预畸变与不进行预畸变处理和区别。
  • 基于带通滤波器设计 双线性变化进行预畸变与不进行预畸变处理和区别。

解决方法及验证代码展示

第一个问题

  • 首先说模拟滤波器和数字滤波器的区别
    模拟滤波器针对连续系统,一阶低通滤波器s域表达式 10 s + 10 {\frac{10}{s+10}} s+1010,就是模拟滤波器;将其进行z变换的表达式 0.004975 z + 0.004975 z − 0.99 {\frac{0.004975z + 0.004975}{z-0.99}} z0.990.004975z+0.004975,就是对应的数字滤波器,针对离散系统。我们实际的采样数据都是离散的,一般用都是数字滤波,再者这里z变换表达式式是受采样频率影响的,z变化有2种方式,这是接下来要说的。
  • z变换的方式
    上边说了s域转z域需要z变换,z变换一般有如下多种方式:
    在这里插入图片描述
    对于冲激响应不变法和双线性不变化法这两种方法参考原理参考。我这里只介绍双线性变换法。以下是双线性变换法的一个优缺点
    在这里插入图片描述
  • 双线性变换为什么要进行预畸变处理
    双线性变换法存在严重的非线性频率变换,会发生畸变。怎么理解这个畸变,举个栗子,期望滤波器的截止频率 w d w_d wd,这是用于实际采样数据的,所以是一个数字滤波器的截止频率,而滤波器设计都是从s域开始再转z域的这么一个过程,如果直接用 w d w_d wd去设计s域的模拟滤波器,模拟滤波的截止频率是 w d w_d wd,没问题,但是进行双性变换转z域的数字滤波,截止频率就发生了变化,不在 w d w_d wd处了,这就是畸变。
  • 如何进行预畸变处理?
    简单,但是这里要注意频率(Hz)与角频率(rad/s)的区别。我们的目的是使设计出来的数字滤波器截止频率为 w d w_d wd。那么预畸变的模拟滤波器的截止频率(角频率rad/s) w a = 2 T t a n w d T 2 w_a={\frac{2}{T}}tan{\frac{w_dT}{2}} wa=T2tan2wdT。而对应的基于频率(Hz)的转换关系就是除以 2 π 2π 2π,即 w a h z = 2 T ∗ 2 π t a n w d h z ∗ 2 π ∗ T 2 = 1 T π t a n ( w d h z π T ) w_{ahz}={\frac{2}{T*2π}}tan{\frac{w_{dhz}*2π*T}{2}}={\frac{1}{Tπ}}tan{(w_{dhz}πT)} wahz=T2π2tan2wdhz2πT=Tπ1tan(wdhzπT)
    然后有些人和我一样对上图有疑惑,为什么别人写的是 = 2 T t a n ( w 2 ) ={\frac{2}{T}}tan({\frac{w}{2}}) =T2tan(2w),那是因为他这里w指的就是模拟滤波的截止频率经双线性变化压缩后的模拟频率,这个是 = w d T =w_dT =wdT的。所以你放心,结果是没有错的,如果你对原理很有执念,参考
  • 预畸变处理后为什么我绘制的bode图截止频率对不上?
    那么你肯定是使用c2d函数或者绘图的时候出现了问题,这就涉及到了第二各大问题

第二个问题

  • 为什么系统使用c2d函数或者d2c函数后,绘制的bode图不一致?
    因为在使用基于’tustin’方法转换时,发生了畸变,所以会不一样,且基于双线性变换的离散系统bode图的频率范围为 ± π / T ±π/T ±π/T,绘制出来会有一根竖线,如
    在这里插入图片描述
    然后一个重要的点是,对于没系统学过的朋友,可能对freqs/freqz/bode/loglog这些matlab函数比较陌生,网上也没人比较全面的介绍,这可能让你分析幅频图像时遇到一些困难,我也是一样。那我告诉你,这些函数绘制出来的图主要区别在于横纵轴坐标的刻度、单位有所区别。这些可以在我的测试代码中看到。

第三个问题

同第二问题一样,这些函数的绘图区别在于横纵轴坐标的刻度、单位,这些可以在我的测试代码中看到。

matlab测试代码展示

给出测试的matlab代码,涉及的问题及答案都在代码中。

%% 滤波器练习
clear;clc;clf;
% wp = 2;ws = 4;
% rp = 1;rs = 30;
% fs = 100;
% 
% %传入的参数分别为:通带、阻带截止频率;通带、阻带衰减系数
% %返回参数为:阶数、3dB截止频率
% [N,wc] = buttord(wp,ws,rp,rs,"s");
% Wc = [wc,wc+1.5];
% 
% %计算多项式形式的分母分子系数
% [B1,A1] = butter(2,wc,'s'); %模拟低通滤波器
% [B2,A2] = butter(2,wc,"high","s");%模拟高通滤波器
% [B3,A3] = butter(1,Wc,'stop','s');%模拟带阻滤波器 对于带通和带阻设计,n 表示滤波器阶数的一半。
% [B4,A4] = butter(N,Wc,'s');%模拟带通滤波器(最后一个参数's'表示模拟,去掉后为数字为z域)
% 
% w = 0:0.001:6;

% for i=1:4
%     %创建变量名
%     var_name = strcat('H',num2str(i));
% 
%     %计算结果
%     res = freqs(eval(['B',num2str(i)]),eval(['A',num2str(i)]),w);
%     %取对数数
%     res = 20*log10(abs(res));
%     %将计算结果放到变量名中
%     eval([var_name,'=res;']);
% 
%     figure(i);
%     plot(w,eval(['H',num2str(i)]));
%     grid on;
%     xlabel('频率/(rad/s)');ylabel('幅度/dB');pow2(3,3)
% end


% [b,a]=bilinear(B3,A3,1000);
% 
% tf_fun = tf(b,a);
% figure(5)
% bode(tf_fun,'b');hold on;grid on;

%% 数字滤波和模拟滤波绘制的幅频曲线图区别及分析
% *********************一、从数字滤波的角度去分析,freqz与bode绘制的图像区别**************************************
% 结论:1.对于离散系统,根据双线性变换原理,其频率范围为 ±π/T。
%      2.butter在设计离散滤波器的时候进行了预畸处理,所以其离散系统bode图截止频率在截止频率30Hz处,同时对应的连续系统Wc不在30Hz处
%        角频率转换关系:Ω = 2/T *tan(W*T/2)。所以当W*T/2足够小时,Ω=W,为线性转换关系,基于bilinear转换的离散和连续系统的失真比
%        较小;另一个角度可以看出T过大或者W过大,都会加剧失真
%      3.freqz得到的频率W1需要进行转换,绘制的图才能和bode绘制图对应上(数学关系暂未推导) 
%      4.绘图注意:刻度和单位区分开;图1,2,3的区别:直接freqz绘制的图1与图3一致;图2 xy刻度为指数10^k;图3 x刻度为k,y刻度为db;
%        图4:标准bode图(x刻度10^k,y刻度db)
%      5.从图4可以看出离散系统用tustin转连续系统的bode图其截止频率是畸变了的。离散的为30*2pi,连续系统为275 rad/s。
fs = 50;
w_1 = 0:0.1:100;
% 可以看到butter函数源码是使用了双线性变化,并对截止频率进行预畸处理
[b1,a1] = butter(2,30/(fs/2)); %数字滤波DF,截止频率为30Hz; 
sys_1 = tf(b1,a1,1/fs);
[H1,W1]=freqz(b1,a1);
mag1=abs(H1); % 取幅度值实部
pha1=angle(H1); % 取相位角
db1=20*log10(mag1+eps); % 转换为分贝
f1=W1*fs/(2*pi); % 将 数字角频率 转为对应的 模拟频率Hz(w=ΩT*2pi-> Ω=w*fs/(2pi))

figure(1)
freqz(b1,a1,w_1,fs);hold on;
figure(2)
loglog(f1,mag1);
figure(3)
plot(f1,db1);
figure(4)
sys_1_2c = d2c(sys_1,'tustin');
% bode图绘制的是以角频率为横坐标的单位,为Hz*2*pi
bode(sys_1,'r',sys_1_2c,'b');hold on;legend('离散系统','连续系统');
% ********************************************************************************************************


% *****************二、从模拟滤波的角度去分析,freqs与bode绘制的图像区别**************************************
% 结论: 1.绘图注意:freqz和freqs绘制出的图刻度不一致需区别开,freqz刻度是:x为k,y为db;freqs刻度是:xy都是10^k
%         其他同上述离散系统的分析一样;
%       2. loglog(w_1,mag2) = plot(w_1,20*log10(mag2)),区别是横坐标的刻度,前者是10^k一个刻度,后者k一个刻度
[b2,a2] = butter(2,40,'s'); %模拟滤波AF,截止频率为40rad/s
sys_2 = tf(b2,a2);
w_2 = logspace(-1, 3);
[H2,W2]=freqs(b2,a2,w_2); % W2为角频率rad/s
mag2=abs(H2);% 取幅度值实部
pha2=angle(H2);% 取相位角

figure(1)
freqs(b2,a2,w_2)% 绘制的是幅值对数图,分子分母刻度都是10^
figure(2)
loglog(w_2,mag2);% 分子分母刻度都是10^k
figure(3)
plot(w_2,20*log10(mag2))% 分子分母刻度都是均匀刻度k,所以与图1有区别,但是各点的值都对得上
figure(4)
bode(sys_2);hold on; % 绘制的是标准bode图(x刻度10^k,y刻度db)
% ***********************************************************************************************************

%% 双线性预畸变处理前后区别及分析
% ***********************************一、双线性预畸变处理频域验证基于低通****************************************
%! ** matlab对sys_2进行双线性变换变成离散系统 **
% 结论:1.图5中离散系统相对连续系统依然发生了截止频率畸变,和前面分析一样,且离散的频率<连续的频率。离散映射到连续的频率
%       为 wa=2/T*tan(wd*T/s)。
%       2.sys_2_c2d和sys_3都是sys_2进行 s=2/T * (1-z^-1)/(1+z^-1)得来的,两者相等,验证了c2d函数的实现。不涉及预畸变
%       3.图6可以得到预畸变处理的离散系统bode图符合预期的40rad/s的截止频率
Ts = 1/fs;
sys_2_c2d = c2d(sys_2, Ts, 'tustin');
figure(5)
bode(sys_2_c2d,'r--',sys_2,'b');hold on; legend('离散系统','连续系统');
%! ** 手动对sys_2进行双线性变换变成离散系统,不对wc预畸变处理 **
yinzi =(4/Ts^2) + 2*56.57/Ts+1600;
aa1 = 1;
aa2 = (-8/Ts^2 + 3200)/yinzi;
aa3 = ((4/Ts^2)-2*56.57/Ts+1600)/yinzi;
bb1 = 1600/yinzi;
bb2 = 3200/yinzi;
bb3 = 1600/yinzi;
sys_3 = tf([bb1 bb2 bb3], [aa1 aa2 aa3], Ts);

%! **对sys_2进行双线性变换变成离散系统,预畸变处理,希望数字滤波的截止频率为40 rad/s**
wc_1 = 2/Ts * tan(40*Ts/2);
[b6, a6] = butter(2,wc_1, 's');
sys_6_s = tf(b6,a6);
bode();hold on;
sys_6_z = c2d(sys_6_s, Ts, 'tustin');
figure(6)
bode(sys_6_z,'r--',sys_6_s,'b');hold on; legend('离散系统','连续系统');
% ***********************************************************************************************************


% *****************************二、双线性预畸变处理频域验证基于带通滤波器****************************************
%  传递函数为: C =     s
%                  ————————————
%                   s² + wc²

%! **不进行双线性变换的预畸变处理**
% 连续系统的带通中心频率为 Wc
% 但离散系统的中心频率发生的畸变,
wc = 100; % 中心频率Hz
T = 0.002;
Wc = 2 * pi * wc; % 中心频率rad/s
Ca = tf([1,0],[1 0 Wc^2]);  
Cd = c2d(Ca, T,'tustin');
figure(7)
bode(Ca, Cd);
legend('Ca','Cd')

%! **进行预畸变处理**
% 使得预畸变后的连续系统通过双线性变换后的中心频率在我们期望的Wc处
Wc_deal = 2/T * tan(Wc*T/2);
Ca_deal = tf([1, 0], [1 0 Wc_deal^2]);
Cd_deal = c2d(Ca_deal, T,'tustin');
figure(8)
bode(Ca_deal, Cd_deal);
legend('Ca_deal', 'Cd_deal');
% **********************************************************************************************************

参考文章

当然我是基于我的理解去表达的,读者可能或多或少存在这样那样疑问,我筛选出我看过质量比较好的文章附上
[1].模拟滤波器转化为数字滤波器
[2]. 双线性变换
[3]. 常用的传递函数离散化方法,差分,双线性,预矫正双线性,matlab源码
[4]. 数字信号处理——IIR滤波器设计
[5]. 使用Matlab设计数字滤波器,从原理到代码

### 回答1: freqz和freqsMatlab用于计算数字滤波器频率响应的函数。 freqz函数用于计算数字滤波器的离散时间傅里叶变换(DTFT),并返回频率响应的幅度和相位。它可以用于绘制数字滤波器的幅度响应和相位响应图。 freqs函数用于计算数字滤波器的连续时间傅里叶变换(CTFT),并返回频率响应的幅度和相位。它可以用于绘制数字滤波器的幅度响应和相位响应图。 这两个函数都是Matlab非常常用的数字信号处理工具,可以帮助工程师和科学家分析和设计数字滤波器。 ### 回答2: MATLAB是一种强大的数学计算软件,被广泛应用于科学、工程和金融领域。在信号处理的应用,频率响应是一个重要的概念,它描述了系统对不同频率的输入信号的响应情况。为了方便频率响应的计算和绘制,MATLAB提供了freqz和freqs函数。 freqz函数属于MATLAB数字滤波函数,通常用于评估数字滤波器的频率响应。该函数的基本语法为:[h, w] = freqz(b, a, n),其b和a是数字滤波器的分子和分母系数,n是离散频率范围,w是离散角频率(单位:弧度/秒),h是包含数字滤波器频率响应值的复数向量。该函数计算并返回数字滤波器的幅度和相位响应,并生成相应的频率响应图表。 freqs函数属于MATLAB模拟滤波函数,通常用于评估模拟滤波器的频率响应。该函数的基本语法为:[h, w] = freqs(b, a, w),其b和a是模拟滤波器的分子和分母系数,w是离散频率范围(单位:弧度/秒),h是包含模拟滤波器频率响应值的复数向量。该函数计算并返回模拟滤波器的幅度和相位响应,并生成相应的频率响应图表。 需要注意的是,freqz和freqs函数的输入参数略有不同,分别适用于数字滤波器和模拟滤波器,因此使用时需要注意选择合适的函数。同时,由于频率响应计算需要大量的数学运算,因此在使用这些函数时需要进行一定的计算速度优化,比如使用矩阵运算等技巧。 ### 回答3: 在信号处理,频率响应是描述系统传输函数在不同频率下的反应的一种方式。MATLAB有两个主要的频率响应函数——freqz和freqs。它们分别用于离散时间信号和连续时间信号。 freqz:function: freqz函数是以数字系统的形式提供的。它通过计算离散系统的频率响应来计算传输函数。使用频率响应和幅度响应来描述信号的频率特性。在使用函数时,用户需要输入数字滤波器的系数,然后freqz函数将生成一个具有幅度和相位响应的结果图。此图可以帮助用户理解数字滤波器的效果并调整系统参数。freqz函数可以根据用户需要,使用matlab支持的库来完成函数调用。 freqs:function: freqs是一个连续信号系统的函数。它允许用户计算线性时间不变系统的幅度和相位响应,在频域可视化系统的响应。freqs接受用户输入的分子和分母的多项式,然后计算传输函数H(s)。函数freqs还可以计算在极点和零点对应传输函数的阻尼和共振频率。此功能可以帮助用户了解系统在特定频率下的特性,并应用这些特性来优化控制系统的性能。同样,函数freqs也可以使用matlab库完成函数调用。 总之,freqz和freqs函数MATLAB用于分析系统的频率响应的两个最常用的函数。同时,这两个函数可以通过与其他MATLAB工具的配合使用,比如调用filter函数将不同的滤波器和信号串联在一起,进行音频和图像的信号处理。对于需要理解MATLAB数字滤波、控制系统、通信系统等的读者,频率响应函数是不可或缺的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值