信号与系统/滤波器设计
拉普拉斯变换允许根据电容和电感元件的微分方程分析电路的频率响应。滤波器设计首先要找到合适的传递函数,以便根据频率对信号的某些部分进行放大,而对其他部分进行衰减。
选择合适的滤波器结构并推导出系数值是维基教科书信号处理中进一步讨论的主题,该教科书涉及信号与系统应用。
根据频率内容分离相同传输通道中的信号和噪声或不同信号,最好使用砖墙滤波器,该滤波器在通带中显示完全传输,在附近的阻带中显示完全衰减,并且具有急剧的过渡。
这可以通过傅里叶变换来完成,傅里叶变换提供了给定信号的频率内容的完整信息。计算出傅里叶变换后,可以将不需要的频率内容归零,并计算逆傅里叶变换,以提供使用砖墙规范滤波的信号。
傅里叶变换由下式给出
可以发现,傅里叶变换积分由于其无限边界,必须从我们宇宙诞生的那一天一直计算到宇宙衰败的那一天,才能完全计算出来。只有在那时,才能提供理想的砖墙滤波信号。
更专业地说,理想砖墙滤波器存在无限延迟。
模拟电路的分析表明,它们的输出与其输入通过一组微分方程相关联。拉普拉斯变换将这些微分方程改写为复变量的一组线性方程。
因此,可实现模拟滤波器的传递函数可以写成的两个多项式函数的比值
因此,模拟滤波器设计的问题是找到一对多项式函数,它们合在一起最接近理想但不可实现的砖墙传递函数。
在早期电子信号处理的年代,科学家们想出了滤波器函数,这些函数在今天仍然被广泛使用。他们设计出的函数都是低通类型的。频率变换技术允许为其他滤波器类型找到多项式,例如高通和带通。
模拟滤波器的传递函数是 两个多项式函数的比率。
变量 是一个复数,可以写成 。复平面是一个平面,其中虚轴垂直,水平轴是实部。
传递函数分子多项式的根称为传递函数零点。传递函数分母多项式的根称为传递函数极点。
传递函数可以写成其零点 ,其极点 和一个额外的增益因子 的形式
可以在复平面上绘制传递函数的极点和零点。它们的位置提供了有关系统频率响应的信息。事实上,频率响应等于传递函数取为 ,它位于虚轴上。
一个稳定的LTI 系统的所有极点都位于 的左侧半平面。
如果一个极点位于虚轴上,在 ,那么传递函数的因子 在点 处将是无限的,全局频率响应 也是如此。这种情况的一个特例是积分器:它在 处有一个极点,并且对于一个恒定、非零的输入,确实具有一个长期无限的输出。
对于靠近虚轴的极点,频率响应在接近它们的频率处具有较大的幅度。换句话说,靠近虚轴的极点表示通带。
零点的影响
[edit | edit source]如果一个零点位于虚轴上,在 ,则传递函数的因子 在点 为零,因此全局频率响应 也是如此。
位于虚轴上或靠近虚轴的零点表示阻带。
设计滤波器
[edit | edit source]为给定的滤波器功能设计合适的传递函数需要经过以下步骤:
最后,使用分子和分母系数来计算所选 滤波器电路 的元件值。
示例:低通滤波器
[edit | edit source]CCITT G712 输入滤波器规格的简化版本,仅给出低通部分,如侧边图所示。
通带向上延伸到 ,并允许最大纹波为 。阻带要求在 处衰减 ,在 以上衰减 。
滤波器函数
[edit | edit source]第一步,我们需要选择一个 滤波器函数。
诸如 Octave 或 Matlab 之类的程序提供了可以确定满足给定规范所需的最小滤波器阶数的函数。在选择可能的函数时,这是一个很好的帮助。
但是,我们这里任意选择一个 巴特沃斯传递函数。
标准化滤波器函数
[edit | edit source]以下 Octave 脚本允许绘制从 8 阶到 16 阶的标准化巴特沃斯传递函数的幅度。
#------------------------------------------------------------------------------- # Specifications # fs = 40E3; fPass = 3000; rPass = 0.125; fStop1 = 4000; rStop1 = 14; fStop2 = 4600; rStop2 = 32; pointNb = 1000; AdbMin = 40; makeGraphics = 1; figureIndex = 0; #=============================================================================== # Normalized filter function # wLog = 2*pi*logspace(-1, 1, pointNb); fc = 0.87; Adb = []; for order = 8:16 [num, den] = butter(order, 2*pi, 's'); while ( length(num) < length(den) ) num = [0, num]; endwhile; Adb = [Adb; 20*log10(abs(freqs(num, den, wLog)))]; endfor Adb(Adb < -AdbMin) = -AdbMin; figureIndex = figureIndex+1; figure(figureIndex); semilogx(wLog/(2*pi), Adb); hold on; semilogx([wLog(1)/(2*pi), fc, fc], -[rPass, rPass, AdbMin], 'r'); semilogx([fStop1*fc/fPass, fStop1*fc/fPass, fStop2*fc/fPass, fStop2*fc/fPass, wLog(length(wLog))/(2*pi)], ... -[0 , rStop1, rStop1, rStop2, rStop2 ], 'r'); hold off; axis([wLog(1)/(2*pi), wLog(length(wLog))/(2*pi), -AdbMin, 0]); grid; xlabel('frequency [Hz]'); ylabel('amplitude [dB]'); if (makeGraphics != 0) print -dsvg g712_butterworth_normalized.svg endif
下图显示了结果:至少需要 13 阶巴特沃斯滤波器才能满足规格。
在图形上,可以注意到所有幅度响应都在 -3 dB 处通过同一个点。
规格频率已被缩放到适合 1 Hz 的标准化截止频率。在脚本中,可能注意到一个额外的缩放因子 fc = 0.87
:这是由于拐角截止幅度为 -0.125 dB 而不是 -3 dB。该值在本例中已通过手动调整。同样,Octave 或 Matlab 脚本可以自动执行此任务。
非标准化滤波器函数
[edit | edit source]标准化传递函数的 频率缩放 是通过替换完成的
以下 Octave 脚本通过将分子和分母系数乘以适当的 幂来实现这一点。
#------------------------------------------------------------------------------- # Denormalized filter function # order = 13; wLog = 2*pi*logspace(2, 5, pointNb); fc = 0.87; [num, den] = butter(order, 2*pi, 's'); while ( length(num) < length(den) ) num = [0, num]; endwhile; for index = 1:order+1 num(index) = num(index) * (fPass/fc)^(index-1); den(index) = den(index) * (fPass/fc)^(index-1); endfor Adb = 20*log10(abs(freqs(num, den, wLog))); Adb(Adb < -AdbMin) = -AdbMin; figureIndex = figureIndex+1; figure(figureIndex); semilogx(wLog/(2*pi), Adb); hold on; semilogx([wLog(1)/(2*pi), fPass, fPass], -[rPass, rPass, AdbMin], 'r'); semilogx([fStop1, fStop1, fStop2, fStop2, wLog(length(wLog))/(2*pi)], ... -[0 , rStop1, rStop1, rStop2, rStop2 ], 'r'); hold off; axis([wLog(1)/(2*pi), wLog(length(wLog))/(2*pi), -AdbMin, 0]); grid; xlabel('frequency [Hz]'); ylabel('amplitude [dB]'); if (makeGraphics != 0) print -dsvg g712_butterworth.svg endif
现在,分子和分母系数已准备好用于计算所选 滤波器电路 的元件值。