基于Matlab App Designer的语音信号分析与处理(二):IIR和FIR滤波器的设计,语音信号的滤波

接上文:https://blog.csdn.net/weixin_53877178/article/details/122470759

 

目录

一、课题的任务

二、内容、步骤和要求

(1)语音信号的采集

(2)语音信号的分析

(3)语音信号的滤波

1)IIR滤波器的设计

以低通滤波器为例设计

以低通滤波器为例设计的完整代码展示

2)FIR滤波器的设计(窗函数设计法)

以矩形窗设计为例的完整代码

3)滤波器对语音信号的处理


一、课题的任务

二、内容、步骤和要求

(1)语音信号的采集

(2)语音信号的分析

(3)语音信号的滤波

1)IIR滤波器的设计

1.标准理想滤波器的特性

 2.数字滤波器的技术指标(以低通滤波器的性能指标为例)

3.常用的三种模拟滤波器

• 巴特沃斯滤波器(Butterworth

巴特沃斯滤波器是指在通带内的幅度特性具有最大平坦特性,是一全极点型滤波器。

滤波器的平方幅频特性函数的前(2N1)阶导数在模拟频率W=0处都为零。

• 切比雪夫滤波器(Chebyshev)

切比雪夫滤波器在过渡带比巴特沃斯滤波器的衰减快,但频率响应的幅频特性不如后者平坦。切比雪夫滤波器和理想滤波器的频率响应曲线之间的误差最小,但是在通频带内存在幅度波动。

在通带(或称“通频带”)上频率响应幅度等波纹波动的滤波器称为“I型切比雪夫滤波器”;

在阻带(或称“阻频带”)上频率响应幅度等波纹波动的滤波器称为“II型切比雪夫滤波器”。

• 椭圆滤波器(Ellipse)

在通带和阻带等波纹的一种滤波器。椭圆滤波器相比其他类型的滤波器,在阶数相同的条件下有着最小的通带和阻带波动。

4. 滤波器设计方法

• 脉冲响应不变法

优点: w = ΩT.
保证了模拟角频率与数字角频率之间的线性关系。
缺点:在 w=±pi 附近产生混叠失真。
一般只适用于带限滤波器,高通、带阻滤波器不能直接进行变换。

• 双线性变换法

优点:不会出现由于高频部分超过折叠频率而混淆到低频部分去的现象。

缺点:使数字滤波器与模拟滤波器在响应与频率的对应关系上发生畸变。

以低通滤波器为例设计

相关指标

Wp:通带截止频率;

Ws:阻带起始频率;

Rp:通带最大衰减;

Rs:阻带最小衰减;

模拟滤波器部分

以巴特沃斯滤波器为例

[n, Wn] = buttord(Wp, Ws, Rp, Rs, 's');

获取模拟巴特沃斯滤波器的最小阶数 n 和截止频率 Wn.
以弧度/秒为单位指定频率 Wp 和 Ws. 带或阻带可以是无限的。
's'表示模拟滤波器。

Wp, Ws的取值(以下wp ws wp1 wp2 ws1 ws2 单位均为Hz):

脉冲响应不变法:

低通 Wp = 2*pi*wp(通带截止频率);         Ws = 2*pi*ws(通带起始频率);

高通 Wp = 2*pi*wp(通带起始频率);         Ws = 2*pi*ws(阻带截止频率);

带通 Wp = 2*pi*[wp1, wp2](低端通带起始频率 高端通带截止频率);

        Ws = 2*pi*[ws1, ws2](低端阻带截止频率 高端阻带起始频率);

带阻 Wp = 2*pi*[wp1, wp2](低端通带截止频率 高端通带起始频率);

        Ws = 2*pi*[ws1, ws2](低端阻带起始频率 高端阻带截止频率);

双线性变换法:

在上述基础上先除以 Fs ,(采样频率)转化为数字滤波器的频率,设结果为 w,再利用2*Fs*tan(w/2)  转化为模拟滤波器指标。

[b, a] = butter(n, Wn, ftype, 's');

根据 ftype 和 Wn ,设计低通、高通、带通或带阻巴特沃斯滤波器。

ftype 的取值:

低通 [b, a] = butter(n, Wn, 's');

高通 [b, a] = butter(n, Wn, ‘high’,  's'); 

带通 [b, a] = butter(n, Wn, 's');

带阻 [b, a] = butter(n, Wn, ‘stop’, 's');

其他模拟滤波器

切比雪夫Ⅰ型滤波器

[N, Wn] = cheb1ord(Wp, Ws, Ap, As, 's');
[b, a] = cheby1(N, Ap, Wc, 's');

切比雪夫Ⅱ型滤波器

[N, Wn] = cheb2ord(Wp, Ws, Ap, As, 's');
[b, a] = cheby2(N, Ap, Wc, 's');

椭圆滤波器

[N, Wn] = ellipord(Wp, Ws, Ap, As, 's');
[b, a] = ellip(N, Ap, As, Wc, 's');

滤波器设计方法部分

脉冲响应不变法

[bz, az] = impinvar(b, a, fs);

创建分别具有分子和分母系数bz和az的数字滤波器,其脉冲响应等于具有系数b和a的模拟滤波器的脉冲响应,按1/fs缩放,其中fs是采样率。b, a 为上述模拟滤波器设计所得。

双线性变换法

 [bz, az] = bilinear(b, a, fs);

将模拟域传递函数变换为数字域传递函数,Fs为取样频率。

滤波器效果展示:幅频响应特性曲线图

W = linspace(0, pi, 400*pi);
[H, W] = freqz(Bz, Az, W);
plot(app.filter_frequency, W*FS/(2*pi), 20*log10(abs(H)));

y = linspace(x1, x2, n) 生成 n 个点。这些点的间距为 (x2-x1)/(n-1).

[h, w] = freqz(b, a, n);返回数字滤波器的 n 点频率响应向量h和相应的角频率向量 w.

​W*FS/(2*pi):转换为Hz.

20*log10(abs(H)):转化为dB.

以低通滤波器为例设计的完整代码展示

%wp,ws自行设计,单位Hz
%一次只能出一个图,多个图同框可采用 subplot 函数
%巴特沃斯低通滤波器

%脉冲响应不变法
Wp = 2*pi*wp;
Ws = 2*pi*ws;
[N, Wc] = buttord(Wp, Ws, Ap, As, 's');
[B, A] = butter(N, Wc, 's');
[Bz, Az] = impinvar(B, A, FS);
W = linspace(0, pi,400*pi);
[H, W] = freqz(Bz, Az, W);
plot(W*FS/(2*pi), 20*log10(abs(H)));
%双线性变换法
Wp = 2*pi*wp/FS;
Ws = 2*pi*ws/FS;
[N, Wc] = buttord(2*FS*tan(Wp/2), 2*FS*tan(Ws/2), Ap, As, 's');
[B, A] = butter(N, Wc, 's');
[Bz, Az]=bilinear(B,A,FS);
 W = linspace(0, pi,400*pi);
 [H, W] = freqz(Bz, Az, W);
plot(W*FS/(2*pi), 20*log10(abs(H)));

2)FIR滤波器的设计(窗函数设计法)

