双线性变换(Tustin transform/bilinear transformation)

双线性变换是一种用于连续时间系统与离散时间系统转换的技术,常用于滤波器设计。它通过共形映射保持稳定性,并保留模拟滤波器的频率响应特性。双线性变换的表达式涉及拉普拉斯变换和Z变换,能够防止频谱混叠,但可能导致频率失真。该变换还允许调整模拟和数字系统的截止频率,确保稳定性和频率响应的一致性。
摘要由CSDN通过智能技术生成

目录

双线性变换的概念

双线性变换表达式

保留稳定性及最小相位性质

防混叠性质


在数字信号处理和离散时间的控制理论中,双线性变换(Tustin变换)被用来在连续时间系统与离散时间系统做转换。

双线性变换的概念

双线性变换是一种特别的共形映射(即莫比乌斯变换,又称保形变换),常被用来将线性非时变系统滤波器在连续时域的传递函数转换成线性且平移不变滤波器在离散时域的传递函数。将s平面中位置在j\omega轴的点映射到复平面上的单位圆|z|=1。其他的应用还有扭曲任何的离散时间线性系统的频率响应(例如用来估计人类听觉系统的非线性频率清晰度)或是被用在离散域以取代一个系统经过一阶全通滤波器的单位延迟。

这种变换保有稳定性且将连续时间滤波器的频率响应中每一点映射到离散时间滤波器的频率响应中所对应的点,虽然频率会有点不同,这部分会在之后的频率扭曲中解释。对于模拟滤波器的频率响应中所看到的特征,在数字滤波器的频率响应中都有相同增益和相位平移的对应特征,虽然频率可能有点不同,在低频时很难观察到但在频率接近Nyquist频率时就相当明显。

双线性变换表达式

双线性变换是自然对数函数的一阶估计法,也就是将z平面映射到s平面,当拉普拉斯变换被用在离散时间信号上(将离散时间串行中的每个元素附在对应的延迟狄拉克\delta函数),其结果确实为将离散时间串行的Z变换替代成:

z=e^{sT}=\frac{e^{sT/2}}{e^{-sT/2}}\approx \frac{1+sT/2}{1-sT/2}\\ =1+2(sT/2)+2(sT/2)^{2}+2(sT/2)^{3}+\cdot\cdot\cdot

其中T是用在推导双线性变换的梯形公式中数值积分每阶的大小,换句话说就是采样间距。上式中分子和分母与s都是线性关系,所以这个式子就叫双线性变换。上述的双线性估计可以透过s来解或是产生一个近似估计s=(1/T)\ln(z)

逆映射则为:

s=\frac{1}{T}=\frac{2}{T}\left [ \frac{z-1}{z+1}+\frac{1}{3}\left ( \frac{z-1}{z+1} \right )^{3}+\frac{1}{5}\left ( \frac{z-1}{z+1} \right )^{5}+\frac{1}{7}\left ( \frac{z-1}{z+1} \right )^{7}+\cdot \cdot \cdot \right ]\\ \approx\frac{2}{T}\frac{z-1}{z+1}=\frac{2}{T}\frac{1-z^{-1}}{1+z^{-1}}

双线性变换的本质是使用这种一阶估计法且将连续时间传递函数H_{a}(s)中s替换成:

s\rightarrow \frac{2}{T}\frac{z-1}{z+1}

也就是说:

H_{d}(z)=H_{a}(s)|_{s=\frac{2}{T}\frac{z-1}{z+1}}=H_{a}\left (\frac{2}{T}\frac{z-1}{z+1} \right )

保留稳定性及最小相位性质

如果有一个连续时间且有因果性的滤波器,其传递函数的极点落在复数s平面的左半边,此滤波器则为稳定的。如果有一个离散时间且有因果性的滤波器,其传递函数的极点落在复数z平面的单位圆内,此滤波器则为稳定的。双线性变换将复数s平面的左半边映射到复数z平面的单位圆内,因此稳定的连续时间滤波器被转变成离散时间滤波器后也保有稳定性。

