matlab小波分析程序降噪用的是什么信号b

Matlab实现小波去噪_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Matlab实现小波去噪
上传于||文档简介
&&M​a​t​l​a​b​实​现​小​波​去​噪
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩8页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Matlab小波工具箱的使用1
最近想尝试一下小波的用法,就这matlab的帮助尝试了一下它的例子,顺便翻译了一下帮助的内容,发现matlab帮助做的确实不错,浅显易懂!现把翻译的文档写出来吧,想学习的共同学习吧!
小波工具箱简介
小波工具箱包含了图像化的工具和命令行函数,它可以实现如下功能:
l 测试、探索小波和小波包的特性
l 测试信号的统计特性和信号的组分
l 对一维信号执行连续小波变换
l 对一维、二维信号执行离散小波分析和综合
l 对一维、二维信号执行小波包分解(参见帮助Using Wavelet Packets)
l 对信号或图像进行压缩、去噪
另外,工具箱使用户更方便的展示数据。用户可以做如下选择:
l 显示哪个信号
l 放大感兴趣的区域
l 配色设计来显示小波系数细节
工具箱可以方便的导入、导出信息到磁盘或matlab工作空间。具体详见File Menu Options
一维连续小波分析
这一部分来测试连续小波分析的特性。连续小波分析只需要一个小波函数cwt。在这一部分将学到如下内容:
l 加载信号
l 对信号执行连续小波变换
l 绘制小波系数
l 绘制指定尺度的小波系数
l 绘制整个尺度小波系数中的最大值
l 选择显示方式
l 在尺度和伪频率之间切换
l 细节放大
l 在普通或绝对模式下显示系数
l 选择执行小波分析的尺度
使用命令行执行连续小波分析
这个例子是一个包含噪声的正弦波
1. 加载信号
load noissin
可以使用whos显示信号信息
2. 执行连续小波变换
c = cwt(noissin,1:48,'db4');
函数cwt的参数分别为分析的信号、分析的尺度和使用的小波。返回值c包含了在各尺度下的小波系数。对于这里,c是一个48x1000的矩阵,每一行与一个尺度相关。
3. 绘制小波系数
cwt函数可以接受第四个参数,来指定函数在执行结束后是否绘制连续小波变换系数的绝对值。另外还可以接受更多的参数来定义显示的不同特性,详见cwt函数。如下面的语句绘制系数结果
cwt(noissin,1:48,'db4','plot');
4. 选择分析的尺度
cwt函数的第二个参数可以设定任意小波分析的尺度,只要这些尺度满足如下要求
l 所有尺幅必须为正实数
l 尺度的增量必须为正
l 最高的尺度不能超过由信号决定的一个最大值
如下面的代码可以执行从2开始的偶数尺度计算
c = cwt(noissin,2:2:128,'db4','plot');
显示结果如下
这幅图像很明确的表示出了信号的周期性。
使用图形接口做连续小波分析
1. 开启一维连续小波工具,只需输入如下命令
出现如下小波工具箱主菜单
选择Continuous Wavelet 1-D菜单项,出现如下一维信号分析连续小波分析工具
2. 加载信号
选择菜单File-&Load Signal,在Load
Signal对话框里选择noissin.mat文件,它在matlab安装目录的toolbox/wavelet/wavedemo文件夹下,点击OK加载信号。
一维连续小波工具开始加载信号,加载后默认采样频率为1s。
3. 执行连续小波变换
下面来测试使用db4小波对尺度1到48做小波分析,设置如下
4. 点击Analyze按钮
在短暂的计算后,工具将绘制小波系数,并在Coefficients line坐标系中绘制尺度为24的小波系数,在local
maxima坐标系中绘制各尺度的小波系数最大值。
5. 查看小波Coefficients Line
在小波系数图中右键点击可以选择展示其他尺度的小波系数,选择后点击New Coefficients
Line按钮,Coefficients Line会相应更新。
6. 查看Maxima Line
点击Refresh Maxima Line按钮,可以显示从尺度1到所选尺度的小波系数的最大值。
注意当在系数图中按下鼠标右键并移动时,会在最下面的Info框中显示当前鼠标位于的X位置和尺度。
7. 在尺度和伪频率之间切换
在右边选择Frequencies,当再在系数图中选择时,在Info中显示的将是Hz。
而关于尺度和频率的转换关系,可以看How to Connect Scale to Frequency?
8. 选择要显示的坐标系
9. 放大细节
在系数框中按鼠标左键可以选择放大的范围。
10. 选择好放大范围后点击最下面的按钮可以实现指定的放大
11. 显示普通系数或系数绝对值
两种显示方式的区别在于,普通模式下,颜色映射是在系数的最大最小之间;而绝对模式,颜色映射是在0和最大的系数绝对值之间。
图形接口的导入导出信息
导入信号到一维连续小波工具
首先将要处理的信号保存到mat文件中,要求信号是一维的向量。然后使用工具的File
-&Load Signal菜单功能,选择此信号文件即可导入信号。
文件中第一个一维变量被认为是信号,变量在文件中顺序是按字母排序的。
保存小波系数
小波分析完成后,点击File-&Save-&Coefficients,可以将分析结果保存到mat文件。保存后,可以使用load函数加载数据,会看到保存的变量有小波系数coeff、尺度scales、小波的名字wname。
一维复信号连续小波分析
对于复信号连续小波分析,小波工具箱中对应的函数是cwt。
使用命令行分析复信号
这个例子是一个带尖头的信号,如下
1. 加载信号
load cuspamax
文件中包含两个变量,caption和cuspamax,前者是此信号的定义,如下
x = linspace(0,1,1024); y =
exp(-128*((x-0.3).^2))-3*(abs(x-0.7).^0.4);
2. 执行连续小波变换
c = cwt(cuspamax,1:2:64,'cgau4');
3. 绘制结果
c = cwt(cuspamax,1:2:64,'cgau4','plot');
结果显示了四副图形,分别为系数的实部、虚部、模、相角。
使用图形接口分析复信号
与实信号不同的是,选择Complex Continuous Wavelet 1-D,得到的结果如下
具作过程与实信号的相似,如下
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
信号消噪的小波处理方法及Matlab实现
下载积分:1000
内容提示:信号消噪的小波处理方法及Matlab实现
文档格式:PDF|
浏览次数:19|
上传日期: 19:16:22|
文档星级:
该用户还上传了这些文档
信号消噪的小波处理方法及Matlab实现
官方公共微信2341人阅读
图像处理算法(22)
的C++版本,最终结果与matlab库函数运算结果完全一致。
很强的去数据相关性,它能够使信号的能量在小波域集中在一些大的小波系数中;而噪声的能量却分布于整个小波域内.因此,经小波分解后,信号的小波系数幅值要大于噪声的系数幅值.可以认为,幅值比较大的小波系数一般以信号为主,而幅值比较小的系数在很大程度上是噪声.于是,采用阈值的办法可以把信号系数保留,而使大部分噪声系数减小至零.小波阈值收缩法去噪的具体处理过程为:将含噪信号在各尺度上进行小波分解,设定一个阈值,幅值低于该阈值的小波系数置为0,高于该阈值的小波系数或者完全保留,或者做相应的“收缩(shrinkage)”处理.最后将处理后获得的小波系数用逆小波变换进行重构,得到去噪后的信号.
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &图1
参考代码:
3,阈值的确定
选取的阈值最好刚好大于噪声的最大水平,可以证明的是噪声的最大限度以非常高的概率低于(此阈值是Donoho提出的),其中根号右边的这个参数(叫做sigma)就是估计出来的噪声标准偏差(根据第一级分解出的小波细节系数,即整个det1绝对值系数中间位置的值),本文将用此阈值去处理各尺度上的细节系数,注意所谓全局阈值就是近似系数不做任何阈值处理外,其他均阈值处理。
最后吐槽一下这个“绝对值系数中间位置的值”
1)如果det1的长度为偶数那么,这个“中值”便是中间位置的两个数之和的平均值,比如【2,2,3,5】,中值即是2.5而不是3
2)如果det1的长度为奇数那么,这个中值就是中间位置的那个数,比如【2,3,5】,中值即3
4,阈值策略
以前写的ppt挪用过来:
放大其中的细节部分,便于查看细节(抱歉,这里用了C++的处理结果,但是可喜的是他和matlab的结果一模一样)
% 获取噪声信号
indx = 1:3450;
noisez = leleccum(indx);
%信号的分解
wname = 'db3';
[c,l] = wavedec(noisez,lev,wname);
sigma = wnoisest(c,l,1);%使用库函数wnoisest提取第一层的细节系数来估算噪声的标准偏差
N = numel(noisez);%整个信号的长度
thr = sigma*sqrt(2*log(N));%最终阈值
%全局阈值处理
keepapp = 1;%近似系数不作处理
denoisexs = wdencmp('gbl',c,l,wname,lev,thr,'s',keepapp);
denoisexh = wdencmp('gbl',c,l,wname,lev,thr,'h',keepapp);
subplot(311),
plot(noisez), title('原始噪声信号');
subplot(312),
plot(denoisexs), title('matlab软阈值去噪信号') ;
subplot(313),
plot(denoisexh), title('matlab硬阈值去噪信号') ;
CWavelet::InitDecInfo(
const int signalLen,//源信号长度
const int decScale,//分解尺度
const int decdbn//db滤波器的编号
if (decdbn != 3)
SetFilter(decdbn);
if (signalLen & m_dbFilter.filterLen - 1)
cerr && &错误信息:滤波器长度大于信号!& &&
int srcLen = signalL
m_msgCL1D.dbn =
m_msgCL1D.Scale = decS
m_msgCL1D.msgLen.resize(decScale + 2);
m_msgCL1D.msgLen[0] = srcL
for (int i = 1; i &= decS i++)
int exLen = (srcLen + m_dbFilter.filterLen - 1) / 2;//对称拓延后系数的长度
srcLen = exL
m_msgCL1D.msgLen[i] = srcL
m_msgCL1D.msgLen[decScale + 1] = srcL
for (int i = 1; i & decScale + 2; i++)
m_msgCL1D.allSize += m_msgCL1D.msgLen[i];
m_bInitFlag1D =//设置为已经初始化
// 一维多尺度小波分解,必须先初始化
//分解的尺度等信息已经在初始化函数获取
bool CWavelet::WaveDec(
double *pSrcData,//要分解的信号
double *pDstCeof//分解出来的系数
if (pSrcData == NULL || pDstCeof == NULL)
if (!m_bInitFlag1D)
cerr && &错误信息:未初始化,无法对信号进行分解!& &&
int signalLen = m_msgCL1D.msgLen[0];
int decLevel = m_msgCL1D.S
double *pTmpSrc = new double[signalLen];
double *pTmpDst = new double[m_msgCL1D.msgLen[1] * 2];
for (int i = 0; i & signalL i++)
pTmpSrc[i] = pSrcData[i];
int gap = m_msgCL1D.msgLen[1] * 2;
for (int i = 1; i &= decL i++)
int curSignalLen = m_msgCL1D.msgLen[i - 1];
DWT(pTmpSrc, curSignalLen, pTmpDst);
for (int j = 0; j & m_msgCL1D.msgLen[i] * 2; j++)
pDstCeof[m_msgCL1D.allSize - gap + j] = pTmpDst[j];
for (int k = 0; k & m_msgCL1D.msgLen[i]; k++)
pTmpSrc[k] = pTmpDst[k];
gap -= m_msgCL1D.msgLen[i];
gap += m_msgCL1D.msgLen[i + 1] * 2;
delete[] pTmpD
pTmpDst = NULL;
delete[] pTmpS
pTmpSrc = NULL;
// 重构出源信号
bool CWavelet::WaveRec(
double *pSrcCoef,//源被分解系数
double *pDstData//重构出来的信号,两者的长度是一样的
if (pSrcCoef == NULL || pDstData == NULL)//错误:无内存
//从m_msgCL1D中获取分解信息
int signalLen = m_msgCL1D.msgLen[0];//信号长度
int decLevel = m_msgCL1D.S//分解级数
int det1Len = m_msgCL1D.msgLen[1];
double *pTmpSrcCoef = new double[det1Len * 2];
for (int i = 0; i & m_msgCL1D.msgLen[decLevel] * 2; i++)
pTmpSrcCoef[i] = pSrcCoef[i];
int gap = m_msgCL1D.msgLen[decLevel] * 2;
for (int i = decL i &= 1; i--)
int curDstLen = m_msgCL1D.msgLen[i - 1];
IDWT(pTmpSrcCoef, curDstLen, pDstData);
if (i != 1)
for (int j = 0; j & curDstL j++)
pTmpSrcCoef[j] = pDstData[j];
for (int k = 0; k & curDstL k++)
pTmpSrcCoef[k + curDstLen] = pSrcCoef[k + gap];
gap += m_msgCL1D.msgLen[i - 1];
delete[] pTmpSrcC
pTmpSrcCoef = NULL;
阈值写的代码
// 根据细节系数,以及信号长度计算阈值
double CWavelet::getThr(
double *pDetCoef,//细节系数(应该是第一级的细节系数)
int detLen,//此段细节系数的长度
bool is2D//当前细节系数是否来自是二维图像信号的
double thr = 0.0;
double sigma = 0.0;
for (int i = 0; i & detL i++)
pDetCoef[i] = abs(pDetCoef[i]);
std::sort(pDetCoef, pDetCoef + detLen);
if (detLen % 2 == 0 && detLen &= 2)
sigma = (pDetCoef[detLen / 2-1] + pDetCoef[detLen / 2]) / 2 / 0.6745;
sigma = pDetCoef[detLen / 2] / 0.6745;
if (!is2D)//一维信号
double N = m_msgCL1D.msgLen[0];
thr = sigma *sqrt(2.0*log(N));
else{//二维信号
double size = m_msgCL2D.msgHeight[0]*m_msgCL2D.msgWidth[0];
thr = sigma *sqrt(2.0*log(size));
// 将系数阈值处理,一维二维均适用
void CWavelet::Wthresh(
double *pDstCoef,//细节系数(应该是除近似系数外的所有的细节系数)
double thr,//阈值
const int allsize,//分解出来的系数的总长度(非)
const int gap,//跳过最后一层的近似系数
ish//阈值函数的选取
if (ish)//硬阈值
for (int i = i & i++)
if (abs(pDstCoef[i]) & thr)//小于阈值的置零,大于的不变
pDstCoef[i] = 0.0;
else//软阈值
for (int i = i & i++)
if (abs(pDstCoef[i]) & thr)//小于阈值的置零,大于的收缩
pDstCoef[i] = 0.0;
if (pDstCoef[i] & 0.0)
pDstCoef[i] = thr - abs(pDstCoef[i]);
pDstCoef[i] = abs(pDstCoef[i]) -
bool CWavelet::thrDenoise(
double *pSrcNoise,//源一维噪声信号
double *pDstData,//去噪后的信号
bool isHard//阈值函数的选取,有默认值
if (pSrcNoise == NULL || pDstData == NULL)
if (!m_bInitFlag1D)//错误:未初始化
double *pDstCoef = new double[m_msgCL1D.allSize];
WaveDec(pSrcNoise, pDstCoef);//分解出系数
int Det1Len = m_msgCL1D.msgLen[1];
int gapDet = m_msgCL1D.allSize - Det1L
double *pDet1 = new double[Det1Len];
for (int i = gapDet, j = 0; i & m_msgCL1D.allS i++, j++)
pDet1[j] = pDstCoef[i];
int gapApp = m_msgCL1D.msgLen[m_msgCL1D.Scale];//跳过最后一层的近似系数
double thr = getThr(pDet1, Det1Len);//获取阈值
Wthresh(pDstCoef, thr, m_msgCL1D.allSize, gapApp, isHard);//将细节系数阈值
WaveRec(pDstCoef, pDstData);//重构信号
delete[] pDstC
pDstCoef = NULL;
delete[] pDet1;
pDet1 = NULL;
以下数据为matlab的部分结果,完全相同于上述第二行,其他数据也完全一致。
#ifndef _WAVELET_H_
#define _WAVELET_H_
#include &vector&
namespace wavelet
//小波滤波器
typedef struct tagWaveFilter
vector&double& Lo_D;
// 小波变换分解低通滤波器
vector&double& Hi_D; // 小波变换分解高通滤波器
vector&double& Lo_R;
// 小波变换重构低通滤波器
vector&double& Hi_R; // 小波变换重构高通滤波器
int filterL
typedef struct tagCL1D
{//本结构体用于接收一维图像分解信息,避免参数的大量传送
vector&int& msgL
int S//分解尺度
//db小波的编号
int allS//总数据长度
typedef struct tagCL2D
{//本结构体用于接收二维图像分解信息,避免参数的大量传送
vector&int& msgH
vector&int& msgW
int S//分解尺度
//db小波的编号
int allS//总数据长度
typedef bool SORH;
CWavelet(int dbn=3);
~CWavelet();
double *pSrcData,
int srcLen,
double *pDstCeof
IDWT(double *pSrcCoef,
int dstLen,
double *pDstData
// 二维数据的小波分解
double *pSrcImage,//源图像数据(存储成一维数据,行优先存储)
int height,//图像的高
int width,//图像的宽
double *pImagCeof//分解出来的系数
double *pSrcCeof,
int height,
int width,
double *pDstImage
bool WaveDec(
double *pSrcData,
double *pDstCeof
bool WaveRec(
double *pSrcCoef,
double *pDstData
bool InitDecInfo(
const int srcLen,
const int Scale,
const int dbn =3
bool InitDecInfo2D(
const int height,
const int width,
const int Scale,
const int dbn = 3
bool thrDenoise(
double *pSrcNoise,
double *pDstData,
bool isHard=true
void Wthresh(
double *pDstCoef,
double thr,
const int allsize,
const int gap,
// 二维小波多级分解
bool WaveDec2(
double *pSrcData,
double *pDstCeof
// 重构出二维信号
bool WaveRec2(
double *pSrcCoef,//多级分解出的源系数
double *pDstData//重构出来的信号
// 初始化滤波器
void InitFilter();//放进内存
// 选择滤波器
void SetFilter(int dbn);
// 获取阈值
double getThr(
double *pDetCoef,
int detlen,
bool is2D =false
//调整数据,总是将低频数据放在前面
bool AdjustData(
double *pDetCoef,
const int height,//该系数的高度
const int width//该系数的宽度
//逆调整,还原低频数据的位置
bool IAdjustData(
double *pDetCoef,
const int height,//该系数的高度
const int width//该系数的宽度
bool thrDenoise2D(
double *pNoiseImag,//噪声图像
double *pDstImag,//已经去噪的图像
bool isHard = true);
msgCL1D m_msgCL1D;
msgCL2D m_msgCL2D;
bool m_bInitFlag1D; //是否初始化的标志
bool m_bInitFlag2D; //是否初始化的标志
WaveFilter m_dbF//分解滤波器
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:171526次
积分:4210
积分:4210
排名:第4952名
原创:253篇
转载:77篇
评论:52条
文章:18篇
阅读:15373
文章:152篇
阅读:87899
文章:24篇
阅读:12004
非CS科班出身,喜欢用C++思考数学 ,专注于图像处理!本博客基于交流和记录学习的历程为目的,与诸君共勉,欢迎交流。同时,博文有不少文字并非一字一字地敲打,若侵权,请联系本人,小波变换降噪应用及MATLAB实现_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
小波变换降噪应用及MATLAB实现
上传于||文档简介
&&仅​供​学​习​参​考​,​严​禁​传​播​。​感​谢​作​者​提​供​优​秀​的​资​源​。​感​谢​!
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 matlab小波分析程序 的文章

 

随机推荐