1.六种窗函数的基本参数比较

 设计思想:

根据阻带最小衰减选择合适的窗函数进行设计。

①计算过渡带(过渡带见上述“数字滤波器的技术指标”

低通 Wp = 2*pi*wp/Fs(通带截止频率);        Ws = 2*pi*ws/Fs(通带起始频率);

        W = Ws - Wp;

高通 Wp = 2*pi*wp/Fs(通带起始频率);         Ws = 2*pi*ws/Fs(阻带截止频率);

        W = Wp - Ws;

带通 Wp1 = 2*pi*wp1/Fs (低端通带起始频率); 

        Wp2 = 2*pi*wp2/Fs (高端通带截止频率);

        Ws1 = 2*pi*ws1/Fs (低端阻带截止频率):

        Ws2 = 2*pi*ws2/Fs (高端阻带起始频率);

        W1 = Ws1 - Wp1; 

        W2 = Wp2 - Ws2;

        W = min(W1, W2); (取过渡带的算术中心频率两者最小值)

带阻 Wp1 = 2*pi*wp1/Fs (低端通带截止频率); 

        Wp2 = 2*pi*wp2/Fs (高端通带起始频率);

        Ws1 = 2*pi*ws1/Fs (低端阻带起始频率):

        Ws2 = 2*pi*ws2/Fs (高端阻带截止频率);

        W1 = Ws1 - Wp1; 

        W2 = Wp2 - Ws2;

        W = min(W1, W2); (取过渡带的算术中心频率两者最小值)

②求阶数N

根据“六种窗函数的基本参数比较”求N.

N = ceil(x*pi/W);

x 为相应窗对应的“过度带宽精确值”

当 N 为偶数时,高通、带阻的设计会出现问题。于是利用下面代码将偶数变为奇数。

N = N + mod(N + 1, 2);

mod 为求余函数。

③ 计算理想低通滤波器通带截止频率(关于pi归一化) 

低通、高通:Wc = (Wp + Ws)/2;

带通、带阻:Wc1 = (Wp1 + Ws1)/2;
                      Wc2 = (wp2 + Ws2)/2;
                      Wc = [Wc1, Wc2];

b = fir1(N - 1, Wc, ftype, window);

根据ftype,Wc的值和相应的窗函数设计滤波器。

ftype,window 的值:

%矩形窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, boxcar(N));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', boxcar(N));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, boxcar(N));
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', boxcar(N));