另外2/T=c是一个任意正常数,用来把模拟频率映射到数字频率。在高通或低通滤波器中,其通常用来使模拟和数字之间的截止频率等同。根据上面关系可知s域负半轴平面与z域中的单位圆内相对应。

image

s=j\omega_{a}z=e^{j\omega_{d}T}(T为采样间隔)代入双线性变换公式可以得到:

j\omega_{a}=c\frac{1-e^{-j\omega_{d}T}}{1+e^{-j\omega_{d}T}}=c\frac{e^{j\omega_{d}T}-1}{e^{j\omega_{d}T}+1}\\ =c\frac{e^{-j\omega_{d}T/2}(e^{j\omega_{d}T/2}-e^{-j\omega_{d}T/2})}{e^{-j\omega_{d}T/2}(e^{-j\omega_{d}T/2}+e^{-j\omega_{d}T/2}))}\\ =jc\frac{\sin(\omega_{d}T/2)}{\cos(\omega_{d}T/2)}\\ =jc\tan(\omega_{d}T/2)

当模拟域的截止频率\omega_{c}=1时,常数c:

c=\cot(\omega_{c}T/2)

上式中的\omega_{c}为数字滤波器的截止频率。

防混叠性质

另外双线性变换可以防止频谱的混叠:

s=jc\tan(\omega_{d}T/2)=\sigma+j\Omega=j\Omega

可以得到:

\Omega=\frac{2}{T}\tan(\omega_{d}T/2)

可以写出上式的逆变换:

\Omega=\frac{2}{T}\tan(\omega_{d}T/2) \omega_{d}=\frac{2}{T}\arctan(\Omega T/2)

上式中\omega_{d}是数字角频率,\Omega是模拟角频率。

可以将上式画出相应的曲线:

可以看出所有的模拟角频率都被压缩到(0,\pi)之中,但是却依然能保持单值对应,虽然消灭了频谱混叠,但是由于这个出发点是在原点进行泰勒展开做近似的,最后的频谱会存在一定的失真。

 

 

 

 

 

 

 

 

 

 

 

