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

来源:互联网 发布:js按钮点击增加div 编辑:程序博客网 时间:2024/06/06 04:22

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

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

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

0 0
原创粉丝点击