多相滤波器MATLAB仿真---抽取&插值
目录
前言
语音信号多相滤波器是我上学期末做的一个课设,过了许久,在此仅仅简单记录一下,以特定的D值和I值展示一下操作过程,不贴出通用函数,希望对正在学习该内容的伙伴有所帮助。本文以工程实现的角度浅谈多相滤波器,由于数字滤波器是有延时效应的,所以在考虑滤波器的延时下,多相滤波器又应该如何操作。
提示:以下是本篇文章正文内容,写文章实属不易,希望能帮助到各位,转载请附上链接。
一、什么是多相滤波器?
我们知道,在数字信号处理中,对于给定的一个序列,我们可以对它进行整数因子抽取和插值操作。抽取就是把原序列每隔D-1个点抽取一个值,组成一个新的序列。即:
这个抽取运算由抽取器来完成,对序列进行抽取时序列的频谱会展宽,所以在抽取之前会加一个低通滤波器防止因抽取带来的频谱混叠。
抽值就是在原序列的每两个点之间补I-1个零,再进行平滑滤波,就能得到一个新的序列。插值即:
插零由内插器来完成,对序列插值后,频谱会包含高频镜像,所以在插值之后会加一个低通滤波器来消除内插带来的镜像。
抽取和插值是多速率信号处理系统中两个最基本的运算,但是,这两种运算对速度的要求相当高,这是因为在抽取模型中,低通滤波器位于抽取操作之前,也就是说低通滤波器是在降速之前实现的,而对于插值模型,低通滤波器又位于提速之后。因此,我们可以利用恒等变换(恒等变换公式较多,难得敲,感兴趣的自己百度抽取器与插值器的恒等变换),将低通滤波器的位置变一下,就得到了滤波器的多相结构,它可以提高计算效率,降低对处理速度的要求。
多相滤波器分为两种。抽取器的多相滤波结构如图1所示。插值器的多相滤波结构如图2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/9fe42a85ae2281cfaa0a962012b7c17f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8c5adace96442bb981ac9e7d736a9876.png)
二、抽取
1.不考虑滤波器延时下的抽取
以D=3为例,根据图1(b)编写程序如下:
clc;
clear all;
close all;
a=1:6;
h=1:12;
D=3;
y=conv(a,h)
y_chouqu1=y(1:D:end)
h1=h(1:D:end);
h2=h(2:D:end);
h3=h(3:D:end);
a=a;%第一次延时为0
a1=a(1:D:end);%抽取
y1=conv(a1,h1)%滤波
a=[0 a];%延时
a2=a(1:D:end);%抽取
y2=conv(a2,h2)%滤波
a=[0 a];%延时
a3=a(1:D:end);%抽取
y3=conv(a3,h3)%滤波
ychouqu2=[y1,0]+y2+y3%相加
运行程序得到结果如图3所示。可见直接卷积抽取后的结果和多相滤波结构抽取下的结果是一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/bb03dbd4edbc8e22d6174e02c5952e2b.png)
2.考虑滤波器延时下的抽取
实际中我们经常滤波是用filter函数,用filter函数滤波后的输出序列和输入序列长度是相等的。N阶线性相位滤波器的延时是(N-1)/2,考虑滤波器的延时不能直接用filter函数,需采用卷积函数,不过对于卷积的输出结果采取掐头去尾的处理就能消除滤波器的延时效应,这样处理后输出序列与输入序列的长度是一致的。
以D=3为例,根据图1(b)编写程序如下:
clc;
clear all;
close all;
a=1:6;
h=1:12;
n=length(h);
D=3;
y0=conv(a,h)
y=y0(n/2:end-n/2)%掐头去尾消除延时
y_chouqu1=y(1:D:end)
m=1;
h=[zeros(1,m) h zeros(1,D-m)];
h1=h(1:D:end);
h2=h(2:D:end);
h3=h(3:D:end);
a=a;%第一次延时为0
a1=a(1:D:end);%抽取
y1=conv(a1,h1)%滤波
a=[0 a];%延时
a2=a(1:D:end);%抽取
y2=conv(a2,h2)%滤波
a=[0 a];%延时
a3=a(1:D:end);%抽取
y3=conv(a3,h3)%滤波
ychouqu2=[y1,0]+y2+y3;%相加
ychouqu2=ychouqu2(3:4)
运行程序得到结果如图4所示。可见直接卷积抽取后的结果和多相滤波结构抽取下的结果是一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/cd164be8ad1c690aa34f3cc51d3daf39.png)
三、插值
以I=3为例,根据图2(b)编写程序如下:
clc;
clear all;
close all;
a=1:3
h=1:9;
I=3;
b=zeros(1,length(a)*I-I+1);
%%插值滤波
b(1:I:end)=a
ychazhi1=conv(b,h)
%%插值器多相滤波
h1=h(1:I:end);
h2=h(2:I:end);
h3=h(3:I:end);
y1=conv(a,h1)
y2=conv(a,h2)
y3=conv(a,h3)
ychazhi2=zeros(1,length(a)*I-I+length(h));
ychazhi2(1:I:end)=y1;
ychazhi2(2:I:end)=y2;
ychazhi2(3:I:end)=y3
运行程序得到结果如图5所示。可见插值后直接卷积的结果和插值多相滤波结构下的结果是一样的。
![](https://i-blog.csdnimg.cn/blog_migrate/20301e80fb31da265993f1988c65359e.png)
参考文献
- 朱冰莲,方敏.数字信号处理(第二版)[M].北京:电子工业出版社,2014.
- 十年老鸟.深入浅出理解多相滤波器[DB/OL].http://t.csdn.cn/gtwMg,2021.
总结
以上就是今天要讲的内容,本文仅仅以特定的抽取因子和插值因子简单介绍了抽取器与插值器的多相滤波结构的操作方法,实际应用中还可以封装成函数,就交由读者自己编写了。