梯形成形算法

下面这一小段是废话,可以不看!

园龄4年了,但这确是我在博客园的第一贴!好久以前就打算在博客园开博,喜欢这里没有广告,清爽!!!

上学时觉得没有“够硬”的东西可写,上班了又找借口没有时间写,这段时间整理一下电脑,决定把自认为有价值的一些算法、代码、资源铺出来和大家分享。算法大多看论文学来的,Coding基本自己做的,资源...都是网上找的。

这里,我可能会忘记注明一些知识点的参考出处,请看帖的人请别较真!!!我的知识点都是学来的,没有原创!!!!!请高抬贵手!!!!!!!写随笔的目的就是给跟我遇到过同样问题的朋友一个提示,同时也希望能指出随笔中的错误之处,相互学习!

我会坚持写下去,以督促自己继续学习!

好了...进入正题...


 

 

梯形成形算法:又能成形!又能滤波!

       相信做能谱分析和信号处理的童鞋都用得到。

       梯形成形滤波器是将输入的下降沿衰减的指数信号成形为梯形脉冲信号输出,已有研究证明,当只考虑电压和电流噪声,探测器收集电荷的时间不为零时,梯形成形滤波器是最优滤波器,并且非常适合用数字方法实现 。

算法:

       设前置放大器输出为理想指数信号,时域表达式为:

                                                  Ui(t)=Umax*e-t/tao*μ(t)                                                                                           (1)

Umax 为脉冲幅值,tao为前端放大器的时间常数,μ(t)为标准单位阶跃函数,以Ts为周期对输入信号进行采样,可以得到脉冲序列的表达式:

                                                  Ui(t)=Umax*e-nTs/tao*μ(t)                                                                                     (2)

令e-nTs/tao=q,对上式进行Z变换得:

                                                  Ui(t)=Umax*z/(z-d)                                                                                                (3)

理想梯形函数的分段函数表示如下:

Uo(t)=y1(t)+y2(t)+y3(t)+y4(t)

y1(t)=(Umax/ta)t

                                                                             y2(t)=-y1(t-ta)                                                                           (4)

y3(t)=-y1(t-tb)

y4(t)=y1(t-tc)

 式中:ta、tb、tc分别为梯形的上升沿、平顶、下降沿的宽度。令ta=naTs、tb=nbTs、tc=ncTs,理想梯形函数的分段函数经过单边的z变换可表示为:

Uo(z)=Umax*(1-z-na-z-nb+z-nc)/(1-2z-1+z-2)

从而可得梯形成形算法的传递函数:

H(z)=Uo(z)/Ui(z)=[z(1-z-na)(1-z-nb)(1-q*z-1)]/[na*(1-z-1)2]

 


 

 matlab仿真:为了显示滤波功能,加了噪声。

程序:

%梯形参数初始化

Ts=0.05; %采样周期
tao=1;
nr=20;  %梯形斜坡时间
nf=100; %梯形平 顶宽度
vmax=10.4151;% 最大幅值

%产生指数信号
for n=1:1:256
    e(n)=vmax*exp(-n*Ts/tao);
end


%产生N ( 0.0128, 0.9596 ) 的高斯分布序列
noise_y=randn(1,256);
noise_y=noise_y-mean(noise_y);
noise_y=noise_y/std(noise_y);
a=0.001;
b=sqrt(0.01);
noise_y=a+b*noise_y;
 %加性白噪声
 
 for n=1:1:256
     new_y(n)=noise_y(n)+e(n);
 end

vi=new_y;


nr;nf;Ts;tao;
na=round(nr);nb=round(nr+nf);nc=round(2*nr+nf);d=exp(-Ts/tao);

von=0;von_1=0;von_2=0;

%梯形成形算法
for n=1:1:size(vi,2)


    if ((n-1)<0)||((n-1)==0)
        von_1=0; vin_1=0;
    else
        vin_1=vi(n-1);
    end

    if ((n-2)<0)||((n-2)==0)
        von_2=0;vin_2=0;
    else
        vin_2=vi(n-2);
    end

    if ((n-na-1)<0)||((n-na-1)==0)
        vin_na_1=0;
    else vin_na_1=vi(n-na-1);
    end


    if ((n-nb-1)<0)||((n-nb-1)==0)
        vin_nb_1=0;
    else vin_nb_1=vi(n-nb-1);
    end

    if ((n-nc-1)<0)||((n-nc-1)==0)
        vin_nc_1=0;
    else vin_nc_1=vi(n-nc-1);
    end

    if ((n-na-2)<0)||((n-na-2)==0)
        vin_na_2=0;
    else vin_na_2=vi(n-na-2);
    end

    if ((n-nb-2)<0)||((n-nb-2)==0)
        vin_nb_2=0;
    else vin_nb_2=vi(n-nb-2);
    end

    if ((n-nc-2)<0)||((n-nc-2)==0)
        vin_nc_2=0;
    else vin_nc_2=vi(n-nc-2);
    end

    vo(n)=2*von_1-von_2+1/na*(vin_1-vin_na_1-vin_nb_1+vin_nc_1...
        -d*(vin_2-vin_na_2-vin_nb_2+vin_nc_2)); %梯形滤波器转化的时域中的表达式
    von_2=von_1;
    von_1=vo(n);
end
figure (1)
subplot(1,2,1);
plot(new_y);
title('标准指数信号')

subplot(1,2,2);
plot(vo);
title('梯形成形信号')

 

哎...自己都觉得写得水...后续再改,能读到这里,已经非常感谢了!

呃...重点是该算法的FPGA实现...老板不让发!不让发!!!

 

posted @ 2017-08-21 21:50  In.the.peace  阅读(5081)  评论(10编辑  收藏  举报