下面這一小段是廢話,可以不看!
園齡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實現...老板不讓發!不讓發!!!