### 回答1: 滤波器的线性变换是一种常用的数字滤波器设计方。它可以将模拟滤波器转换为数字滤波器,并且能够保持模拟滤波器的频率响应特性。下面我将用300字向你解释滤波器的线性变换的C代码实现。 在进行滤波器线性变换之前,首先需要定义一个模拟滤波器的传递函数H_s(s)。具体的定义根据滤波器的类型和设计要求而定。接下来,我们需要将传递函数H_s(s)转换为一个数字滤波器的传递函数H(z)。 在C代码中,线性变换的实现通常包括以下几个步骤: 1. 预处理步骤: - 定义采样频率Fs和模拟滤波器的截止频率Fc。 - 计算数字滤波器的截止频率Wc,用于后续的变换计算。 2. 计算变换系数: - 根据预处理步骤中计算得到的Wc,计算变换系数A和B: A = (2 * Fs + Wc) / (2 * Fs - Wc) B = (Wc - 2 * Fs) / (Wc + 2 * Fs) 3. 定义数字滤波器的传递函数: - 定义一个长度为滤波器阶次+1的数组coeff[]来存储数字滤波器的系数。 - 对于每个系数coeff[i],根据模拟滤波器的传递函数H_s(s)进行计算: coeff[i] = A * H_s(s[i]) - B * H_s(-s[i]) ,其中s[i]是离散频率点。 4. 应用数字滤波器: - 进行滤波操作的时候,需要对输入信号x[n]和输出信号y[n]定义一个缓冲数组x_buf[]和y_buf[]。 - 遍历每个输入样本x[n],对应的输出样本y[n]可以通过以下表达式计算: y[n] = coeff[0] * x[n] + coeff[1] * x[n-1] + ... + coeff[N] * x[n-N] ,其中N是滤波器的阶次。 通过以上步骤,我们可以在C代码中实现滤波器的线性变换。这种方可以用于各种类型的滤波器设计,包括低通、高通、带通和带阻滤波器。 ### 回答2: 滤波器线性变换是一种将连续时间域滤波器转换为离散时间域滤波器的方,常用于数字信号处理中。下面是一个用C代码讲解滤波器线性变换的示例。 假设我们有一个连续时间域的滤波器表达式H(s),我们想要将其转换为离散时间域滤波器表达式H(z)。首先,我们需要将滤波器的传递函数表达式进行拉普拉斯变换,然后应用线性变换来将拉普拉斯变换的表达式转换为离散时间域的表达式。 具体步骤如下: 1. 定义连续时间域滤波器的传递函数表达式H(s),例如H(s) = (s + a)/(s + b),其中a和b是常数。 2. 进行拉普拉斯变换,将传递函数表达式转换为拉普拉斯域表达式H(s) = NUM(s)/DEN(s),其中NUM(s)和DEN(s)是多项式表达式。 3. 定义采样频率Fs和采样周期T,通常与实际应用的离散时间信号的采样频率保持一致。计算线性变换的参数alpha和omega,其中alpha = 2/T * tan(omega*T/2)。 4. 将H(s)的拉普拉斯表达式中的s替换为alpha,即H(s) = NUM(alpha)/DEN(alpha)。 5. 使用Tustin进行分式的展开,得到离散时间域的表达式H(z) = NUM(z)/DEN(z)。这里z是离散时间变量。 6. 将展开后的离散时间域表达式H(z)进行因式分解和整理,得到离散时间域滤波器的差分方程表示。 总结来说,滤波器线性变换是将连续时间域滤波器转换为离散时间域滤波器的一种方,可以使用C代码实现。通过拉普拉斯变换和线性变换的步骤,我们可以得到离散时间域滤波器的表达式,进而实现信号的滤波处理。 ### 回答3: 滤波器的线性变换是一种将连续-time滤波器转换成离散-time滤波器的方。通过这种变换,可以将连续-time滤波器设计的方应用到离散-time滤波器上。 线性变换的c代码示例如下: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define N 4 // 滤波器阶数 void bilinearTransform(double b[], double a[], double bb[], double aa[]); int main() { // 初始化连续-time滤波器系数 double b[] = {1, 2, -3, -4}; double a[] = {1, -2, 1}; // 定义离散-time滤波器系数 double bb[N+1] = {0}; double aa[N+1] = {0}; bilinearTransform(b, a, bb, aa); printf("离散-time滤波器系数b:"); for(int i=0; i<=N; i++) { printf("%.2f ", bb[i]); } printf("\n离散-time滤波器系数a:"); for(int i=0; i<=N; i++) { printf("%.2f ", aa[i]); } return 0; } // 线性变换计算 void bilinearTransform(double b[], double a[], double bb[], double aa[]) { double c = 2.0; for(int i=0; i<=N; i++) { for(int j=0; j<=N; j++) { bb[i] += b[j] * pow(c, j-i); } } for(int i=0; i<=N; i++) { for(int j=0; j<=N; j++) { aa[i] += a[j] * pow(c, j-i); } } } ``` 上述代码中,首先定义了连续-time滤波器的系数`b`和`a`,然后定义了离散-time滤波器的系数`bb`和`aa`。接下来调用`bilinearTransform`函数进行线性变换的计算。 在`bilinearTransform`函数中,使用了嵌套循环来计算系数。首先计算离散-time滤波器的系数`bb`,通过连续-time滤波器系数`b`和线性变换的公式,即将连续-time滤波器的幂次项根据`c`进行求解。 接着计算离散-time滤波器的系数`aa`,方同上。最后返回计算得到的离散-time滤波器系数。 最后,在`main`函数中打印输出离散-time滤波器的系数`bb`和`aa`。 这样就利用c代码进行了滤波器线性变换的讲解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值