文章目录
前言
这一系列文章总的来说应该分为四个大的部分:
第一部分包括数字信号与模拟信号,信号与系统。这一块主要介绍的是时域上的语音信号,以及分析信号使用到的工具卷积和和差分方程。
第二部分是对于傅里叶变换、Z变换的介绍。这一块主要是如何将时域信号转换为频域表示。
第三部分是对于频域上的分析,当然会专门对于数字信号,也就是应用到数字系统中频域的分析进行学习。
第四部分也就是最终的目的,是学习如何设计一个数字滤波器。
本篇文章中,将先越过第四部分先对于滤波器进行一个整体的介绍,这么做的原因是由于针对于数字系统中的频域分析,大多会应用到滤波器中。
|版本声明:山河君,未经博主允许,禁止转载
一、滤波器的介绍
1.定义
滤波器(Filter)是一种信号处理工具,主要用于处理信号频率部分
2.滤波器的作用
它可以通过阻挡特定频率范围内的信号,选择性的允许某些我们需要的信号通过,或者抑制和削弱其他频率的信号。以下是它的主要作用:
- 去除噪声
消除不需要的高频或者低频的噪声,从而改善信号清晰度。 - 信号分离
在多频信号中,滤波器可以分离出特定频率的信号,对特定频率信号进行进一步处理。 - 信号平滑
通过去除高频分量(尖锐的变化和波动),去除不连续性或者突发性的变化,从而减少抖动和干扰。 - 波形整形
可以改变信号的波形,从而更适合传输。 - 频带分割
将多个频率的信号分离出来,从而可以更容易处理低音、中音和高音。 - 频率选择
根据需求选择抑制特定频率部分,从而改变音质 - 消除失真
消除电流和电压中的失真,避免设备受损 - 信号调制
可以提取特定的载波信号,帮助接收端还原正确信息
3.滤波器的种类
根据实现方式的不同,滤波器可以分为:
- 模拟滤波器:基于电容、电感、电阻等电子元件,可以直接处理模拟信号
- 数字滤波器:通过算法对离散数字信号进行处理,纯数字域的处理
从滤波器对于信号频率处理的特征,可以分为:
选频滤波器种类 | 原理 | 作用 |
---|---|---|
低通滤波器(Low-Pass Filter, LPF) | 允许低频信号通过,阻止高频信号 | 如从含噪声的信号中去除高频噪声 |
高通滤波器(High-Pass Filter, HPF) | 允许高频信号通过,阻止低频信号 | 如去除信号中的低频干扰,如电力线噪声 |
带通滤波器(Band-Pass Filter, BPF) | 允许某一频段范围内的信号通过,抑制其他频段的信号 | 如在通信系统中提取特定频段的信号 |
带阻滤波器(Band-Stop Filter, BSF) | 阻止某一频段的信号通过,而允许其他频段信号通过 | 如去除50 Hz或60 Hz的电源噪声 |
全通滤波器(All-Pass Filter) | 允许所有频率的信号通过,但会改变它们的相位而不是幅度 | 主要用于调整信号的相位响应 |
三、FIR和IIR滤波器
1.滤波器和LTI的关系
滤波器设计中,线性时不变(LTI)特性是许多滤波器的核心要求,因为它带来了数学上简单且可预测的特性,使滤波器在各种信号处理任务中更易于分析和实现。以下是滤波器要求线性时不变的主要原因:
- 易于分析和实现
- 线性性:线性系统满足叠加原理
- 时不变性:时不变性意味着系统对输入信号的响应不会随时间改变
- 频域分析的便利性
- LTI 系统的一个核心特性是可以使用傅里叶变换或拉普拉斯变换来分析
- 设计简单
- LTI 系统可以通过其 冲激响应 或 频率响应 完全描述
- 滤波器的实现只需基于卷积操作
2.滤波器阶数
对于大部分应用FIR和IIR滤波器的场景,通常是在时域和频域上进行降噪,回声消除等等的操作。
对于这部分应用,FIR和IIR不仅仅包含线性时不变系统的特征,还包含动态系统(有记忆系统)的特征,也就是说,该滤波器的输出,不仅仅要考虑当前信号的输入,也要考虑之前信号的输入。
滤波器阶数N/M:指的是滤波器冲激响应的长度,或者说滤波器所用到的输入信号和输出信号的过去样本数。
3.FIR滤波器
FIR滤波器是只一个具有有限长冲激响应的系统。这里的有限长冲激响应指的是,在输入一个单位脉冲后,系统的输出在有限时间内变为零。
FIR滤波器数学上表示为:
y
[
n
]
=
∑
k
=
0
M
−
1
h
[
k
]
x
[
n
−
k
]
y[n] = \sum_{k=0}^{M-1} h[k]x[n-k]
y[n]=k=0∑M−1h[k]x[n−k]
实际上是差分方程去除过去输入信号的反馈,同等于卷积公式,在音频进阶学习四——线性时不变系统之卷积和中有详细介绍。
4.IIR滤波器
和FIR滤波器不同,IIR滤波器不仅依赖当前和过去的输入,还依赖过去的输出。所以IIR滤波器还存在反馈输出的结构,导致其冲激响应在理论上是无限长的。
而IIR滤波器是根据差分方式表示:
y
[
n
]
=
∑
k
=
0
M
b
k
x
[
n
−
k
]
−
∑
k
=
1
N
a
k
y
[
n
−
k
]
y[n] = \sum_{k = 0}^M b_kx[n-k] - \sum_{k=1}^Na_ky[n-k]
y[n]=k=0∑Mbkx[n−k]−k=1∑Naky[n−k]
其中:
- b k b_k bk:输入信号的系数(前馈部分)
- a k a_k ak:输出信号的系数(反馈部分)
- M M M:前馈滤波器的阶数
- N N N:反馈滤波器的阶数
在音频进阶学习六——递归/非递归离散时间系统与差分方程中有介绍。
5.FIR和IIR的区别
- FIR滤波器没有反馈,IIR滤波器有反馈
- FIR滤波器:FIR滤波器没有反馈机制,意味着输出仅依赖于当前和过去的输入值。它的结构简单,计算只涉及加法和乘法,所有的信号处理都是“前馈”式的,没有反馈环路。这样的设计使得FIR滤波器的实现非常直接,也容易在硬件和软件中实现。
- IIR滤波器:IIR滤波器包含反馈机制,输出不仅依赖于输入信号,还依赖于之前的输出值(即反馈部分)。反馈会引入一些复杂的动态特性,需要在计算过程中处理这些反馈。实现时需要确保系统的稳定性和精确性,特别是在数字实现中,反馈回路可能导致数值不稳定或误差积累问题。
- FIR滤波器是稳定的,IIR滤波器可能不稳定
- FIR滤波器:由于没有反馈,FIR滤波器始终是稳定的。只要滤波器的系数被正确设计,计算过程没有依赖之前输出值的负反馈,因此不会出现稳定性问题。其冲激响应是有限的,随着时间的推移,系统自然不会发散。
- IIR滤波器:由于IIR滤波器包含反馈部分,它的稳定性更难控制。如果反馈系数选择不当,可能会导致滤波器的输出发散或不稳定。IIR滤波器的极点必须位于单位圆内(在Z域上),才能保持稳定,而这个条件在实现过程中需要特别关注。因此,在数字实现中,IIR滤波器的稳定性常常需要额外的算法和技巧来保证,尤其是在高阶IIR滤波器时。
- FIR滤波器容易实现线性相位,IIR滤波器很难实现线性相位
- FIR滤波器:FIR滤波器的设计可以非常方便地实现线性相位,这对于许多信号处理应用(如音频处理、图像处理等)非常重要。线性相位意味着滤波器不会引入信号的相位畸变,使得输入和输出信号之间的相位关系保持一致。在FIR滤波器中,只需要设计合适的系数,就可以确保其相位响应是线性的。
- IIR滤波器:IIR滤波器由于包含反馈回路,通常不容易实现线性相位。IIR滤波器的相位响应通常是非线性的,意味着它可能会对信号的相位产生畸变。虽然可以通过特殊设计的IIR滤波器实现近似线性相位,但要精确实现线性相位通常非常困难,且可能导致滤波器的设计变得更加复杂。
对于线性相位的处理,在以后的文章中会提到。
6.IIR系统的稳定性
上文中提到对于IIR滤波器如果是稳定的,在Z域上分析需要所有的极点必须在单位圆上。但是由于存在反馈,系统的输出会影响到整个系统的稳定,所以对于IIR滤波器来说,分析极点不能单独分析系统输出的Z变换 Y ( z ) Y(z) Y(z)。
从上一篇文章中音频进阶学习十三——Z变换二(有理z变换、稳定性与反变换),我们知道,对于差分方程的传递函数为:
H
(
z
)
=
Y
(
z
)
X
(
z
)
=
a
0
+
a
1
z
−
1
+
.
.
.
+
a
N
z
−
N
b
0
+
b
1
z
−
1
+
.
.
.
+
b
M
z
−
M
H(z)=\frac{Y(z)}{X(z)}=\frac{a_0+a_1z^{-1}+...+a_Nz^{-N}}{b_0+b_1z^{-1}+...+b_Mz^{-M}}
H(z)=X(z)Y(z)=b0+b1z−1+...+bMz−Ma0+a1z−1+...+aNz−N
所以对于IIR滤波器整体来说,分析稳定性是分析传递函数的稳定性。也就是分析
X
(
z
)
=
0
X(z)=0
X(z)=0的情况。
四、FIR滤波器示例
原始音频
现在准备几段音频:
蜂鸣器的语音时域
与之相对应频域图像
女声朗读语音时域
它的频域图是
两者叠加后语音时域
那么两者叠加后的频域图是(由于蜂鸣器幅值太高,看起来人声就变小了)
FIR的带阻滤波器过滤
根据上文中对于滤波器的介绍,我们知道带阻滤波器是阻止某一频段的信号通过,而允许其他频段信号通过。
设计一个带阻滤波器,过滤1k频率的,matlab代码如下:
fileId=fopen("./output.pcm", 'rb');
pcmData=fread(fileId,'int16');bw = 5;
f0 = 1000;
fs = 16000;
d=designfilt('bandstopiir', 'FilterOrder', 2, ...
'HalfPowerFrequency1', f0 - bw/2, ...
'HalfPowerFrequency2', f0 + bw/2, ...
'DesignMethod', 'butter', ...
'SampleRate', fs);
N = length(pcmData);
f = (0:N-1)*(fs/N);
Y = fft(pcmData);
Y_filtered = fft(filterData);
subplot(2, 1, 1);
plot(f, abs(Y));
title('Original Signal Spectrum');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
subplot(2, 1, 2);
plot(f, abs(Y_filtered));
title('Filtered Signal Spectrum');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
对比滤波前和滤波后的时域图:
滤波后的频域图:
总结
本文使用了一个带阻滤波器对于原始语音进行了滤波,过滤了蜂鸣器的声音。这一部分在以后的文章中会结合频域分析进一步为滤波器设计打好铺垫。
反正收藏也不会看,不如点个赞吧!