用matlab实现完全重建两通道滤波器组的程序详解

  (之前是在百度经验上写的,后来百度经验的账号给忘记了,就重新调出来相关文档,以后会多在这里写些文章)

    近期由于项目需要两通道滤波器组的基础知识和仿真实现,我就在网上学习了很多两通道滤波器组的知识,但是其仿真实现的程序却很少见。为此,我就根据所学知识,认真完成了两通道滤波器组的完全重建仿真程序,给一些需要的朋友提供一些便利。

    测试信号: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

你可能感兴趣的:(用matlab实现完全重建两通道滤波器组的程序详解)