(之前是在百度经验上写的,后来百度经验的账号给忘记了,就重新调出来相关文档,以后会多在这里写些文章)
近期由于项目需要两通道滤波器组的基础知识和仿真实现,我就在网上学习了很多两通道滤波器组的知识,但是其仿真实现的程序却很少见。为此,我就根据所学知识,认真完成了两通道滤波器组的完全重建仿真程序,给一些需要的朋友提供一些便利。
测试信号:1. chirp信号 2. 余弦信号 3. 减幅余弦信号
仿真软件:Matlab R2009a
A. 基本知识:
滤波器组分为分析滤波器组和综合滤波器组。分析滤波器组将信号分成M个子带信号。若M=2,则分析滤波器组由一个低通滤波器和一个高通滤波器所组成,它们把信号分成了一个低通信号和一个高通信号。我们可依据这两个子带信号所具有的能量的不同,也即“重要性”的不同而分别给以不同的对待及处理。由于分析滤波器组将原信号的带宽压缩为1/M,因此,对每一个子带信号均可作M倍的抽取,从而将抽样率减低M倍。这样可减小编码和处理的计算量,同时,在硬件实现时也可以降低对系统性能的要求,从而降低成本。在综合滤波器组前面,再作M倍的插值,以得到和原信号相同的抽样率。
两通道滤波器组的框图如图所示,具体节点的表达式可参考书籍:多抽样率数字信号处理理论及其应用(作者:陶然,张惠云,王越 清华大学出版社)
B. 实现完全重建两通道滤波器组的程序:
clear all; close all; clc; %%%%%%%%%%%%%%%%%%% 初始信号 %%%%%%%%%%%%%%%%%%%%%% N = 50; m= 0:N-1; %%%%% 测试信号 %%%%% x1 = exp(-j*0.3*pi*m+j*m.^2); %%%chirp信号 x1 = cos(0.04*pi*m)+0.2*randn(size(m)); %% 余弦信号 x1 = exp(-0.1*m).*cos(0.2*pi*m); %% 减幅余弦信号 figure(1); stem(m,x1); %%%%%%%%%%%%%%%%%% 滤波器设计 %%%%%%%%%%%%%%%%%%%%%%%%%% %%Design a filter bank with filters of order n equal to 99 and passband %%edges of 0.45 and 0.55. n = 99; [h0,h1,g0,g1] = firpr2chfb(n,.45); hfv = fvtool(h0,1,h1,1,g0,1,g1,1); set(hfv, 'Color', [1,1,1]); legend(hfv,'Hlp Lowpass Decimator','Hhp Highpass Decimator', 'Glp Lowpass Interpolator','Ghp Highpass Interpolator'); %%%%%%%%%%%%%%% 信号一般重建:幅度失真,相位失真 %%%%%%%%%%%%%%%%%%%%%% %%%%%% 通道一 %%%%%% v0 = conv(x1,h0); %% 抽取 u0=v0(1:2:end); %% 内插 v00 = upsample(u0,2); %% y_1 = conv(v00,g0); %%%% 通道二 %%%%%%% v1 = conv(x1,h1); %% 抽取 u1=v1(1:2:end); %% 内插 v11 = upsample(u1,2); y_2 = conv(v11,g1); %%%%% 两通道之和:重建 %%%%%%% y = y_1+ y_2; figure(3); stem(y); %%%%% 重建信号与初始信号的比较 %%%%% figure(4); stem(m,y([n+1:1:n+N])); hold on stem(m,x1,'*');C. 以测试信号——减幅余弦信号——为例子,得到的仿真结果:
D. 注意事项
1. 2倍的内插一定是零值内插,不可以是线性内插。
2. 程序中函数firpr2chfb——Two-channel FIR filter bank for perfect reconstruction——是直接根据参数来设计完全重建滤波器的函数,函数的具体细节可参考http://www.mathworks.cn/cn/help/dsp/ref/firpr2chfb.html