gusucode.com > matlab编程小波变换进行图像去噪处理,包括各种软硬阈值的选取函数 > code/thrfunc.m
function y=thrfunc(x,sorh,t) %阈值函数:选择不同的阈值函数对信号进行处理 switch sorh case 'soft'%软阈值函数 tmp=(abs(x)-t); tmp=(tmp+abs(tmp))/2; y=sign(x).*tmp; case 'hard'%硬阈值函数 y=x.*(abs(x)>t); case 'semisoft'%折中阈值函数 a=0.1; tmp=(abs(x)-a*t); tmp=(tmp+abs(tmp))/2; y=sign(x).*tmp.*(abs(x)>=t); case 'halfsoft'%半软阈值函数 sigma=2;t0=sigma*t; tmp=(abs(x)-t); tmp=t0*(tmp+abs(tmp))/2/(t0-t); ytmp=sign(x).*tmp; y=x.*(abs(x)>=t0)+ytmp.*(abs(x)<t0); case 'upsoft'%软阈值函数改进 k=1; tmp1=abs(x)-t+t/(2*k+1); tmp2=x.^(2*k+1)/((2*k+1)*t^(2*k)); y=sign(x).*tmp1.*(abs(x)>=t)+tmp2.*(abs(x)<t); case 'newthr1'%半软阈值和折中阈值函数的综合改进 a=0.1;sigma=0.40;t0=sigma*t; tmp1=(abs(x)-a*t);tmp=(abs(x)-t0); tmp1=(tmp1+abs(tmp1))/2;tmp=(t-a*t)*(tmp+abs(tmp))/2/(t-t0); ytmp=sign(x).*tmp; y=sign(x).*tmp1.*(abs(x)>=t)+ytmp.*(abs(x)<t&abs(x)>=t0); case 'hfsmsoft'%新阈值函数:见参考文献[5] alpha=1+exp(abs(x)/2-t/2); tmp=abs(x)-2*t./alpha; y=sign(x).*tmp.*(abs(x)>=t); case 'newthr2'%upsoft和newthr1的综合改进 k=2;alpha=1+exp(abs(x)/2-t/2); tmp1=abs(x)-2*k*t/(k+1/2)./alpha; tmp2=k*x.^(2*k+1)/((2*k+1)*t^(2*k)); y=sign(x).*tmp1.*(abs(x)>=t)+tmp2.*(abs(x)<t); otherwise error('Invalid argument value.') end