小波阈值去噪就是对信号进行分解,然后对分解后的系数进行阈值处理,最后重构得到去噪信号。该算法其主要理论依据是:小波变换具有很强的去数据相关性,它能够使信号的能量在小波域集中在一些大的小波系数中;而噪声的能量却分布于整个小波域内。因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值。可以认为,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声。于是,采用阈值的办法可以把信号系数保留,而使大部分噪声系数减小至零。小波阈值收缩法去噪的具体处理过程为:将含噪信号在各尺度上进行小波分解,设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完全保留,或者做相应的“收缩(shrinkage)”处理。最后将处理后获得的小波系数用逆小波变换进行重构,得到去噪后的信号.
2、小波阈值去噪c语言程序此程序是用于信号处理分析,突出奇异值的前段处理,对信号进行小波包分解,用C语言实现的,仅供参考。
#include
#include
#include
#include
#defineLENGTH4096//信号长度
#defineDB_LENGTH8//Daubechies小波基紧支集长度
/******************************************************************
* 一维卷积函数
* 说明:循环卷积,卷积结果的长度与输入信号的长度相同
* 输入参数:data[],输入信号;core[],卷积核;cov[],卷积结果;
*n,输入信号长度;m,卷积核长度。
******************************************************************/
/*voidCovluTIon(doubledata[],doublecore[],doublecov[],intn,intm)
{
inTI=0;
intj=0;
intk=0;
//将cov[]清零
for(i=0;i《n;i++)
{
cov[i]=0;
}
//前m/2+1行
i=0;
for(j=0;j《m/2;j++,i++)
{
for(k=m/2-j;k《m;k++)
{
cov[i]+=data[k-(m/2-j)]*core[k];//k针对core[k]
}
for(k=n-m/2+j;k《n;k++)
{
cov[i]+=data[k]*core[k-(n-m/2+j)];//k针对data[k]
}
}
//中间的n-m行
for(i=m/2;i《=(n-m)+m/2;i++)
{
for(j=0;j《m;j++)
{
cov[i]+=data[i-m/2+j]*core[j];
}
}
//最后m/2-1行
i=(n-m)+m/2+1;
for(j=1;j《m/2;j++,i++)
{
for(k=0;k《j;k++)
{
cov[i]+=data[k]*core[m-j-k];//k针对data[k]
}
for(k=0;k《m-j;k++)
{
cov[i]+=core[k]*data[n-(m-j)+k];//k针对core[k]
}
}
}
*/
//定义一个线性卷积
voidCovluTIon(doubledata[],doublecore[],doublecov[],intn,intm)
{
inTI=0;
intj=0;
intt=0;
//将cov[]清零
for(j=0;j《n+m-1;j++)
{
cov[j]=0;
}
for(j=0;j《m+n-1;j++)
{
if(j《=m-1)//前面m行
{
for(i=0,t=j;t》=0;i++,t--)
cov[j]+=data[i]*core[t];
}
elseif(j《=n-1)//中间n-m行
{
for(i=j-m+1,t=m-1;t》=0;i++,t--)
cov[j]+=data[i]*core[t];
}
else//后面m行
{
for(i=j-m+1,t=m-1;i《n;i++,t--)
cov[j]+=data[i]*core[t];
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)