%三角窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, triang(N));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', triang(N));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, triang(N)); 
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', triang(N)); 


%汉宁窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, hanning(N));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', hanning(N));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, hanning(N));
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', hanning(N));

%哈明窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, hamming(N));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', hamming(N));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, hamming(N));
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', hamming(N));

%布莱克曼窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, blackman(N));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', blackman(N));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, blackman(N));
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', blackman(N));

%凯塞窗

% 低通滤波器
hn = fir1(N - 1, Wc/pi, kaiser(N,7.865));
% 高通滤波器
hn = fir1(N - 1, Wc/pi, 'high', kaiser(N,7.865));
% 带通滤波器
hn = fir1(N - 1, Wc/pi, kaiser(N,7.865));
% 带阻滤波器
hn = fir1(N - 1, Wc/pi, 'stop', kaiser(N,7.865));

滤波器效果展示:幅频响应特性曲线图

[H, W]= freqz(hn, 1, 256);  
plot(W*FS/(2*pi), 20*log10(abs(H)));

以矩形窗设计为例的完整代码

%Wp, Ws, Wp1, Wp2, Ws1, Ws2自行设计
%一次只能出一个图,多个图同框可采用 subplot 函数

%矩形窗

%低通滤波器
W = Ws-Wp; %计算过渡带
N = ceil(1.8*pi/W); %求阶数N
Wc = (Wp + Ws)/2; %计算理想低通滤波器通带截止频率(关于pi归一化) 
hn = fir1(N - 1, Wc/pi, boxcar(N));
[H, W] = freqz(hn, 1, 500);
plot(W*FS/(2*pi), 20*log10(abs(H)));

%高通滤波器
W = Wp-Ws; %计算过渡带
N = ceil(1.8*pi/W); %求阶数N
N = N + mod(N + 1, 2);
Wc = (Wp + Ws)/2; %计算理想低通滤波器通带截止频率(关于pi归一化) 
hn = fir1(N - 1, Wc/pi, 'high', boxcar(N));
[H, W] = freqz(hn, 1, 256);
plot(W*FS/(2*pi), 20*log10(abs(H)));

%带阻滤波器
W1 = Ws1 - Wp1; %计算过渡带
W2 = Wp2 - Ws2; %计算过渡带
W = min(W1,W2); %取过渡带的算术中心频率两者最小值
N = ceil(1.8*pi/W); %求阶数N
N = N + mod(N + 1, 2);
Wc1 = (Wp1 + Ws1)/2; %计算理想低通滤波器通带截止频率(关于pi归一化) 
Wc2 = (Wp2 + Ws2)/2; %计算理想低通滤波器通带截止频率(关于pi归一化)
Wc = [Wc1, Wc2];
hn = fir1(N - 1, Wc/pi, 'stop', boxcar(N)); 
[H, W] = freqz(hn, 1, 256);  
plot(W*FS/(2*pi), 20*log10(abs(H)));

%带通滤波器
W1 = Wp1 - Ws1; %计算过渡带
W2 = Ws2 - Wp2; %计算过渡带
W = min(W1, W2); %取过渡带的算术中心频率两者最小值
N = ceil(1.8*pi/W); %求阶数N
Wc1 = (Wp1 + Ws1)/2; %计算理想低通滤波器通带截止频率(关于pi归一化) 
Wc2 = (Wp2 + Ws2)/2; %计算理想低通滤波器通带截止频率(关于pi归一化)
Wc = [Wc1, Wc2];
hn = fir1(N - 1, Wc/pi, boxcar(N)); 
[H, W] = freqz(hn, 1, 256);  
plot(W*FS/(2*pi), 20*log10(abs(H)));

3)滤波器对语音信号的处理

IIR滤波器:

y = filter(BZ, AZ, x);

BZ,AZ 为 impinvar 或者 bilinear 函数返回值。

x 为 [x,Fs]=audioread(app.path);   中的x.

FIR滤波器:

y = fftfilt(hn, x);

hn 为 fir1 函数返回值。

x 为 [x,Fs]=audioread(app.path);   中的x.

下文:基于Matlab App Designer的语音信号分析与处理(三):App的设计_演员的必备修养的博客-CSDN博客

最终效果展示:

语音信号的分析与处理_哔哩哔哩_bilibili

完整资源获取:

https://download.csdn.net/download/weixin_53877178/76116847

  • 8
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

演员的必备修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值