小波变换
我们可以通过常见的函数和toolbox两个办法来制定我们需要的小波变换,因为它与傅里叶不同点在于小波变换不是唯一确定的,例如不同的尺度下做的小波变换会不一样。小波变换的函数有很多,本文给了最常见的几种。在toolbox使用中,也会对比函数,整理各个参数的涵义。下图是常见的小波基函数参数表示和名称,其中的N是可以调节的整数。

小波变换是一种时域变换,是傅里叶分析的发展和延拓。相对于傅里叶变换,它除了是不唯一确定以外,它还很适用于非平稳信号。因为对于傅里叶变换而言,不同的非平稳信号的时域对应的频域都是一样的,这就说明无法从频域角度重构时域信号。再者就是二者的基不一样,小波基是不一样的,可以理解成短时傅里叶变换的窗是会自适应变换的。
wden函数是一种用小波进行一维信号的消噪或压缩的函数。
实例函数和结果如下所示,其中为了防止随机数的种子被固定,需要使其rng重新配置。
%%% wden函数:用小波进行一维信号的消噪或压缩
%%% XD = wden(X,TPTR,SORH,SCAL,N,'wname')
%1.输入参数SORH=s,软阈值;Sorh=h,硬阈值;
%2.输入参数scal规定了阈值处理随噪声水平的变化:
%SCAL=one,不随噪声水平变化。
%SCAL=mln,根据每一层小波分解的噪声水平估计进行调整。
%SCAL=sln,根据第一层小波分解的噪声水平估计进行调整。
%3.wname是小波函数类型的选用
clc;close all;clear all;
rng('default'); %随机种子重新设置
seed=2055415866;
snr=3; %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed); %产生非平稳含噪信号;
N=4;
SCAL='sln';
SORH='s';
xdH=wden(x,'heursure',SORH,SCAL,N,'sym6'); %heursure阈值信号处理;
xdR=wden(x,'rigrsure',SORH,SCAL,N,'sym6'); %rigrsure阈值信号处理;
xdS=wden(x,'sqtwolog',SORH,SCAL,N,'sym6'); %sqtwolog阈值信号处理;
xdM=wden(x,'minimaxi',SORH,SCAL,N,'sym6'); %minimaxi阈值信号处理;
subplot(3,2,1);
plot(xref);title('原始信号');
axis([1,2048,-10,15]);
subplot(3,2,2);
plot(x);title('含噪信号');
axis([1,2048,-10,15]);
subplot(3,2,3);
plot(xdH);xlabel('heursure阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,4);
plot(xdR);xlabel('rigrsure阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,5);
plot(xdS);xlabel('sqtwolog阈值消噪处理后的信号');
axis([1,2048,-10,15]);
subplot(3,2,6);
plot(xdM);xlabel('minimaxi阈值消噪处理后的信号');
axis([1,2048,-10,15]);

dwt和idwt是一维离散小波(反)变换。其实例和结果如下。其中,小波变换的参数ca1值得是”大概信号”,也就相对于低频,ad1值得是“细节信号”,也就相对于高频。
%%% dwt:单尺度一维离散小波变换
clear all;clc;close all;
% x=4+kron(ones(1,8),[1 -1])+((1:16).^2)/24+0.3*randn(1,16);
seed=2055415866;
snr=3; %设置信噪比;
[xref,x]=wnoise(1,9,snr,seed); %产生非平稳含噪信号;
[ca1,ad1]=dwt(x,'db2');
s=idwt(ca1,ad1,'db2');
err=norm(x-s);
figure;
subplot(3,2,[1 2]);
plot(x);title('原信号');
subplot(323);
plot(ca1);title('重构低通部分');
subplot(324);
plot(ad1);title('重构高通部分');
subplot(3,2,[5 6]);
plot(s);title(['根据高低通部分再次重构,与原信号的误差:',num2str(err)]);

wavedec函数和wrcoef函数也比较常用,wavedec函数是用于小波变换的多层次重构。wrcoef函数是用于对小波系数进行重构。
%%% wavedec函数:多层次单尺度一维小波分解
%%% [C,L]=wavedec(x,N,wname);
%%% [C,L]=wavedec(x,N,Lo_R,Hi_R);
%%% wrcoef函数:对一维小波系数进行单支重构
%%% s=wrcoef('type',C,L,'wname',N) 含N表示对N进行重构
%%% s=wrcoef('type',C,L,Lo_R,Hi_R,N)
它的实例和结果如下。
%%% wavedec函数:多层次单尺度一维小波分解
%%% [C,L]=wavedec(x,N,wname);
%%% [C,L]=wavedec(x,N,Lo_R,Hi_R);
clear all;clc;close all;
% rng('default'); %随机种子重新设置
seed=2055415866;
snr=3; %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed); %产生非平稳含噪信号;
wname='db1';
N=3; %进行3尺度小波分解
%%% wrcoef函数:对一维小波系数进行单支重构
%%% s=wrcoef('type',C,L,'wname',N) 含N表示对N进行重构
%%% s=wrcoef('type',C,L,Lo_R,Hi_R,N)
type='a'; %a是大概approximation(低频);d是细节detail(高频) %
[C,L]=wavedec(x,N,wname);
sa=wrcoef(type,C,L,wname,N); %N不加,默认为3
sd=wrcoef('d',C,L,wname);
figure;
subplot(311);
plot(x); title('原信号');
subplot(312);
plot(sa); title('低频重构');
subplot(313);
plot(sd); title('高频重构');

其实upwlev就是将尺度往上返回了一级,其实与手动将wavedec中的N系数减一是等效的。
其实例和结果如下。其中为了体现这一点,程序也验证了这一点。除此之外,也给出了对不同尺度上的低频(高频)的信号重构进行了对比。
clear all;clc;close all;
% load sumsin;
% s=sumsin(1:500);
rng('default'); %随机种子重新设置
seed=2055415866;
snr=3; %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed); %产生非平稳含噪信号;
subplot(411);plot(x);
title('原始sumsin信号');
[c,l]=wavedec(x,3,'db1');
subplot(412);plot(c);
title('小波3层重构');
xlabel('尺度为3的低频系数,尺度3,2,1的高频系数');
[c1,l1]=wavedec(x,2,'db1');
subplot(413);plot(c1);
title('小波2层重构');
xlabel('尺度为2的低频系数,尺度2,1的高频系数');
[nc,nl]=upwlev(c,l,'db1');
subplot(414);plot(nc);
title('小波2层重构,用upmlev从3层返回上一尺度');
figure;
for i=1:3
a(i,:)=wrcoef('a',c,l,'db1',i);
subplot(3,1,i);plot(a(i,:));title(['对尺度为',num2str(i),'上的低频信号进行重构']);
end
figure;
for i=1:3
b(i,:)=wrcoef('d',c,l,'db1',i);
subplot(3,1,i);plot(b(i,:));title(['对尺度为',num2str(i),'上的高频信号进行重构']);
end



wpdec和wprec这两个函数是对一维小波包进行分解和重构。
wprcoef函数是对小波包分解系数的重构,这里没有举例,应用到了包结点。
clear all;clc;close all;
%%% wprec和wpdec函数
% load sumsin;
% x=sumsin(1:500);
rng('default'); %随机种子重新设置
seed=2055415866;
snr=3; %设置信噪比;
[xref,x]=wnoise(1,11,snr,seed); %产生非平稳含噪信号;
wpt=wpdec(x,3,'db2');
rex=wprec(wpt);
subplot(211);plot(x);title('原信号');
subplot(212);plot(rex);title('分解后再重构的信号');

下节介绍
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO