科学网

 找回密码
  注册

tag 标签: SciLab

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]随机设置小波包变换的DFT算法模式
SciteJushi 2015-5-13 08:02
原载 http://blog.sina.com.cn/s/blog_729a92140102vngc.html 此前,在讨论小包分解与合成计算时,用变量Wp.RightShift控制生成基向量组时移位的左、右方向两种选择。在Tpwp的函数子程序( 如图片1.的右上角所示 )中,添加几个语句 (即if isempty(Right_Shift)…end部分),就直接增设了DFT(离散傅立叶变换)算法模式。用工作平台自带的计算DFT和逆变换IDFT的函数fft和ifft。因为,不必究等效地实现了以前的某部分计算,也不强调其对应外部的反转、移位关系等,所以居士列其为小波包变换的另一种设置选项。 虽然,使用的仍都是已知的时域尺度序列数据,但是,Tpwp明显不排除:直接解算和构造滤波器组的“离散频率”序列。 反复用“随机设置”一词,针对深奥呆板的形象。在不同的编程语言环境中,也不必精确一一对等地,实现那些所谓的设置。不证明某个选择特别正当,但是,始终以Matlab-R2011a工具箱中“实数域的普通离散小波变换”的“标准模式和算法”的重建误差为参照,表明它们都可行。某个选择可能只构成另一些设置的等效计算,也可能意味着用了不同的小波包基,可能使“小波包林”扩张了。 可用快速傅立(或付、里)叶变换FFT计算卷积,这在信号处理教科书中是常识。在小波变换理论与应用文献中,离散信号的分解与重构,都使用了线性卷积滤波器。自然地,很早就有研究论文,试用FFT来计算离散小波变换。本短文更表明, Tpwp的演绎机制的特点,使增设DFT算法模式,尤其简捷。 小波工具箱中的“数据边界延拓模式”以及Wavelab850中的“延拓后用函数filter”的方法,把一个圆卷积问题,也反而转化成了线性卷积来处理。然而,Tpwp理论把线性卷积问题首先周期化,再推演有限维酉空间的小波包分割与覆盖,所以其计算与FFT更靠近。 对被分解序列做FFT,再与基向量的频域序列F相乘,把乘积序列的逆傅立叶变换IFFT后(注意,也已算出要抛弃的部分)的下抽象样值,作为分解结果。对输入序列补插零值后,做FFT,再与基向量的频域序列相乘,把乘积序列的IFFT输出,作为合成结果。 验证方法的程序之一, PwpRandComplexFFT.m ,由《随机设置小波包变换的强迫复数化的测试》( 2014-11-25)中的 PwpRandComplex.m 改写而成。从图片1.的右下角,可见主要改变,在于插入了条件语句 if abs(Wp.RightShift)5e5, % about 60% tests Wp.RightShift= =TpwpGHfft(... phcoef,pgcoef,rphcoef,rpgcoef,Wp.DatL,Wp.DecL); end % FFT, on all the basis vectors 其中,把 Wp.RightShift,强行改为空矩阵作为标志,指示按 DFT算法模式使用基向量组,否者,仍用旧移位方式;子程序TpwpGHfft用FFT,预先将基本基向量组变换到频域。这是正确使用DFT算法模式,需要做的两件事情。其余程序语句,与 PwpRandComplex.m比, 不变。 一般说来,DFT要求整个处理系统用复数域,而且,函数子程序集,要能兼容控制复数化共轭滤波器组。若在降噪以及预置基的函数子程序中增加TpwpGHfft控制,那么,在降噪和分类识别等试验中,就可使用DFT算法模式了。新函数子程序包TpwpSubs.bin,比旧包大了11KB;TpwpSubs_E01.bin,约增大了1KB。仍用完全安装的Scilab-5.3.3制作,不从互联网下载任何工具箱和优化库文件,也无需用户库。 重编译 子程序集时,尽量少改,即使对于曾测到 rigrsure应用中的被零除的状况也保留(系数加权时可滤掉)。 用高级语言 编 程,且一般做“概念性的、演示性的”实现,不必需移位、数据寻址等的效率优化。 但是,顺便,遵循 Matlab编辑器的建议,在某些子程序中,把原未经初始化然而在循环语句中却需不断改变大小的向量,首先初始化了,这可能影响旧试验的 总耗时量。 生成图片1.中的曲线图,总的耗时约为1955秒,验证了兼容性、双向重建性质、双向保内性质。使用了128组尺度序列、2560组随机复数化滤波器、2560次深度为8的完整树小波包分解、5120次约束树分解、10240次小波包合成。每次分解的复随机信号以及用于合成的复随机系数序列的长度,随机地取为1、3、5、7、9或11与256的乘积。其中约百分之六十,用到了DFT算法模式。FFTW库的设置为estimate,这是Matlab默认的(其帮助文档说“The default method is estimate…If you set the method to 'estimate', the FFTW library does not use run-time tuning to select the algorithms. The resulting algorithms might not be optimal.”)。 用同样的输入参数,运行原 PwpRandComplex.m ,即无 DFT算法模式时,总的耗时约为:4381秒。 在《续用小规模人工神经网络试做个对留数不敏感的分类器》(2015-04-02)所用的测验程序WpdcNN1.m中,把参数Wp.RightShift=1改为Wp.RightShift= ,即将“右移位方式”改为“DFT算法模式”后,再运行,可见降噪性能非常接近然而可节约约百分之二十五的时间。 被处理信号和滤波器组都是实数值序列时,如果不引入DFT,那么分解与合成的结果,也都自动为实数值。然而,经复变换过程后,数字误差可能引入复数,尽管虚部可以很小。虚部值依赖于机器系统精度,也与实现傅里叶变换的子程序对对称性、虚部、实数性等的识别和控制有关(据居士已有经验,Matlab做得很好),这可能使兼容性问题和应用复杂化,总的处理时间也可能反而增加。这时,就不宜选DFT算法模式 。 涉及fft和ifft时,不用Scilab-5.5.0。若用,就除去其FFTW模块的库文件libfftw3-3.dll (资源管理器显示,2311KB, 2013-8-30)后,再重启动,使用默认的标准FFT (standard fft by default),才可实现类似于图片1.中那样的测验。这个文件,约为在5.3.3版中旧库(805KB, 2009-10-29)的3倍大,可能有了相当充分的优化控制,而与居士所用的机器系统难兼容。 新浪赛特居士SciteJushi-2015-05-13。 图片 1.DFT算法模式以及用强迫复数化滤波器组的测证结果(Matlab版)
985 次阅读|0 个评论
[转载]Tpwp的降噪阈值处理中可能存在Bug
SciteJushi 2015-4-20 09:49
单干,靠反复举些例子,继续测试了Tpwp。在Scilab-5.5.0中,已注意到了一个“被零除”的错误警告。 其中的降噪软阈值处理,不同于Matlab工具箱的处理,使用的是“乘以权系数”的方法。权系数用“1-t/a”形式计算,正常时,除数a不小于阈值t。这不影响阈值t。 以前的测试和应用中,未遇见这个警告、 非数字量、空值、无穷量、实序列经处理后的复数值 ,结果不受影响。但是,仅从源代码看起来,使用有的阈值时,子程序确实未排除系数值已经为零和除数 a为零的隐患,例如,a=t=0时, 零除以零。 警告的问题在于“rigrsure”中。借用的这个阈值涉及到名家,居士欲更谨慎。 图片1.是在Scilab-5.5.0和Matlab-R2011a中的“反常测试”的结果,表明问题在使用了rigrsure软阈值的方法6中,但是向量result0显示了输出中零值的数目正确、无非数字值、也没有无穷值,降噪函数子程序TcyspDenois能正确控制了这种情况。并未贬低了“阈值计算方法”。 说图示的测试是“反常”的,因为把噪声标准差强行地定为了1,然而给的输入的被处理序列的数值全为零。Dr.Donoho的SURE(参见本文末附Wavelab850中源代码ValSUREThresh.m)阈值计算方法中,假定噪声标准差为1、输入数据序列是信号的稀疏描述、阈值就是序列中某个元素的模值。真降噪时 , 阈值t为零的概率为零 , 除数a也就不为零 , 若a=t则加权值1-t/a正好为零。但是,在反常情况下,找到的阈值t为零时有a=t=0。 Tpwp在使用heursure软阈值时,已附加了条件a大于非负阈值t,而且 阈值计算本 身原也有了一种条件选择机制,所以没有遇见警告。 继续保留这一“Bug”,可能更明确SURE阈值的原特点,作为去年用Matlab工具箱的降噪函数已做测试的补充。可以说,那时的测试,主要针对了阈值t本身包含重要信号成分而噪声很小的问题,比如,分尺度处理时极可能发生在某个尺度上的情况。本文末附Wavelab850中的软阈值处理源代码(SoftThresh.m和HybridThresh.m),表明模值abs(y)等于阈值t时的系数y将被置为零。 新浪赛特居士SciteJushi-2015-04-20(22)。 图片 1.反常降噪试验的结果 附Wavlab850的3个源程序 1. function thresh = ValSUREThresh(x) % ValSUREThresh -- Adaptive Threshold Selection Using Principle of SURE % Usage % thresh = ValSUREThresh(y) % Inputs % y Noisy Data with Std. Deviation = 1 % Outputs % thresh Value of Threshold % % Description % SURE referes to Stein's Unbiased Risk Estimate. % a = sort(abs(x)).^2 ; b = cumsum(a); n = length(x); c = linspace(n-1,0,n); s = b+c.*a; risk = (n - ( 2 .* (1:n )) + s)/n; = min(risk); thresh = sqrt(a(ibest)); % % Copyright (c) 1993-5. Jonathan Buckheit, David Donoho and Iain Johnstone % % % Part of Wavelab Version 850 % Built Tue Jan 3 13:20:40 EST 2006 % This is Copyrighted Material % For Copying permissions see COPYING.m % Comments? e-mail wavelab@stat.stanford.edu 2. function x = SoftThresh(y,t) % SoftThresh -- Apply Soft Threshold % Usage % x = SoftThresh(y,t) % Inputs % y Noisy Data % t Threshold % Outputs % x sign(y)(|y|-t)_+ % res = (abs(y) - t); res = (res + abs(res))/2; x = sign(y).*res; % % Copyright (c) 1993-5. Jonathan Buckheit, David Donoho and Iain Johnstone % % % Part of Wavelab Version 850 % Built Tue Jan 3 13:20:39 EST 2006 % This is Copyrighted Material % For Copying permissions see COPYING.m % Comments? e-mail wavelab@stat.stanford.edu 3. function xhat = HybridThresh(y) % HybridThresh -- Adaptive Threshold Selection Using Principle of SURE % Usage % xhat = HybridThresh(y) % Inputs % y Noisy Data with Std. Deviation = 1 % Outputs % xhat Estimate of mean vector % % Description % SURE refers to Stein's Unbiased Risk Estimate. % % References % ``Adapting to Unknown Smoothness by Wavelet Shrinkage'' % by D.L. Donoho and I.M. Johnstone. % = dyadlength(y); magic = sqrt(2*log(n)); eta = (norm(y).^2 - n)/n; crit = J^(1.5)/sqrt(n); if eta crit xhat = SoftThresh(y,magic); else T = min(ValSUREThresh(y), magic); xhat = SoftThresh(y ,T); end % % Copyright (c) 1993-5. Jonathan Buckheit, David Donoho and Iain Johnstone % % % Part of Wavelab Version 850 % Built Tue Jan 3 13:20:39 EST 2006 % This is Copyrighted Material % For Copying permissions see COPYING.m % Comments? e-mail wavelab@stat.stanford.edu 参见 http://blog.sina.com.cn/s/blog_729a92140102vli8.html
1062 次阅读|0 个评论
[转载]续用小规模人工神经网络试做个对留数不敏感的分类器
SciteJushi 2015-4-2 09:30
原载 http://blog.sina.com.cn/s/blog_729a92140102vknx.html 先申明,博客中所用极点的参数值,主要取自居士很多年以前做的旧程序,但是它们的背景和意义涉及其他研究者的论文。近期未能复查早期文献。难以访问Google网已约一年了,但是留恋Google,仍留用了gmail地址。 人工神经网络作为分类器,有明显的诱人之处。例如,《在小波包域分类的几种简易方法的快速测试》(2014-08-20)的分类中,模板信号文件,必须供给每个类别充足的模板(原则上不一定都必须,程序包TpwpClassify.bin允许任意类别有多个模板向量, 可有冗余甚至重复,其排序可是随机的)数据集,而人工神经网络训练后就只需网络参数;正确分类时,网络输出层的“0”和“1”的质量高,可能有利于设置“拒绝分类”的条件。 企图用小波包开发缩短数据向量的一般方法,当然可以复指数和信号为试验例子,但减小了针对性就未充分利用这种特别的信号的特殊性质。删除博文《用小规模人工神经网络试做个对留数不敏感的分类器》(2014-09-15)中的小波包的内容,把经函数子程序WpdcTem做小波包变换以计算神经网络的输入 的语句,改为阻尼指数和信号模型拟合的语句,就可能用更小巧的神经网络达到更好的分类性能。 使用了“透明3句式简化神经计算”的测试程序PoleNN1.sce,类似于WpdcNN1.sce,附于本文后。语句 =PoleFitReal(x,3),用了3对(只适用于实信号)极点模型,拟合输入信号x, 用状态空间方法估计 极点 ,它用到的函数子程序与一年前上载的降噪时的程序相同。输出向量 pr含有与留数有关的分量强度值,但是本文的分类研究只用了极点参数,并整顿了不稳定极点。计算极点之前,用10点滑动窗口搜索信号强度最大区间,估计时间零点和延时,以截去x中的最开始的纯噪声部分。时间参考零点的判断以及留数值,可影响极点的主次顺序。 为了便于比较,本文的图片中也包括了,以新训练得的网络参数,重运行以前用了小波包变换的旧程序,所得到的新结果。虽然,在信噪比达到20dB后,新结果比旧正确率改善了约2个百分点,但是,明显仍未达到用极点参数时的“完全正确”。 信号处理和数据分析的某个试验结果,或运算过程中间的数字量,常是随机变量值。例如,本文程序中给定信噪比NFSA值时的Q0, Quality_0。如果特定研究主题中,随机变量的固有方差值越大,或作为函数值在某自变量区域内对自变量的变化越敏感,那么精确地重复试验结果的可能性就越小,下结论和做陈述就越需留余地而防避以偏概全。当原则上兼容的程序版本或运行环境条件等不同时,恶化了的结果可能使人不愉快,即使明显更好了却原因不明的结果,也可能是不详之兆。在奇异值截断和小波(包)系数筛选的处理中,记录和指定模型阶数或系数项数,比记录和指定阈值及其准则,更保险。当然,分类时使用固定的阶数或项数的直接原因是,神经网络的输入向量的长度是确定的。博文中的结果,不受阈值或主极点数目估计的程序质量的影响。然而,如果引入额外极点(近似地例如:强阻尼衰减或使某些频率成分的留数模值非常小),那么,它们的参数估计值可能具有较大的随机起伏,对分类造成不利影响。 图片1.是在Scilab-5.3.3中的试验结果。图片2.是在Matlab-R2011a中利用了神经网络工具箱的对象(Network Object)和模拟(sim)功能的测试结果。它们使用的随机数是不可能相同的,而且都不用训练时的样本,原时间序列的波形起伏很大,但是测试结果看起来是一致的。在计算程序中,某点后的计算,使用其前面部分的计算结果Y时,对Y的变化要足够灵敏才能反映模式的正常类别差异,但是,不能对无益的数字误差太敏感以免性能太依赖于程序细节,所以,对比在两个平台中的测试结果是有益的。 已见到,一些使用了普通的快速傅立叶变换函数fft而并无“fftw”的旧程序集,在Scilab-5.3.3中完全正常,然而在Scilab-5.5.0中遇到了严重错误提示:“ Warning !!! Scilab has found a critical error (EXCEPTION_ACCESS_VIOLATION) with fftw function. Save your data and restart Scilab. ”。仍未得其解,不过,本文的测试,即使直接使用旧版 bin文件包,也可在5.5.0版中完全正常地重复。 新浪赛特居士SciteJushi-2015-04-02。 图片 1.在Scilab中使用简化计算方式的试验结果 图片 2.在Matlab中利用了神经网络工具箱做相应测试的结果 附 1: 极点分类的测试程序 PoleNN1.sce // test pole parameters as ANN input to classify signals // without Neural Network Toolbox // last revised in Scilab-5.3.3, 2015-Mar // Baiyu Tang, tang.baiyu@gmail.com , tpurejade@yahoo.com load PoleNumber.bin; // to determine how many poles load PoleStSp.bin; // to estimate poles by State-Space // uploaded in SsSvdLfit.bin,2014-Feb load PoleFitReal.bin; // to make ANN input vector NET0=fscanfMat('PNET1.txt');// Network data made in Matlab NET0=NET0(:); // PNET1-parameter=ANN=templates annb0=NET0(1:6); annw0=NET0(7:12); annb0=-annb0.*annw0-1; annb1=NET0(13:18); annb2=NET0(19:24); annw1=zeros(6,6); annw1(:)=NET0(25:60); annw2=zeros(6,6); annw2(:)=NET0(61:length(NET0)); clear NET0; a= ; // modulus parameters from signal poles f= ; // frequency parameters from signal poles // parameters, according to ? reference n=0:255; // time points nfsa=-10:10:40; // SNR values at0=16+16; // tests, averages R0=zeros(nfsa); Q0=R0; Q1=R0; disp( ); // environment disp( ); // SNR values for k=1:at0 for t=0:15 for g=1:length(nfsa) for s=1:size(a,1) x=zeros(n); // unknown signal x for p=1:size(a,2) a1=1+A0*rand(1,1,'normal'); // modulus p1=P0*rand(1,1,'uniform'); // phase x1=(a(s,p)).^n.*cos(f(s,p)*n+p1)*a1; x=x+x1; end // random, frequency components if t0 then x((t+1):length(n))=x(1:(length(n)-t)); x(1:t)=0; end // shift g0=stdev(x) + %eps; g0=(10)^(nfsa(g)/20)/g0; // gain x=g0*x + rand(x,'normal'); // add noise =PoleFitReal(x,3); annx1=pr(1:6).*annw0+annb0; // 0 anny1=(2)./(1+exp(annw1*annx1+annb1))-1; // 1 op0=(1)./(1+exp(annw2*anny1+annb2)); // 2 // 3-Line ANN,above. 0, preprocess; 1, layer 1; 2, layer 2 =max(op0); // maximal output if m1==s then // correct ! R0(g)=R0(g) + 1; // count Q1(g)=Q1(g) + m0; // save maximum op0(m1)=0; m1=max(op0); // second maximum Q0(g)=Q0(g) + m1/(m0+%eps); // ratio end end // signals, 6 end // SNR, gains end // 16 time-zero shifts, 0~15 end // at0 averages, 16 + 16=32 Q0=Q0./(R0 + %eps); Q1=Q1./(R0 + %eps); R0=R0/(t+1)/s/at0*100; // percentage disp( ); // near 100 ? disp( ); // near 0 ? disp( ); // near 1 ? 附 2: PoleNN1.sce极点分类的神经网络的参数文件PNET1.txt -9.7001864649092395e-001 8.2228746467506664e-001 -9.9841706558010357e-001 8.6073529358501055e+000 -9.9946164616867672e-001 -1.1370405375095975e+001 7.8331773967972931e-002 8.5791261062914859e-001 0.0000000000000000e+000 -3.7518343047966390e-001 0.0000000000000000e+000 -3.9914434550305089e-001 1.0168633533535287e+000 1.2145745679039269e-001 1.0022907056597719e+000 -6.2470499564767334e-001 1.0005092906598054e+000 9.6802333333840163e-001 2.1725804781883249e+000 1.1392660477818990e-001 2.0004178155900005e+000 1.7614334771696230e+000 2.0005104068138762e+000 -3.0665841024408912e-002 4.2867241266078633e+000 9.9029532777832152e+004 2.2869661299959422e+001 1.1343024881943779e+005 -4.0719303362011248e+000 -9.6400258210043103e+003 4.0137456023970124e+000 -2.8035526823962668e+003 -7.1074756974931816e+001 2.7352861558287586e+003 7.0460686286322849e+000 -2.8993763354456831e+004 1.0001472749782264e+004 -9.0059304695486787e+002 8.4553623988249325e+004 -1.8255211316820944e+005 7.9430697328921291e+004 -5.8823521466239595e+002 1.4595956455398898e+005 -4.7957899247499736e+000 1.0335345593403614e+005 2.8227337545756217e+001 7.4418026361899392e+003 -1.9909580436031276e+004 9.4410285139494867e+000 -2.6292650897324970e+003 -3.6878789607114740e+001 -1.8250910924409406e+005 1.7804010734139329e+001 5.6291889832330526e+004 8.9139918474714932e+000 1.9716133668027009e+001 8.9457827228879609e+001 -8.5960396937156283e+000 -6.8109506008108784e+000 2.6283669500671662e+004 -3.7368053321945094e-001 -9.2064074497027643e+004 -1.6341015633980660e+001 -2.8860466512272713e+004 2.0339643613342567e+001 9.9597239940579748e+003 -4.7409349620212593e-001 2.8350855467600336e+003 2.8417166645301322e+000 -2.5571958087003432e+003 -1.5088157491108993e+000 -1.1898018372091863e+004 7.8581530664099480e-002 -1.1750729256249442e+003 -2.2415747866308286e-001 -1.1951179910072406e+002 6.2189382961284034e-001 3.0132397631962514e+004 5.0317773907572777e-002 -1.4565004647591210e+005 -2.1791390419722849e+000 -1.0362971506796384e+005 -3.7237562663612479e-002 6.4063632373845496e+002 -3.8621497838968777e+000 4.7886950966229428e+001 -1.0141524313134971e+001 -5.6818827517174171e+001 -2.7249734922847684e+000 5.3171539314512054e+004 -3.5819003556308191e+000 3.0803697842005062e+002 9.7693120851159829e+000 -5.0824628161417183e+002 1.7343205333740617e+000 -1.0100438721559891e+004 附 3: WpdcNN1.sce小波包系数分类的神经网络的参数文件NET1.txt 6.0000000000000000e+000 4.4856583936547718e+000 6.0000000000000000e+000 1.4412194173702289e+000 6.0000000000000000e+000 -8.0842662638747854e+001 5.0000000000000000e+000 -2.9318043213084271e+000 5.0000000000000000e+000 1.6842958003694328e+001 5.0000000000000000e+000 -4.4051063542775211e+000 1.0000000000000000e+000 2.0701502176589589e+001 1.0000000000000000e+000 2.0781636982160374e+000 5.1663456887329995e-001 -4.1137621409843902e+001 -5.8646858411805147e-001 4.3368729741586954e+001 -4.4608164193301536e-001 -7.7706916962203989e+000 -3.5900554023356862e-001 1.2507637265397444e+000 -3.0526030654239644e-001 5.8489614124737734e+000 -2.8400106815631487e-001 3.8318942498164121e+000 -2.4884597466681016e-001 2.0382554486476018e+001 -2.4664939914916470e-001 6.2339872996440404e-001 4.2105263157894736e-003 -1.1592315476438252e+001 2.8571428571428571e-003 8.9986791712168723e-001 2.1231422505307855e-003 -1.5448947929076134e+001 1.9723865877712033e-003 9.5922042590618290e+001 1.9665683382497543e-003 1.6785765135840416e+000 1.9685039370078740e-003 9.2004437253351601e-001 1.9550342130987292e-003 -3.7220112016904237e+000 1.9588638589618022e-003 -1.6988084726928925e+000 4.5975557953750767e+000 2.8534451746861517e+001 1.6306152096519926e+000 -1.9120130751931810e+000 2.0432503734135352e+000 2.7441526748272378e+000 2.7898307181743154e+000 -3.1405091896574650e-001 3.1554944754998209e+000 1.5689184945050241e+000 3.4713188683638747e+000 2.3999140992074569e+001 3.9081257465389827e+000 6.7996060698088734e-001 4.1503303429488625e+000 -3.8027825470942866e-001 -5.0286533379649580e+002 5.0082575926363848e+000 2.0469835137451852e+001 -6.6871526782035007e-001 5.9996854502896273e+000 -9.1306264873679872e+000 -9.1427252859991004e+000 -8.8170543247149125e-001 -2.3457862673867020e+001 2.2010454729149682e+000 -1.7068247883440065e+002 -5.3529506822350387e-002 -1.8604101003698739e+002 3.7398587004048909e+000 -5.9183190379286588e+000 3.2942480011080185e+001 3.8848257614425813e+002 2.6943256257758286e-001 5.8997746029433216e+001 -1.5287529946426140e-001 6.4609614679271385e+002 1.1463043304663854e+001 6.5607714127360441e+002 -2.7108682318929528e-001 2.7441576114423140e+002 -6.2570394645273737e+000 4.6558748552768907e+002 2.0827890573440022e-001 2.4399301394028348e+003 -3.7654886437168096e+000 9.2742894257440571e+002 -1.4472021948725325e-001 -2.3446895637501299e+002 3.3258570894096429e+000 5.8410990519239569e+001 6.2048484527039108e+001 -3.8346121231300664e+001 7.2493199297999555e-001 -5.1698140372830368e+000 -2.7157813990108559e-001 -1.7179012138903559e+001 2.6350678529095415e+000 -8.5190790136254989e+001 -4.6042727207148676e-001 -1.2895440085356358e+002 -6.8409092483996137e+000 -5.2650680455508327e+000 -5.2934643843177709e-001 2.1171202689264321e+000 -1.6996109777052920e-001 2.2512649009317251e+001 5.8899503788983565e-001 1.4657574266316708e+001 2.4939241797810192e+000 -1.9869487765085349e+001 3.8223020157147765e+001 3.2651604764652927e+002 -9.4997208520872151e-002 -2.3511378659416746e-001 8.8181941041142312e-002 -4.6301172671663608e+001 2.7398633581218217e+000 1.5119139556755643e+001 -3.3044493014795381e-002 -6.0225894603903164e+001 -5.0892816128760048e+000 4.0222266525911460e-001 -1.0653420907389113e+000 1.1609163565963070e+002 -3.0068587752140141e-001 3.6648218126967876e+001 2.6660320835334615e-002 -9.1933709052080772e+001 3.0288520003607333e-001 2.2727639401628338e+001 2.7123766368255279e+001 -3.2728139806394915e+002 2.4748408904606362e-002 9.9844271301132226e-001 -1.3125690766143167e-001 -2.3889190666358669e+001 -9.1370921545324413e-001 -3.0665715375936188e+001 4.9573788790151486e-002 4.0039240640194880e+000 -3.4656205036599634e+000 2.8080155785269394e+000 3.2850091354414502e+001 8.1621453111583051e+001 4.4299907442163295e+001 -2.4234150510363843e+000 2.6142263943010573e+002 -1.7983996568584948e+002 -2.5891540325471595e+002 -1.3033836059320011e+001 1.1434156187282975e+001 2.1849100158979026e-001 -5.1026348195399265e+001 -1.8536213815217686e+000 4.0400345016561701e+001 3.6287844380401415e+000 2.7765801234509251e+001 2.4599662318024862e+000 4.3991228900813138e+002 -1.3651803932150715e+000 -4.3569765958348779e+002 -6.8760148474647653e-001 7.7916341100091131e+001 9.3163389217646241e+001 -3.4222406645486132e+001 1.9004212823053630e+000 1.0929758202560279e+002 1.5433125494808801e+000 1.0927356179961610e+002 -9.0758449814626605e+000 7.0212942648940270e+002 -1.0421204926713974e+000 -6.9539357611712649e+002 -9.7863746771569682e-001 -8.7015983785352802e+001 4.9085497875890338e+000 -4.0334679820297515e+002 3.2885838710982775e+001 9.9225060062442901e+002 5.4008808840309952e-001 8.1434471072088888e+002 -2.2569013233010904e-001 -1.1964514033771459e+003 6.0435391176744240e+001 1.1849733059885525e+003 3.7705869877445902e-001 5.8279680479687528e+001 -1.0407172355623429e+001 -1.0437559895191507e+001 -5.9361899959855133e+000 -5.1501973193929143e+002 2.2449587294764677e+000 4.0144046978566524e+002 -1.2921249284291056e+000 7.5692646411530586e+002 4.7812948110001487e+000 -7.4964489110110935e+002 2.9724550977605752e+001 1.5183798839339289e+000 5.5837275201243297e-001 -1.0359026239386095e+002 -7.1540692115409699e-001 -1.9836051183352558e+002 3.7371284653896652e+001 -5.6010818936877387e+000 3.3499656900280644e-001 4.4698737123703665e+002 -9.6762823169515570e+000 -2.1650706676511689e+002 -6.9535567645835714e+000 1.0003179829440913e+003 9.3149985101249699e-001 6.2122070140454855e+002 -1.5556588928086182e-001 2.1012514596900181e+002 1.8577948330905409e+000 1.3059875259429743e+003 2.4947106595091292e+001 1.6285806473412676e+003 -1.8833384873797498e-002 -1.6129758207485745e+003 1.5280296209873034e-001 7.5350755527128939e+001 3.8101403121723528e+001 3.8415467246873487e+002 5.5155256295595234e-001 -8.4188747965857328e+002 1.6058565068826994e-001 -4.0457778549790839e+002 -3.0399971279810205e+000 3.2686552600859086e+003 -2.3276454683628098e+000 -3.2373020592844282e+003 -5.2608298934111508e-002 -1.2354911652811129e+003 5.1805186902684230e-001 -5.6189471968372430e+001 1.8280455447267322e+001 4.8541149215323503e+002 1.1379046117018758e-002 9.9224256719942878e+002 1.1930285664889317e-001 -2.2386675388155613e+003 3.1205319359375228e+001 -9.1002243453628012e+002 3.8739704097690758e-001 8.8106445447364092e+002 2.9190268627938131e+001 1.1935942753409761e+003 6.0303440947209745e+000 -3.0458536622834208e+002 1.2450531263179774e+000 4.9035651454262864e+002 1.3617641665802791e+000 1.9292497877229296e+003 -1.0996232091870549e+001 -1.9107617652914489e+003 2.2332900230703814e+001 -2.8010997068217549e+001 (完)
869 次阅读|0 个评论
[转载]酉空间中的小波包变换的保内性质
SciteJushi 2014-11-5 09:58
原载 http://blog.sina.com.cn/s/blog_729a92140102v99e.html 虽然,Matlab中的基本运算和许多函数的自变量,都可以使用复数,但是,如图片1.所证实,Matlab的已经很不年轻的小波工具箱,不能处理复信号。输入为复数值序列(给同一个实信号,叠加上很弱的虚部,作为扰动)时,工具箱的小波包变换和普通离散小波变换的函数,都可以运行,也未给出错误和警告提示,但是,都完全不能实现重建(用wpcoef、wprec、wprcoef的结果是相同的)。这出人意料,局限了眼界和应用研究。 可以说,没有复数概念和复数域,信号与系统分析理论就寸步难行。傅立叶分析中的时间和频率是实变量,而函数值是复数。拉氏变换中和Z变换中,自变量也是复数。甚至求导数和原函数,也要求自变量是复数。所谓的能量有限信号空间,常被默认为复信号空间。傅立叶变换是完备的复内积空间上的酉变换(复正交变换),人们表述其性质时,一般默认复信号。如果把线性变换(系统)用的矩阵,视为算子的初等例子,那么在涉及共轭算子(伴随算子、伴随变换)时,常用到矩阵的“共轭转置”而不限制于“转置”。有时加上字眼“酉”或“复”限制空间、算子、变换、正交系等词语,以明确强调“用复数”。即使,实用例子的小波函数值、滤波器系数、矩阵元素,都是实数,也常在理论表述中,使用复共轭运算符号,把实数默认为虚部为零的特殊复数,这明确了立足点和基本观念:变换是定义在复信号集上的。 本文用Tpwp,来可视化:复信号经对偶变换的处理后的双向内积误差。这是对滤波器组的数字性能的一种综合测验。 这里用的主程序PwpRandDualIP.sce,附于本文末。它由《随机设置小波包变换及其优选基的随机降秩矩阵》(2014-03-19)中的PwpRandPsbm.sce改编而成。其中准备滤波器组的那部分程序段,在博客中已反复使用过。使用旧的函数子程序包,默认滤波器序列都为实数,而被处理信号可以用复数。 程序主体包括两重for循环,分别对应了98个滤波器组的序号、20次重复实验的序号。 被处理信号(序列、向量)的长度,是 128与一个奇数的乘积,相应的小波包变换有7级分解。这个奇数从1、3、5或7中随机抽取。 测试信号x和y的实部、虚部,都是服从高斯分布的白噪声。均值,在区间 内均匀分布;标准差,在区间 内均匀分布。 语句 =TpwpDec(x,……),实现对复信号x的完整小包分解。 根据 它的输出,用Shannon熵准则,选择基。可是任意的一种选择,不必定标和明确实用含义。因为被分解的向量是随机的,所以某一基底是否能被选中,这也是可变化的。如果,发现原始数据序列为“最佳”系数,那么,强行改变选择,即,使用普通离散小波变换基。 使用不同计算方式和各种随机变量值,可以增大冲激、测试范围,使各种问题更难漏掉。用模为1的随机复数i0,与被处理序列相乘,强行扰乱了实部和虚部,也可以明示复内积运算的“线性”或“共轭线性”形式。 对y*i0的分解处理,不使用TpwpDec做完全分解,而使用了约束小波包分解程序PsbsDec。 分解系数序列间的内积,与原被分解序列间的内积,它们的差的模值与被分解序列的范数之比,作为前向内积误差,被记入误差矩阵TestEr1。这个误差矩阵,最后被描绘于图形窗口的上半部。 把x*i0和y视为某最佳小波包基上的分解系数序列,以合成信号u和v。合成前的序列的内积,与合成后的序列的内积,它们的差的模值,与x和y的范数之比,作为后向内积误差,被记入误差矩阵TestEr2。这个误差矩阵,最后被描绘于图形窗口的下半部。 测试结果,如图片 2.所示。每幅图,包含20条随机实验的曲线,都显示了很小的内积误差。如果用不同的随机数种子,程序重复运行,也就意味着做了更多次试验。 附主程序: // PwpRandDualIP.sce // test the random settings of wavelet packets // and complex inner product preservation // clear; rand('seed',1e8); exec('PwpRandDualIP.sce'); // in order to run with fixed seed // clear; exec('PwpRandDualIP.sce'); // in order to repeat with variable seed // TpwpSubs.bin, TpwpSubs_E01.bin, MatOrtWlts.bin // made with Scilab-5.3.3, // are in current directory (pwd(), cd ) // reference: PwpRandPsbm.sce, uploaded, 2014-03-19 // last revised,in Scilab-5.5.0, Baiyu Tang, 2014-Nov // tang.baiyu@gmail.com , tpurejade@yahoo.com xdel(winsid()); // kill all figures mode(0); ieee(1); clc; date1=getdate(); date1=date1( ); disp( ); tic(); load('TpwpSubs.bin'); // load function subroutines load('TpwpSubs_E01.bin');// extended subroutines to preset basis load('MatOrtWlts.bin'); // load the filter cases Wp.DecL=7; // maximal decomposition level TestEr1=zeros(98,20); // error matrix_1 TestEr2=zeros(98,20); // error matrix_2 // ---compute for ii=1:98; // filter case index for jj=1:20; // random test index // ---random length of test signal Wp.DatL=(1+2*round(3*rand(1,1,'uniform')))*2^Wp.DecL; // ---random settings Set0=rand(1,9,'normal')*1e6; Wp.RightShift=Set0(1); Wp.ExchangeR_D=Set0(2); Wp.FlipFirst=Set0(3); Wp.MatchFilter=Set0(4); Wp.LowT_zero=fix(Set0(5)); // integer Wp.HighT_shift=fix(Set0(6)); // integer Wp.FlipTime=Set0(7); Wp.PeriodFirst=Set0(8); Wp.AlterL4fSign=Set0(9); // ---get filters if Wp.ExchangeR_D0 then =WltFilters(ii); else =WltFilters(ii); end if length(hcoef)2 then if length(rhcoef)1 then hcoef=rhcoef; rhcoef= =TpwpAllGH(hcoef,rhcoef,Wp.DatL,Wp.DecL,... Wp.MatchFilter,Wp.PeriodFirst,Wp.LowT_zero,Wp.HighT_shift,Wp.FlipTime); if Wp.AlterL4fSign0 then // forced Matlab-sign. usually not used hlen=max(round(length(hcoef)/2),round(length(rhcoef)/2))/2; if fix(hlen)==hlen then pgcoef=-pgcoef; rpgcoef=-rpgcoef; end end if length(rphcoef)Wp.DatL then // orthogonal case rphcoef=phcoef; rpgcoef=pgcoef; end // ---random signals sd=rand(1,4,'uniform')*67+1;// random standard deviation m=rand(1,4,'uniform')*6; // random mean, for N(m, sd) i0=exp(rand(1,1,'uniform')*2*%pi*%i); x=complex(rand(1,Wp.DatL,'normal')*sd(1) + m(1),... rand(1,Wp.DatL,'normal')*sd(2) + m(2)); y=complex(rand(1,Wp.DatL,'normal')*sd(3) + m(3),... rand(1,Wp.DatL,'normal')*sd(4) + m(4)); xy0=sqrt(abs(x(:)'*x(:))*abs(y(:)'*y(:)))+%eps; // ---basis selection =TpwpDec(x,Wp.DecL,phcoef,pgcoef,Wp.RightShift); =TpwpCost(abs(dec0),1, );// cost, Shannon entropy =TpwpBest(c0,Wp.DecL); // best basis, any selection if sf(1)0 then // too short to make sense =TpwpWavelet(Wp.DecL); // then, common wavelet basis end =TpwpCoeIndx(sf,Wp.DecL,Wp.DatL);// coefficient index // ---forward (decomposition) inner product u=dec0(Indx0); =PsbsDec(Indx0,(y*i0),Wp.DecL,rphcoef,rpgcoef,Wp.RightShift); v=dec0(Indx0); TestEr1(ii,jj)=abs(u(:)'*v(:)-x(:)'*y(:)*i0)/xy0; // ---backward (synthesis) inner product =TpwpSynt(Indx0,(x*i0),Wp.DecL,Wp.DatL,phcoef,pgcoef,Wp.RightShift); =TpwpSynt(Indx0,y,Wp.DecL,Wp.DatL,rphcoef,rpgcoef,Wp.RightShift); TestEr2(ii,jj)=abs(u(:)'*v(:)-x(:)'*y(:)*i0')/xy0; end end // ---display TestEr1=TestEr1+1e-16; // set lower bound TestEr2=TestEr2+1e-16; tl='PwpRandDualIP.sce: Test 20 Sets of Random Settings for Inner Product'; xl='Filters: sym1-sym35,coif1-coif5,dmey,db4-db42,18 biorthogonal cases'; AuLabel1= ; subplot(2,1,1); plot2d('nl',TestEr1); set(gca(),'tight_limits','on'); set(gca(),'box','on'); set(gca(),'grid', ); title(tl); xlabel(xl); ylabel('Forward Complex-Inner-Product Error'); xstring(1,min(TestEr1),AuLabel1); subplot(2,1,2); plot2d('nl',TestEr2); set(gca(),'tight_limits','on'); set(gca(),'box','on'); set(gca(),'grid', ); title(tl); xlabel(xl); ylabel('Backward Complex-Inner-Product Error'); xstring(1,min(TestEr2),AuLabel1); // ---timing Time_In_second=toc(), // !Date and Time: 2014 11 3 12 12 35 ...... ! // Time_In_second = // 375.937 // --sum(TestEr1) // ans = // 0.0005529 // --sum(TestEr2) // ans = // 0.0006100 新浪赛特居士SciteJushi-2014-11-05。 图片 1. Matlab小波工具箱中的复信号的离散变换的失败 图片 2. 酉空间中的随机设置小波包变换的保内性质
1152 次阅读|0 个评论
[转载]从Scilab-5.3.3升级到Scilab-5.5.0后的状况
SciteJushi 2014-10-5 09:55
原载 http://blog.sina.com.cn/s/blog_729a92140102v6q1.html 在此前的博客中的程序,主要涉及Scilab-5.3.3 (下载日期2012-02-22)。这几天试用Scilab-5.5.0 (下载日期2014-09-26),感觉最诱人的改进,在于新版的编辑器SciNotes。重新运行了指数和复值信号的降噪和参数估计程序、小波包域的信号分类程序等。在两版本(同一机器上的不使用互联网的完全安装)中,数值结果相同。但是,在新版本的命令窗口中,可见到一些旧版中没有过的“警告提示”,如图片1.和图片2.的对比所示。 在Scilab-5.5.0中plot(x,y)做图时,如果x和y中一个是行向量,而另一个是列向量,那么它将给出警告,但仍能正确绘图。在Scilab-5.3.3中,以及在Matlab-R2011a中,都无这种提示。上传的降噪源程序中的语句 plot(NFSAs, AveRMSE(:,jjj), LinStyl(DenMode1(jjj),:)); 就面临这一兼容问题。最好在 NFSAs后再加(:)以避免分歧,也可用“转置”(transpose)运算或者在赋初值时就把NFSAs定义为列向量。 Scilab的函数文件,默认每个bin文件定义一个函数变量( Scilab tacitly assumes that each xxxx.bin file defines a variable named xxxx . )。但是,居士上载的Tpwp的几个bin文件,都是函数包。在Scilab-5.3.3中做的大量随机试验和应用例子,都有相应的在Matlab-R2011a中的版本(函数使用分立的p文件!)的比较。所以确定,函数包方式以及其中的函数是正当的。 从图片中,可见,运行程序f533_550.sce后,从命令窗口中用load再装载旧的函数包时,两个版本的响应不一致。在5.3.3中未见警告。在5.5.0中,见到了警告:“函数被重新定义”(redefining function);有趣的是:干脆再用load反复装载时,反而不见警告提示了。新版中的函数变量及其装载和保护层次的管理,可能有所改变。 从图片中,可见5.5.0的提示:用funcprot(0), 可以抑制这种警告消息。由帮助(Help)文档更可知,用户可用funcprot(prot)控制“函数被重定义时”Scilab的处理方式:在 prot = 0条件下,不提示 ;在 prot =1 条件下,仅发出警告提示,这是系统默认的方式; 在 prot = 2条件下,按照“错误”(error)对待。 但是,在两版本环境中,用 x=funcprot()和y=warning(‘query’)查询的结果,都是相同的,这表明在Scilab-5.3.3中并未特别地关闭警告信息。实际上,在5.3.3中,即使干脆用了funcprot(2),然后也可以正确运行含load命令的程序重复装载函数。其中,执行load,似乎并不意味着“定义”。 未见这种不一致造成了运算的错误。不过,最好,用clear清理现场,移去旧变量,这有利无害。用图片上的短程序,如果没有clear语句,而在Scilab-5.5.0中反复运行,那么可见到一串“函数被重新定义”的提示。 复值信号和噪声,是令人关注的。随机数发生器函数rand的新版的帮助文档中,增添了许多旧版中没有的内容。以前曾讨论过Scilab中计算标准差的函数,在本文的图片中,顺便测试了曾用到的Scilab的均值函数mean。其两个版本的帮助文档,都表明输入x是实向量(real vector),但是,对复向量的计算结果是正确的(见实部与虚部的比例)。 在5.5.0中,用tic()和toc()计算和显示的时间,一般比在5.3.3中,更长些。 闲居乡下,用3G无线网,不便去一些研讨Scilab的专业网站,但是,衷心感谢和祝福Scilab这种高质量的免费的科学计算软件! 新浪赛特居士SciteJushi-2014-10-05。 图片 1.在Scilab-5.3.3中的一些测试 图片 2.在Scilab-5.5.0中的对应测试
1278 次阅读|0 个评论
[转载]一个神经网络的三种模拟方法的速度比较
SciteJushi 2014-9-25 08:45
原载 http://blog.sina.com.cn/s/blog_729a92140102v619.html 针对《用小规模人工神经网络试做个对留数不敏感的分类器》(2014-09-15)中提及的给定输入求输出(模拟,simulation)的三种方式,撇开具体的分类信号和小波包处理等问题,以其从Matlab工具箱中训练而得的人工神经网络为例,本短文给出更显明的比较测试。 Matlab程序段和结果,如文后的图片所示。最末一个(第三个for)循环,试验了5000个高斯白噪声序列作为输入,用“透明3句式简化神经计算”,分别对每个输入(激励)求输出。这种模拟方法的速度最快,其总的耗时量不足一秒。 第二个for循环,也试验了5000个高斯白噪声序列。分别对每个输入向量x0,求输出向量y0=NET1(x0)。NET1是一个神经网络对象(network object),其计算需要Matlab的神经网络工具箱。这种模拟方法的速度最慢,其总的耗时量超过了一百五十秒,有些不可思议。 上述两个循环语句,比较测试了两种模拟方法。二者之间,还有语句 x0=randn(16,5000); y0=NET1(x0); 它们把 5000个高斯白噪声序列,先存入一个矩阵,然后再一起输入到神经网络,得到一个输出矩阵。这是第三种模拟方法,它与“透明3句式简化神经计算”相比,总的耗时量相当。优点可能是,保留了完整的神经网络对象以便于继续学习。但是,这需要更多存储空间,其实时性也差些,需要工具箱的复杂处理程序。例如,求传递函数(传输函数transfer function,不同于信号与系统分析中的常用术语;在神经网络工具箱的词汇表Glossary中,未见激活函数activation function)的输出所涉及的源程序tansig.m,就长达二百多行。 第一个for循环,比较了“透明3句式简化神经计算”与用神经网络对象NET1计算的输出结果之间的误差。使用1000个高斯白噪声序列,作为输入。输入序列的标准差,也是随机数,在 内均匀分布。如此反常地大动态范围的输入,产生的输出向量的范数norm(y0),其变化范围也很大,在3e-10至1.8之间。在有效分类的应用情况下,输出向量的范数应接近于1。两种模拟方法的输出向量的误差的范数(最大值e(1)小于4e-14),远小于3e-10,而更接近于机器精度(eps,2.2e-16)。这表明,两种计算方法的输出,等价。 在模式识别时,脱离了工具箱和学习环境,而使用简化计算方法,是令人放心的。 新浪赛特居士SciteJushi-2014-09-25。 图片
962 次阅读|0 个评论
[转载]用小规模人工神经网络试做个对留数不敏感的分类器
SciteJushi 2014-9-15 09:07
原载 http://blog.sina.com.cn/s/blog_729a92140102v53r.html 大小之分,是相对而言的。用“小规模”一词,一方面强调:用FFT、小波(包)变换、特征提取等技术,压缩有用信息,使输入到人工神经网络的向量的长度显著小于原始信号的长度(《小波理论及其在雷达信号处理和目标识别中的应用》,北京理工大学学位论文,1997)。这是降低人工神经网络的结构复杂度和提高其工作效率的关键。 “小规模”也强调:在Scilab中做分类时,不用任何人工神经网络工具箱,而只用3个极普通的语句,实现了神经计算。如图片1.所示,测试程序中的3个语句(第58、59、60行, 3-Line ANN)只含指数函数(exp)和加减乘除运算,其中名字以“ann”开头的普通变量,即是连接权、偏置、数据定标等网络参数。 如果有Matlab-R2011a的人工神经网络工具箱,那么“用户语句”的形式可更简单,只一句即可获得神经计算的结果,而且可直接用批量数据作为输入。但是,其背后实际运行的Matlab程序的内容复杂,涉及数据阵列、对象、类、结构变量等。其仅仅求传递函数(transfer function)的输出的m程序,就长达二百多行。与上述“透明3句式简化神经计算”相比,这显得封闭而且深不可测。 本文的例子中,人工神经网络的输入向量长度为16。需保存268个浮点数外,无需再预存其它任何信号模板。选择阻尼指数和信号模型及其留数的随机变化问题为例,不仅有强的应用背景,也摆脱某些领域的保密性或代价大的实测数据的财产所有权等的困扰,使研讨更灵活、容易交流和连续。 语句 =WpdcTem(x, Wp, -1, 内的均匀分布。无噪序列合成后的时移(移入0,抛弃输出者)范围,为0~15;在时移后的结果上,再加高斯白噪声。 用同一程序WpdcNN1.sce,做两次测试。一次取A0=0,P0=0。另一次取A0=0.16,相位分布范围为360度,生成55296对随机留数。 如图片1.的右半部所示,Correct_Rates、Quality_0、Quality_1的值,分别越接近于100、0、1,意味着分类性能越好。似乎轻易达到了相当不错的结果,但是,不表明网络已被训练达到全局最佳,未知再提高的余地或方案。开放自由的研讨,供感兴趣者参考,无意提供排它的“最优解”,不证明其中任何一个步骤或处理构件是必需的或已是最佳配置的。 图片2.是在Matlab-R2011a中利用其神经网络工具箱的测试结果。与在Scilab中使用的随机数序列是不可能相同的,但是测试结果看起来相当地一致。 至于随机数种子,值得注意的是:虽然Matlab-R2011a仍支持用rand或randn带输入‘seed’的程序,但是,在它们运行后,需要先用rng(‘default’)然后才可能用rng(1.6e8)等,否则会得到错误信息。顺便指出:在子程序中,小心利用系统时钟(clock)来控制种子,以防因机器系统或程序运行的速度显著变化后而造成麻烦。 图片2.的底端,显示(view)了所用的神经网络的结构示意图。 图片3.是图片2.中运行的Matlab程序WpdcNN1.m,对应、等效于图片1.中的Scilab程序WpdcNN1.sce。其中可见的频率参数f、幅度衰减因子a,在居士的博客中已反复出现过。 语句 = WpdcTem(x, Wp, -1, ); 分别实现小波包变换、神经计算。把神经网络的输出 op0,用作相关分类器中的相关系数似地,判决类别。 测试程序的主体,包括5层嵌套for循环,从外到内,依次对应:试验平均的次数(32),16个时移值,6个信噪比值,信号的6个类别,无噪信号的3个频率成分。 从图中可见,在Matlab中比在Scilab中的测试,需要约多出1倍的时间。但是,如果在WpdcNN1.m中也改用图片1.所示的“透明3句式简化神经计算”,那么,产生相同结果的耗时量,约可缩短到三分之一,比在Scilab中还快,而且训练后也不需神经网络工具箱。 在Matlab中未用其小波工具箱,然而用了简易的Tpwp做小波包变换,主要因为,这样,速度更快,操作数据更便捷,也有其余分类方法中的函数 WpdcTem可共用。 Matlab工具箱生成的小波包树和神经网络,都是对用户较封闭隔阂的“对象”(an object of a Matlab class, class wptree, class network),不是普通传统的数据阵列,例如,程序中的NET0,被作为变量传递,而被直接作为函数一样使用。 附注 :在 Scilab中,format语句影响函数string把数值转换为字符串,因而影响显示。Matlab中,情况则不同,用num2str等显示结果,不必需format语句。但是,做两版程序时,尽量对应地用format等所有语句,可便于比较校验。居士在前面的试验中或程序的开始部分,常用clear,无条件清理工作空间;如果涉及做图,常无条件使用关闭所有图形(figure)窗口(不必已存在)的命令;如果需要用命令窗口显示内容,常用format及clc;这些,只属个人例行习惯,不是非如此不可,也不影响计算。 新浪赛特居士SciteJushi-2014-09-15。 图片 1.在Scilab中的测试的程序与结果 图片 2.在Matlab中利用了神经网络工具箱的测试结果 图片 3.生成图片2的测试结果所用的m程序
1263 次阅读|0 个评论
[转载]关于最近邻分类中的距离的声明
热度 1 SciteJushi 2014-8-24 20:04
原载 http://blog.sina.com.cn/s/blog_729a92140102v3ro.html 刚才回顾分类程序时,注意到一点:居士在行文和程序中,为省去开方运算(对分类不需要),都把“通常的距离空间(distance space, 度量空间metric space)中的距离”的平方,直接“定义”为了“距离”做“最近邻”分类,因为距离越大其平方就越大,这对分类结果没有影响,程序和数据以及结论都不需修改,但是,这可能造成术语误解, 而且使人看图中“比值”时有不同感觉。 特此交代。 新浪赛特居士SciteJushi-2014-08-24
807 次阅读|2 个评论
[转载]在小波包域分类的几种简易方法的快速测试
SciteJushi 2014-8-20 09:19
原载 http://blog.sina.com.cn/s/blog_729a92140102v3g3.html 用计算机系统实现信号的自动分类(判决、识别),其重要意义是容易被意识到的。在某些领域,这也是一个艰难的课题,人们努力不失时机地尝试各种可能方法。这些周里,居士用在小波包变换域的以所谓最大投影能量、最大相关(内积)系数和最小距离(最近邻值)为指针的分类方法(《小波理论及其在雷达信号处理和目标识别中的应用》,北京理工大学学位论文,1997)作基础,在Tpwp之下做了一个Scilab的函数文件袋TpwpClassify.bin。下面出示部分测试例子。 试验所用的主程序,如图片1所示(这两年里,只用了一台lenovo T61,还未知这种东西在其它机器上的表现)。其中,语句format(‘v’,5)设置数据显示格式,其前面的部分,给定和修改各种输入参数,其后面的语句固定不变。 变量Data_Files, 指定一对外部文件的名字,例如,图片2.中的tem1.sce和tst1.sce。执行第一个,以获取学习模板信号集Xt,及其相应的类别代码Ts0、在小波包域的压缩描述子空间的维数Td0、归一化能量的切断阈值Thr0。Thr0的值小于1,非负,且只在Td0无效时才起作用。 执行第二个,以获取测试信号集Xu,例子tst1.sce中,允许把开始的部分较大值循环移位至序列末端;这些信号正确地所属类别的代码Us0;每个信号可能存在的最大平移St0;在加噪声前,将Xu中的信号放大的量(dB),NFSA,即测试的信噪比条件;试验的平均次数Tests。 函数WpdcECD做分类时,不控制随机数种子,对每一信噪比条件下,Xu中的每一序列,都需要生成Tests个独立噪声样本。但是,输入NFSA的值为%inf或%nan时,就不加噪声。发现Xu为复值信号矩阵时,加噪声前附加3dB的增益,而噪声的实部和虚部独立同分布( 即N(0,1))。据输入的小波包参数,决定用普通的完整的小波包分解或是直接用矩阵乘法。如果发现小包变换的信号长度小于实际的序列长度,则强行对数据序列做FFT,然后截取其幅度谱的开始部分用于小波包分解。 在测试1中,运行图片1.的程序,得结果如图片3.所示。每秒钟,完成了3000多个256点长的序列的“小包变换”和分类。图片3中连续6行的数据,分别为投影能量法的正确率(百分比,“100”表示完全正确)、相关(内积)系数法的正确率、距离法的正确率,以及分类正确时它们所用的指标参数的两个紧邻值之比(较大者作分母,为此,计算距离(平方)时,假定序列的能量都已归1化)。显示的数据矩阵的列号对应信噪比(NFSA)值的序号。 在测试2中,使用Data_Files= ,即,把上例中的信号的幅度谱数据,假设为某种类型信号的代表。允许“谱”数据移位,且其长度与小波包分解的序列长度一致。得图片4.的结果。 在测试3中,使用测试1 中的Data_Files= ,但将主程序Wpdc.sce中的语句 Wp.DecL=Wp.DecL-0; Wp.DatL=Wp.DatL/1; Tem.D=Td0; 改为 Wp.DecL=Wp.DecL-1; Wp.DatL=Wp.DatL/2; Tem.D=zeros(Td0)+8; 再运行。得图片 5.的结果。试验前已将警告信息关闭,因为从图片4.中已可知,仅有少数简单的余弦函数时,其幅度谱数据描述是最佳的,这正是所希望的。 测试3与测试1、2,不属于同类研究,未能仿真小波包变换前端数据按高斯分布随机偏移的影响。其小波包变换的输入数据中的噪声,不服从高斯分布。低信噪比时的分类性能明显恶化。但是因为幅度谱与平移无关,St0被自动忽略,所以处理的时间开销显著减小了。 新浪赛特居士SciteJushi-2014-08-20。 图片 1.测试小波包域简易分类方法的主程序Wpdc.sce 图片 2.学习模板数据集tem1.sce及检验数据集tst1.sce 图片 3.图片1中的Wpdc.sce直接使用图片2的数据的运行结果 图片 4.模板集tem1_m.sce替换tem1.sce后Wpdc.sce产生的结果 图片 5.修改Wpdc.sce的三个量后再使用图片2的数据的运行结果
1150 次阅读|0 个评论
[转载]从邵逸夫奖经MRI笼式线圈到奇异向量之乱
SciteJushi 2014-6-20 09:55
原载 http://blog.sina.com.cn/s/blog_729a92140101qbuc.html 把2013年邵逸夫奖得主Dr.Donoho的《自我介绍》,从网上,复制到中文版Office-Word 中,统计得:字数835,非中文单词834。其中5个“wavelet”(小波),3个“denois”(与降噪有关),4个“MRI”(磁共振成像),13个“l1”(与l1范数及最优化有关),2个“l2 norm”(l2范数),3个“inspir”(与启发、灵感、激励有关)。两个“optimally”都指,最佳降噪。 受此影响,回顾了一下已搜到的Dr.Donoho的一些材料。它们被摆到一起时,引起居士关于“其与居士的关系”的极大的吃惊。 可能,Dr.Donoho对于科技活动中的应用需求,比某些纯数学研究者更感兴趣、更关注;可能,科技研发,本身就相互联系,容易串味。也许,“灵感”在到达世界名校斯坦福大学之前,曾掠过居士的发稍(不幸没有击中头);也许,它像颗彗星,在陨落到那里的过程中散落的一粒粉尘,随风触到了居士的发根。这些,算是玩笑。 一 从居士的博客中,已易见与Dr.Donoho有关的小波或降噪的缠绕。《小波包域降噪的三种简易门限》(2013-07-16)表明,居士已明显开始受到了Dr.Donoho论文的影响:用降噪前后的波形序列的某种整体误差,来定量评估降噪方法。这在居士此前的经历中是“相当陌生”的做法,虽然可以说有很多对付噪声的实战经验:例如,用电感、电容或集成电路做模拟滤波,数据采集后做数字滤波,奇异值截断,磁共振数据在k空间与窗函数相乘。通常对信号有先验知识——或者说有特别的观测分析兴趣,常先可由本人目测判断,“自以为是”了就报告老板来判断,老板不以为然就再想办法,如果涉及其它用户则要他们认可了才算凑合,最终由某种整体结果或性能是否符合某要求来决断。自我感觉更良好些、或心血来潮时,也可能写个“论文”。在2013年以前的涉及降噪的文字,明显带着这种习惯的痕迹(不论是或非)。 博文《八卦图以及小波变换与高维空间的最佳坐标系》,于2011年2月19日贴出,这是居士躲过几年后,又“公开”提到了小波包。今年曾下载的那个Wavelab_1.0.1中的Scilab的sci文件的主要时间,是2011年3月3日和4日。它们的bin文件的主要时间,是2013年3月12日,这前后的一段时间里,居士已在贴出了Matlab的Shannon熵准则处理的失败以及周期化滤波系统分解单位矩阵的误差以后,集中恢复对所学过的英语的记忆。 现在看,Wavelab850的Matlab的m文件的日期(2006-1-4)和Scilab的小波工具箱的上演时间,那时,居士(即Baiyu)已极度惶惶不安,忙着查找、扫描和备份过去的资料,并为免疫细胞成像实验做备忘录,直至某日,今生第一台笔记本电脑再也不能启动时,遗憾而止。至今还未能,请教工具箱开发者(其负责人的姓,似乎是居士的同班同学的,但还未确认,无意伤任何人),数据延拓的per模式和他们特别提到了Wavelab的事情(《数据延拓的per模式在Scilab的小波工具箱中为何惨败?》,2014-01-02)。 二 《自我介绍》提到MRI和“压缩感知(Compressed Sensing)”时,涉及时间“2004年”。那时,居士已在磁共振成像第一线,晃了5年多。出于某些忧虑,已决定尽可能保护、备份过去的资料,并企望有机会重校验本人全部所写,停止发表(即使会议短文),当然,给上司的工作报告一类的东西是难免的。至这年底为止,居士写过的,与磁共振有关的程序源代码文件的字节量(包括测试和待定的内容),与Wavelab850的正式m文件(Windows-XP资源管理器搜到1108个)的总和,相近。 居士没有专职研究压缩感知的经历。但感觉,那个术语听起来不错。初步看起来,它应对了长久愿望和努力:减少数据采集量、缩短观测时间,而获得足够的磁共振图像或谱质量,例如,部分k空间重建、已知图像边界时的数据外推、非傅立叶编码、非矩形栅格采样。2013至2014年,同事企图做化学位移成像的研究时,与居士神吹胡侃过此类。 2004年前后,居士试着分析DSC-MRI数据。留下来的单个Matlab的p文件(2006年7月生成),大小与居士在博客中至今已上传的小波包变换、降噪、参数估计的Scilab的所有函数bin文件对应直译Matlab-R2011a版的p文件(它们都无需工具箱的其它函数或Wavelab850中那样的C程序,也无需“安装”)的总和,相当。程序由居士业余所作,原单位应没有备份,因为分配给居士的专职并不在数据分析。《 核磁共振成像 —— 纪念 Paul C. Lauterbur 去世四周年》 ( 2011-03-27) 中的处理 , 最早可见于 2004 年 5 月,写给项目主管的年度工作总结中 。文件大的部分原因,是其中还包括有“试试看”的内容,如某些解卷积(这是公开的“病态问题”)的方法。大量实验数据至今仍没有被处理,程序和方法有待检验、修正。从那里的图片 3.中的右图,可以看到,解卷积结果,有“小负值”部分。虽然很不满意,不想看到那点东西,但没有搞定“非负解”的求法。在“David L Donoho”(从已掌握资料看,居士在博客中提到的Donoho应该是同一个人)名下,讨论欠定线性方程组的非负解(稀疏解,Sparse Nonnegative Solution)的论文,指示其时间是2005年3月。 现搜查到,Dr.Donoho关于以l1最小化求“最佳稀疏表示(optimally sparse representation)”的技术报告,其时间为2002年12月。在这一时间稍后的简历中,居士提到了在准备的关于MRI线圈静态电流分布的数字优化设计的论文,现在查其初稿Office-Word 文件的最后编辑时间,为2002年2月28日。其中的部分内容,于2001年11月,被投给ISMRM的国际会议,而被拒,因此,印象中给单位留下的文件目录中,可能删除了这部分的Matlab程序内容。 另外,Dr.Donoho在美国科学院的PNAS上,谈“最佳特征选择(optimal feature selection)”、“最佳分类器(optimal classifier)”,已算晚了。如果再早十几年,那么居士正在折腾信号分类问题,虽然未触及现代生物医学中那样大的特征向量的问题,但可能也需要领教,。 至于“l1范数”、“l2范数”,它们就太常见了。但是,在成像中,得到的结果与被成像客体的真实状况的差异、某种范数或优化约束的现实物理含义、实验的可行性、得失的平衡等,才是关键。很多应用问题,需要类似的这些考虑。 数学上,研究方程组或优化问题的解的存在性、唯一性、算法收敛性等,是另外的问题,可能属于Dr.Donoho的事了。居士是其“消费者”,希望,背负了非常“词典(dictionary)”、费力经过那些“凸体(convex)”、“包壳(hull)”、“球(ball)”、“不相干(incoherence)”等后,避免掉入像“minimaxi”、“SURE”那样的局面。 三 《 笼式射频线圈的磁场高度均匀的静态线电流模型 》( 2012-12-06)中的图片,是重校验2002年(大概5月)的ISMRM国际会议上的海报(poster)的计算的产物。它们表明,某工程设计问题有多个解,每个都可能是“正确的、合理的或可行的”,某种意义上又是“垃圾”。怎样判别、取舍一个设计呢?可以说,那里对场均匀性的度量,实际用了误差的l1范数;电流的平方和,是解向量的l2范数的平方,可视为单位电阻上的功耗;电流的绝对值之和,是解向量的l1范数,其背后的兴趣是效率问题;它们都可作为一些预选条件。 这些以及下面的讨论,现在看来,也许只算游戏了,因为人们感兴趣的可能已是阵列线圈、射频仿真分析、并行成像等“大事”了。但是,居士曾经自以为是地喜欢,它们也非纯属娱乐,因为由此可能启发一些面对现实的简化问题的考虑。 某感兴趣区内(离散点集R)的期望的理想磁场(可多个分量)分布表示为列向量b。希望用若干线电流(列向量x)来近似产生这一目标场。矩阵A的列向量是单位(相对)强度的单个线电流产生的与b对应的场值。基本设计兴趣是:在适当工作精度的条件下,找出某个向量x,近似满足Ax=b。 用奇异值分解可得到x的近似解。加小随机扰动给R,在鸟笼线圈的导线定位时,解得的x,起伏较小;在余弦线圈的导线定位时,得到的x可表现出更剧烈的起伏,类似于傅立叶分析中的Gibbs伪影问题。 提出Litz余弦线圈(或称余弦Litz线圈),企图用余弦线圈的分析,了解Doty宣称的Litz线圈的一些优点的合理性的某些可能,但是,未确定这种解的起伏是否支持Litz线圈对构造误差的宽容。 设计时,可以浏览,以目测做主观取舍,例如,“两个”电流反向而位置接近的线圈的重叠,是不行的;可引入范数约束;可用范数、误差等项组合以定义优化的目标函数,再求解。 利用对称性,可以减少未知向量x的长度。例如,假设以圆的某直径为对称轴,对称位置上的两电流等值、反向,那么,未知量的数目可减半,然而,要的电流解,须是“非负的”。 假设,电流线分布足够密,未知向量x很长,限定近似解的绝大多数的分量应为零(实际上无需导线),即获得的解是“稀疏的”,那么,就找到了同时优化导线位置和电流强度的设计。 四 在科技研发中,极其常见,矩阵的奇异值分解。在估计信号极点、线性拟合、解卷积、设计优化等时,居士都曾试验了Matlab的奇异值分解函数的应用。 Matlab-R2011a的奇异值分解函数svd的帮助文档的最后,提出了算法可能不收敛的警告,但居士还从来没有遇见过。 另一个奇异值分解函数svds的帮助文档中,用例子证实它与svd得到的奇异值是一致的,如图片1.的右半部所示。但是,它解得的奇异向量,受到随机数发生器的影响,对随机数种子很敏感。可能宜尽量用svd避免svds。可以从计算特征值、特征向量的函数eigs的帮助文档中,了解到,初始化向量的问题。如果这被疏忽了,那么可能造成麻烦,如,影响了结果参数的顺序。强调这一问题的试验,如图片1.所示。 图中,最左下角的3个0,表明svd的4个奇异向量,始终与随机数发生器(rng)无关,完全可重复。其右边对应的结果,表明svds的4个奇异向量,不仅与svd的结果完全不同,而且可受到rng的控制和影响。 这3个0以上的3个数值,是svd给的最大的奇异值,也与rng无关。其右边对应的结果,是由svds得到的,前十几位数字都相同,只从最后一位上显示出因rng引起的极小起伏。它们与最右下角的帮助文档中的数字也一致,表明系统工作正常。 新浪赛特居士SciteJushi-2014-06-20。 图片 1. 强调随机数发生器对svds结果尤其奇异向量的影响
1304 次阅读|1 个评论
[转载]经典阈值不分软硬而依赖于尺度给降噪带来混乱
SciteJushi 2014-5-18 08:40
原载 http://blog.sina.com.cn/s/blog_729a92140101prve.html 研究降噪时,用先验知识决定是否分尺度处理,并确定“用软的”或“用硬的”,再考虑用什么“准则”计算具体的阈值。 据居士的理解和经验,一般地(均匀白噪声时),不使用Matlab的自动降噪函数wden时的全局门限处理,性能更稳定,而且整体看来最好。由rigrsure和heursure准则,得到的阈值,更宜用于软门限处理。由sqtwolog和minimaxi准则,尤其是前者,得到的阈值,不宜用于软门限处理。可以抛弃minimaxi。在wden的分尺度处理中,涉及的系数序列越短时,使用rigrsure越危险。 这些陈述,不支持经典和文献资料中的某些重要观念或应用,要证据。当然最好用它们的测试信号。 值得先强调的是:借鉴基于给定数据序列而计算的阈值,以抑制噪声,这不等同于,Dr.Donoho等逼近某类假设的连续时间函数,虽然他们常用“denoising”。 在小波工具箱2001年的用户指南(User’s Guide , Version 2.1)里的门限设置管理函数wthrmngr(第8-309页)的表格中,对于rigrsure、heursure、sqtwolog、minimaxi(方法,METHOD)的描述(Description)都是参见thselect 和wden (See … option in thselect , and see also wden)。在计算阈值的函数thselect(第8-170页) 、生成小波降噪试验信号的函数wnoise(第8-256页)的说明中,列举的参考文献都是Dr.Donoho的,都指出(See Also wden)只参见wden。 启动Matlab-R2011a后,查帮助文档(Help),可见到与上面相同的情况。所以, 人们可以相信: Matlab中函数 wden与thselect以及wnoise一起,应反映了Dr.Donoho的小波变换域 阈值降噪的思想精髓和方法关键;而且,它们已经过了,相当长时间的考验、甚至优化提高。 尤其引人注意的是,在 wden中, 可用各个尺度上的分解数据分别做为 thselect的输入,计算得相应尺度上的Donoho阈值。其中rigrsure,代表了真正的基于SURE的方法,其计算中混合使用了分解系数的序列长度和数值。 从Dr.Donoho的Wavelab850中,可找出函数文件 ValSUREThresh.m(时间为2006-1-4,2:20)。它计算自适应的SURE阈值(Adaptive Threshold Selection Using Principle of SURE),对应于Matlab中的rigrsure准则的结果。如图片1.所示,用长度随机变化(1至16384)的1000个白高斯序列的比较试验表明,函数thselect与ValSUREThresh的结果,完全相同。它们的程序,都没有设置,输入序列长度的下限!图中的红色错误信息,表明ValSUREThresh不接受列向量,然而,行向量和列向量都可以作为thselect的输入。所以thselect的编程,无损于Dr.Donoho的方法。 从 2014年的最新手册和Matlab-R2011a的帮助文档中,找出使用wden的一些例子(如 leleccum数据、 Cycle-Spinning),试运行,比较结果,例如图片1.中的曲线图。图片1.还证实,Matlab的minimaxi阈值,与Dr.Donoho的牛文所列出的值一致。可见,Matlab小波工具箱中的降噪,在居士的机器系统中发挥着应有水平。 图片2.显示了一段测验程序。四重for循环,从外到内,依次对应:可变的分解深度,由wnoise给出的6种基本测试信号,无噪信号的8种强度(标准差,对应的NFSA约为0、6、12、…、42dB),50次随机试验。 把程序中的“6”改为“4”,可更集中注意力于最为经典的4种测试信号。 每次随机测试,有3种降噪方法,处理被N(0,1)白噪声污染的同一个样本:全局门限(不用wden,“软”或“硬”由变量SH指定)方法、用wden的自动软门限方法、用wden的自动硬门限方法。降噪后的输出序列的误差范数,与输入序列的误差(白噪声)范数之比值,分别记入矩阵Eg、Es、Eh中。这3个矩阵(50次试验的均值),在三重内循环之外,被初始化、被显示。 结果的矩阵元素的行号,对应无噪信号的编号;列号,对应于信噪比条件的编号。 显示时,以“0”、“1”、“2”开始的短行,分别提示,紧随其后的6个长行显示了Eg、Es或Eh的数据。同一行中,第二个数,是整数,表示分解深度值;第三个数,是矩阵元素的均值;第四个数,是矩阵元素的标准差。 部分结果数据,示于图片3.和图片4.中。如果矩阵元素或其均值大于1,例如图中的“113”,那么“噪声”(包括偏差、畸变、失真等概念)被放大了,如113倍。数值 越趋近于 0,表示结果越好。 虽然这里的信噪比条件适中,用rigrsure的软门限处理的wden的结果,也可能出现极端病态的结果,如: 1 11 8.5312 18.454 1 9 6.0728 17.135 这里,尤其要求控制分解的深度。它实现的“最佳深度”时的结果: 1 5 0.55514 0.26878 1 3 0.60383 0.23715 与 Eg (均值0.60,标准差 0.24) 相比,也并无突出优势。 幸运的是,从结果中看到:可能直接限制分解深度,如参考Matlab的函数wmaxlev, 以减小上面看到的wden使用“太深”分解时的危险。实际上,分解深度增加一级时,输出的近似系数序列,对应的频带宽度减半,其中包含的噪声能量也就减半,清除其中噪声的意义和必要性也就越小。 Matlab的Help中wden的例子用:2048点数据,sym8滤波器,5级分解,无噪信号标准差snr=3。 修改程序中的TR和SH,可以试验其它处理方法。用 TR='heursure'; SH='s';可见: 0 11 0.60219 0.24164 1 11 0.58774 0.26848 2 11 0.6363 0.2915 0 9 0.60292 0.24068 1 9 0.58644 0.269 2 9 0.63624 0.29157 0 7 0.60594 0.23676 1 7 0.57244 0.2761 2 7 0.63589 0.29189 0 5 0.63215 0.21191 1 5 0.56888 0.27078 2 5 0.63904 0.28827 0 3 0.72583 0.14786 1 3 0.61396 0.23961 2 3 0.66725 0.25918 这里,混合入 sqtwolog机制后,避免了仅用rigrsure时的极端病态的结果,性能变得更稳健,但没有超越用rigrsure时最好的结果。 在图片2.所示的程序段中,改用 TR='sqtwolog';SH='h';可见: 0 11 0.66018 0.40892 1 11 1.4075 1.0126 2 11 0.66018 0.40892 0 9 0.66034 0.40884 1 9 1.3967 1.0178 2 9 0.65897 0.4096 0 7 0.65853 0.41068 1 7 1.3562 1.0398 2 7 0.65473 0.41174 0 5 0.67362 0.40345 1 5 1.2825 1.0668 2 5 0.65038 0.41363 0 3 0.7777 0.36191 1 3 1.1977 1.0504 2 3 0.68593 0.38283 在图片2.所示的程序段中,改用 TR='minimaxi';SH='h';可见: 0 11 0.63674 0.25361 1 11 0.9729 0.66349 2 11 0.63674 0.25361 0 9 0.63674 0.25364 1 9 0.96689 0.66641 2 9 0.63646 0.25369 0 7 0.63648 0.25415 1 7 0.94515 0.67813 2 7 0.63566 0.25397 0 5 0.64351 0.25273 1 5 0.90953 0.69041 2 5 0.63898 0.25399 0 3 0.70178 0.22701 1 3 0.89532 0.66207 2 3 0.67761 0.23435 由于,使用了强度已知的白噪声,所以,程序中设置SC=‘one’。然而,据文献,在wden中可用SC=‘sln’或SC=‘mln’。例如,图片1.中,以wnoise的bumps信号为例,演示Cycle-Spinning降噪方法,这来至于Matlab的2014年的最新用户手册。在处理leleccum数据( load leleccum)的例子中,函数wden的输入使用了'sqtwolog','s'(软门限),'mln' 。在条件定界不清时,这些复杂化可能雪上加霜,使降噪结果更荒诞。 在图片2.所示的程序段中,改用 SC = 'sln'; TR = 'rigrsure';可见: 1 11 12.859 25.015 2 11 10.307 20.462 1 9 10.737 24.352 2 9 7.7532 19.692 1 7 5.2982 18.725 2 7 5.216 18.412 1 5 5.2062 18.689 2 5 5.205 18.387 1 3 5.1393 18.236 2 3 5.1794 18.204 在图片2.所示的程序段中,改用 SC = 'sln'; TR = 'heursure';可见: 1 11 5.6033 19.936 2 11 5.4145 19.347 1 9 5.5966 19.916 2 9 5.4121 19.338 1 7 5.565 19.855 2 7 5.409 19.327 1 5 5.4836 19.557 2 5 5.399 19.272 1 3 5.197 18.26 2 3 5.1762 18.264 在图片2.所示的程序段中,改用 SC = 'sln'; TR = 'sqtwolog';可见: 1 11 6.653 20.345 2 11 5.6895 19.848 1 9 6.6209 20.268 2 9 5.667 19.764 1 7 6.5352 20.109 2 7 5.648 19.713 1 5 6.3257 19.608 2 5 5.5689 19.429 1 3 5.8731 18.203 2 3 5.2991 18.241 如果,矩阵元素的均值偏小时,而标准差更大,那么,其中一定有部分“更好(最好)”的结果。但是,如果它们的范围狭窄,要求“用户确知的内容”太多甚至复杂敏感,那么方法未必可取。 不管怎样,Matlab工具箱的函数wden作为一个工具软件,可以设计各种选项,这并不是问题。 新浪赛特居士SciteJushi-2014-05-18。 图片 1. 经典与Wavelab850以及Matlab的阈值相同 图片 2. 测试wden用依赖于尺度的阈值以降噪的方法的程序段 图片 3. 图片2的测试程序显示结果的开始部分 图片 4. 图片2的测试程序显示结果中rigrsure的最好部分
1678 次阅读|0 个评论
[转载]快速小波变换算法为何坚持把卷积下抽样当两回事?
SciteJushi 2014-4-22 09:13
原载 http://blog.sina.com.cn/s/blog_729a92140101pctf.html 博文《国际标准中和美国联邦调查局用啥小波滤波器组--维基百科添乱?》(2013-12-12),把Tpwp列为某种代表。居士已做努力,试把Dr.Donoho(本博客用Dr.,因中国人不习惯称呼“博士”)的小波变换归入“Tpwp类”,但是未成功。本短文,可显示努力之一斑。 普通离散小波变换的阈值降噪方法、以及基于所谓的SURE的阈值,是Dr.Donoho的标志,这从前面的博文中可以反复看到。对于Matlab和Scilab的小波工具箱中与此有关的状况,Dr.Donoho作为世界名校中在其研究领域里的世界名人,似乎不可能长期不知晓。 以前提到的那个Scilab的小波工具箱的文件目录中,有个文本文件TODO.txt(时间为2007-9-2),计划把Wavelab850的代码吸收到工具箱中(“Integrate WaveLab850 Code”)。这表明了Wavelab850的影响。 于4月1日,又从网上,发现并下载了一个Scilab程序包Wavelab_1.0.1-1.bin.windows.zip,很多内容是做小波变换的。 从源代码文件中,可常见注释: “ // Part of Wavelab Version 850 // Built Tue Jan 3 13:20:40 EST 2006 // This is Copyrighted Material // For Copying permissions see COPYING.m // Comments? e-mail wavelab@stat.stanford.edu ” 以及作者( Authors): H. Nahrstaedt和David L. Donoho。前一个名字,看起来,是在Scilab的小波工具箱的“Help”中,常见的“ Holger Nahrstaedt”。 这 样著名的 Wavelab850,可视为Dr.Donoho的直接成果。 直接找到了 Wavelab850的网页,如图片1.所示,下载了其Matlab版本。其中的文件的时间,主要为2006年。如Dr.Donoho的论文中的数学的繁锁一样,这个程序似乎也让人望而却步。目录“Packets/One-D”,只是那个zip文件中的极小部分,看起来主要是1D小波包(以及 Cosine- Packet和用户接口类的东西 )处理的源代码,但与Tpwp相比就已很大了,也不如Matlab工具箱清晰明朗,而且居士还不知它与那么多C语言程序(Scilab的小波工具箱也带有类似的成分)的必须联系。 假设Matlab等本身已很好地吸收了Dr.Donoho的重要成果,这应该是合理的,那么居士就并不必非要更多地了解这个原版的Wavelab850。 从文件中可以看到“先卷积”、“再隔2下抽样”的变换算法。Matlab工具箱的离散小波分解函数wavedec用dwt。Matlab-R2011a做单级分解的函数文件dwt.m中,也明显有“先延拓”和最后“隔2下抽样”的运算语句( a或d = z( first:2:last) )。 最新的 Matlab的《R2014a用户指南》(Wavelet Toolbox User’s Guide), 在 3-56页、3-57页和3-58页,仍明确解释和强调了“Mallat的基于无穷时间的多分辨分析”和这种“快速算法”(Fast Wavelet Transform (FWT) Algorithm)。 对“隔2下抽样”时要抛去的一半数据,为何必需先给它们存储空间、甚至还将它们算出来呢?在“离散卷积”运算的“移位”时,“移位步长”直接取“2”而非“1”,这会是更慢的算法或是错误的吗? 图片1.的顶端的蓝条中,有“Wavelab802”,可能是历史遗迹。 记得以前已下载过一个做小波变换的“ Wavelab”。这会儿,没找到可能存储的备份。那时,只为了搜查、校验小波和滤波器系数,没注意其作者。近期注意这个软件,是因为:从Matlab工具箱,注意到了Dr.Donoho的降噪的论文,其早期就已提到了小波变换矩阵。 如图片2.所示, Dr.Donoho在其被引用次数极为惊人地多的论文“Ideal spatial adaptation by wavelet shrinkage”(Biometrika (1994)81(3):425)的引言(Introduction)中,简单地提到了正交变换矩阵(“one may construct an n x n orthogonal matrix W, the finite wavelet transform matrix.”),并用矩阵乘法符号表示了小波正变换和逆变换。有的技术报告,还提到了直流分量(“the constant function”)。 但是,居士没有找到更多材料,以说明Dr.Donoho在有限维矢量空间的多分辨分析以及小波包分割与覆盖方面的研发程度。其实际运算似乎也未用基向量和矩阵乘法(“A crucial detail: the transform is implemented not by matrix multiplication, but by a sequence of special finite-length filtering steps which result in an order O(N) transform.”)。 图片2.中,在最后一个公式行,Dr.Donoho用母小波(“called the mother wavelet”)近似表达(“we have the approximation”)矩阵的行向量(row,“call the Wjk wavelets”)Wjk。这缺少细节,没有“近似的程度”,但引人注意,因为,在居士的理解中,这种表达和观念,是错误的。反过来,假设它对了,但居士未能领悟。问题的要害,不在于数据长度和尺度值的大小,不在于小波函数与数据边界的距离,而在于与尺度函数有关的采样。这里,也反映了Dr.Donoho的“小波变换矩阵”与居士所述的基向量和变换,其路线并不相同,即使它们的数据结果都可能在共轭滤波器系统的意义上相互联通、都可能用“塔式”演算结构。Dr.Donoho的论文,粘在连续时间函数以及区间 的二进离散网格,实际上也显明了其倾向和特征。 新浪赛特居士SciteJushi-2014-04-22。 图片 1.Wavelab850下载页面 图片 2.Dr.Donoho的离散小波变换矩阵(Biometrika 81(3):425,1994)
1538 次阅读|0 个评论
[转载]随机设置小波包变换及其优选基的随机降秩矩阵
SciteJushi 2014-3-19 15:32
原载 http://blog.sina.com.cn/s/blog_729a92140101orw2.html 附件 PwpRandPsbm.zip 本短文作为《生成小波(包)基向量时的多重选择中和教科书的呆板》(2013-11-17)的后续部分。 在文献中,“小波(包)基向量”极罕见,而小波(包)“函数”、“原子” 却几乎“千篇一律”式地涌现。Matlab-R2013b(居士还未能有这新版软件)的官方网站上的文档“小波包分析(Wavelet Packet Analysis)”中,相当大的部分仍谈小波包函数、它们的过零数、它们的振荡特性等,而避免了“小波(包)基向量”。 然而,现实的离散变换的应用,如用户数据用Matlab工具箱的计算,与那些连续时间函数的关系,却是含糊的、或勉强的、或被忽略。在关键环节“离散化采样”的问题,得到理解、解决之前,连续时间基函数,显得遥远甚至可能失真。那么,先看看“基向量”如何?各向量的FFT幅度谱呢? 小波包处理涉及的函数子程序集TpwpSubs.bin (约128KB)与TpwpSubs_E01.bin(约36KB),共约164KB,其中包括了约62KB的降噪子程序。前者已被上传多次。这里用的主程序PwpRandPsbm.sce附于文末,并与后者TpwpSubs_E01.bin一起,以附件文件PwpRandPsbm.zip上传到科学网。 主程序中, =TpwpDec(……)是实现全树完整小包分解的语句,其前面的部分设置了滤波器和变换条件等,与以前的 PwpRandRec.sce中对应的部分基本相同,主要调整是:被分解向量不再是实值随机序列,而是复值的;向量(序列)长度不再固定为256,而是128乘以一个奇数,相应地可做7级分解,这个奇数从1、3、5或7中随机抽取。 根据 TpwpDec的输出,用Shannon熵准则,选择最佳基。因为被分解的向量是随机的,所以某一“正交基”是否能被选中,这也是可变化的。如果,发现原始数据序列为最佳“系数”,那么,强行改变选择,即,使用普通离散小波变换基(《普通离散小波变换是小波包变换树中的一部分___续》, 2013-11-10)。 对于这一“最佳基上的分解系数”序列,做门限处理。门限值为,系数序列的模的最大值乘以一个随机数。这个随机数,在0.25至0.75之间。被保留的系数在小波包树上的位置的向量,是子程序 PsbMatrix的第一个输入变量;这一子程序,从小波包树上抽取相应的基向量,作为其输出的变换矩阵的行向量。 因为门限值是随机的,所以这个降秩变换矩阵的行数,也是随机的。门限值越小,行数就越多,矩阵就越趋于方阵,获取这些行向量所需的计算时间一般就更长。列数,等于被分解序列的长度。 测试 98组滤波器数据的“随机设置小波包变换及其优选基的随机降秩矩阵”的结果,如图片1.所示。图片包含两幅曲线图。每幅图,包含10条随机实验的曲线。由于每组滤波器的试验是独立地随机的,所以这相当于总共做了980次随机测试。重复运行程序时,随机数种子变化了,就意味着做了更多试验。 复高斯序列xo0,经 TpwpDec做 普通全树分解 (dec0)中的数据,以及直接用降秩正变换矩阵tM0与之相乘得的数据,它们之间的误差(范数比),示于第一幅曲线图。误差极小,受机器精度的制约。 直接用降秩逆变换矩阵,乘以复高斯序列xo2,可得到小波包合成信号xr2;再用降秩正变换矩阵乘以xr2,可得分解数据xd2。序列xd2与xo2的误差,示于第二幅曲线图。 类似于第二幅曲线图的结果,在以前的博文中已反复出现,反应了滤波器系数本身的精度质量。 居士已将子程序集,从Scliab语言“直译”为Matlab语言。对本文的测试程序以及以前发布的主要的降噪程序和测试程序,也都完成了“直译”。未发现运行错误。 从文件属性查看,生成的Scilab的bin文件,比Matlab的p文件,大得多。所以Matlab版的程序集可更小得多。 从tic-toc计时(未检验其精度)看,在Matlab中的速度更快。本文的处理,在Matlab-R2011a中,计时约为600秒; 在Scilab中,计时约为1000秒。 附程序PwpRandPsbm.sce : // PwpRandPsbm.sce // for the concept: wavelet packet basis vector // test the random settings of wavelet packet vectors // and random(best) PreSet Basis // and Matrix of randomly-limited-subset of the best vectors // clear; rand('seed',1e9); exec('PwpRandPsbm.sce'); // run with fixed seed // clear; exec('PwpRandPsbm.sce'); // repeat with variable seed // TpwpSubs.bin, TpwpSubs_E01.bin, MatOrtWlts.bin are // in Scilab current directory // reference: PwpRandRec.sce, uploaded, 2013-11-17 // last revised,in Scilab-5.3.3,Baiyu Tang( tang.baiyu@gmail.com),2014-Mar xdel(winsid()); // kill all figures mode(0); ieee(1); // clear; // rand('seed',1e9); date1=getdate(); date1=date1( ); disp( ); tic(); load('TpwpSubs.bin'); // load function subroutines load('TpwpSubs_E01.bin'); // extended set of subroutines for PreSet Basis load('MatOrtWlts.bin'); // load the filter cases Wp.DecL=7; // maximal decomposition level TestEr1=zeros(98,10); // error matrix_1 TestEr2=zeros(98,10); // error matrix_2 // ---compute for ii=1:98; // filter case index. 98 filter cases for jj=1:10; // random test index. 10 tests per filter-case // ---random length of test signal Wp.DatL=(1+2*round(3*rand(1,1,'uniform')))*2^Wp.DecL; // ---random settings Set0=rand(1,9,'normal')*1e6; Wp.RightShift=Set0(1); Wp.ExchangeR_D=Set0(2); Wp.FlipFirst=Set0(3); Wp.MatchFilter=Set0(4); Wp.LowT_zero=fix(Set0(5)); // integer Wp.HighT_shift=fix(Set0(6)); // integer Wp.FlipTime=Set0(7); Wp.PeriodFirst=Set0(8); Wp.AlterL4fSign=Set0(9); // ---get filters if Wp.ExchangeR_D0 then =WltFilters(ii); else =WltFilters(ii); end if length(hcoef(:))2 then if length(rhcoef(:))1 then hcoef=rhcoef; rhcoef= =TpwpAllGH(hcoef,rhcoef,Wp.DatL,Wp.DecL,... Wp.MatchFilter,Wp.PeriodFirst,Wp.LowT_zero,Wp.HighT_shift,Wp.FlipTime); if Wp.AlterL4fSign0 then // forced sign. usually not used hlen=max(round(length(hcoef)/2),round(length(rhcoef)/2))/2; if fix(hlen)==hlen then pgcoef=-pgcoef; rpgcoef=-rpgcoef; end end // ---decomposition_1 xo0=complex(rand(1,Wp.DatL,'normal'),rand(1,Wp.DatL,'normal')); // test signal xo0=xo0/norm(xo0(:)); // random complex signal, normalized =TpwpDec(xo0,Wp.DecL,phcoef,pgcoef,Wp.RightShift); // decomposition // ---basis selection =TpwpCost(abs(dec0),1, ); // cost, Shannon entropy =TpwpBest(c0,Wp.DecL); // best basis if sf(1)0 then // too short to make sense =TpwpWavelet(Wp.DecL); // then, common wavelet basis end =TpwpCoeIndx(sf,Wp.DecL,Wp.DatL); // coefficient index // ---random thresholding xo1=dec0(Indx0); // coefficients xo1=abs(xo1); th=(1+2*rand(1,1,'uniform'))*max(xo1)/4; // random threshold, 1/4 - 3/4 Indx0=Indx0(xo1=th); // selection, thresholding // ---thresholding randomly selected low-rank transform matrix; =PsbMatrix(Indx0,Wp.DecL,Wp.DatL,phcoef,pgcoef,Wp.RightShift); =PsbMatrix(Indx0,Wp.DecL,Wp.DatL,rphcoef,rpgcoef,Wp.RightShift); // ---test decomposition_1 minus decomposition_2 xo2=dec0(Indx0); // decomposition_1, from normal full tree xd2=tM0*xo0(:); // decomposition_2, matrix multiplication TestEr1(ii,jj)=norm(xo2(:)-xd2(:))/norm(xo2); // their error // ---test the fast synthesis-decomposition R0=length(Indx0); // rank signal length xo2=complex(rand(R0,1,'normal'),rand(R0,1,'normal'));// random complex signal if isempty(tM1) then xr2=tM0'*xo2; // orthogonal synthesis else xr2=tM1'*xo2; // biorthogonal synthesis end xd2=tM0*xr2; // decomposition-2 TestEr2(ii,jj)=norm(xo2-xd2)/norm(xo2); // error, norm // TestEr2(ii,jj)=R0/Wp.DatL; end end // ---display subplot(2,1,1); plot2d('nl',TestEr1+%eps,rect= ); set(gca(),'tight_limits','on'); set(gca(),'box','on'); set(gca(),'grid', ); title('PwpRandPsbm.sce: Test Random Settings and Limited Transform Matrix'); xlabel('Filters: sym1-sym35,coif1-coif5,dmey,db4-db42,18 biorthogonal cases'); ylabel('Dec_1 - Dec_2 Error'); AuLabel1= ; xstring(1,2.1e-16,AuLabel1); Note1= ; xstring(1,2.5e-15,Note1); subplot(2,1,2); plot2d('nl',TestEr2); set(gca(),'tight_limits','on'); set(gca(),'box','on'); set(gca(),'grid', ); title('PwpRandPsbm.sce: Test Random Settings and Limited Transform Matrix'); xlabel('Filters: sym1-sym35,coif1-coif5,dmey,db4-db42,18 biorthogonal cases'); ylabel('Fast Synthesis__Decomposition Error'); xstring(1,min(TestEr2),AuLabel1); Note1= ; xstring(1,5e-6,Note1); // ---timing Time_In_second=toc(), // !Date and Time: 2014 3 18 15 56 26 ...... ! // Time_In_second = // 1003.984 新浪赛特居士SciteJushi-2014-03-19。 图片 1. 随机设置小波包变换及其优选基的随机降秩矩阵——测试结果
1172 次阅读|0 个评论
[转载]预置小波包基及其矩阵表示可显著提高降噪实验
SciteJushi 2014-3-16 11:02
原载 http://blog.sina.com.cn/s/blog_729a92140101opnz.html 用FFT和普通离散小波变换降噪时,分解信号的基底都是已知的、不变的。然而,此前所述的小波包降噪方法和程序中,最佳基是由各个含噪声的数据向量完全独立地确定的,这比基于FFT和普通离散小波变换的降噪,使用了少得多的先决条件约束:假定无噪信号是未知的、描述信号的最佳基底也是未知的。 小波包降噪,也可以根据先验知识,预定好“最佳”基,例如限制使用普通离散小波变换。处理含有噪声的数据时,再无需最佳基搜索过程,甚至无需计算出完整的小包分解树上的数据。为此,居士又做了基于Tpwp的几片小程序,存在TpwpSubs_E01.bin中,作为TpwpSubs.bin的扩充,稍后将其与某个测试程序一同上传到科学网。 此前的小波包降噪程序中,语句 =TcyspDenois(xn0,Wp,DenMode1); 是做降噪的语句。其中 cysp, 指 Cycle-Spinning移位。矩阵 xpwpd0,是降噪结果。 向量 DenMode1,指定门限处理模式;结构变量Wp,包含了小包处理的设置;向量xn0,是噪声污染后的信号。可以被替换为 =PsbmCyspDen(xn0,Wp,DenMode1,sbm0,sbm1); 这要求两个附加输入 sbm0和sbm1,是先验小波包基向量组的矩阵表示。正交时sbm1= =PsbSelect(RawX00,Wp); =PsbMatrix(CoeIndx,Wp.DecL,Wp.DatL,hc0,gc0,Wp.RightShift); =PsbMatrix(CoeIndx,Wp.DecL,Wp.DatL,hc1,gc1,Wp.RightShift); 即可生成先验基矩阵 sbm0和sbm1。 先验基向量的序号,由 PsbSelect处理无噪数据RawX00时,所得的最佳小包基系数确定。 此前的程序的load( ‘TpwpSubs.bin’ );后附加一句 load( ‘TpwpSubs_E01.bin’ ); 以装载上述处理所需的子程序。 图片1.是用《小波包域降噪和移位平均处理后的参数估计误差》(2014-01-16)的程序做上述调整后所得的结果。那里的实验,用时约900秒;而这里的整个实验(包括准备基矩阵),约需38秒! 至此,仍然没有利用先验基上系数的分布知识,不抽取子矩阵块作为PsbmCyspDen的输入。不同移位的信号的小波包系数分布是变化的。可以说,这比已知通频带和阻带的滤波以及在不同尺度上做不同处理的离散小波变换降噪,使用的先验约束条件,仍更弱。 显然,不排除更充分地利用先验知识。例如,在“阻带内”的节点上增高门限值,或者使某些基向量预先乘以权系数甚至干脆不出现在降秩变换矩阵中。 数据向量太长时,基矩阵和所需存储空间都可能太大,那么,可以放弃基矩阵而用约束小波包分解(子程序PsbsDec),删除上面的PsbMatrix语句,并用 =PsbCyspDen(xn0,Wp,DenMode1,CoeIndx,hc0,gc0,hc1,gc1); (未在上传程序包中)代替PsbmCyspDen一句。虽然,这可以自动识别并限制于所必须的节点分解,但是一般说来,比 TcyspDenois用完整分解树时所节省的时间 ,量较小。例如,即使直接指定小波基,分解也需要覆盖过半树;如果约束中包含了最大分解尺度上的全部节点,那么实际上分解仍需要覆盖全树。 命名“ PsbsDec”的Psb后的s,强调它不同于 PsbMatrix和小波包常规合成重建处理中的约束,它的输入可以包括任意多个基底的节点,不检测约束节点相互冲突的问题,然而后二者却要求约束节点属于“同一基底”。 新浪赛特居士SciteJushi-2014-03-16。 图片 1.用预置最佳基矩阵快速降噪(16步移位平均)
1046 次阅读|0 个评论
[转载]比较三个程序中的Donoho阈值
SciteJushi 2014-1-8 15:22
原载 http://blog.sina.com.cn/s/blog_729a92140101nphm.html 从Scilab的那个小波工具箱swt的网页上列举的更新换代的历史,可知:其0.1.9版,就有了离散小波变换降噪的函数;0.1.15版,称搞定了wentropy和所用的计算门限值(阈值)的thselect中的bug。那个wentropy已经被讨论过了,这里再看看thselect。 从互联网上查到了Matlab和Scilab的小波工具箱的一些早期资料。发现Matlab的工具箱比Scilab的,约早10年。介绍Scilab工具箱的2006年的幻灯片中,没有per模式。从Matlab的用户指南(User’s Guide)可知,per模式并没有被正式列入早期dwtmode的设置中、也不被图形用户接口(GUI)支持。直至R2011a版,per模式已还被排斥在“正式的”表格之外。实际上,用户指南指出,周期化变换明显一般是决不合理的:“This method supposes that signals or images are periodic. It is clear that in general it is far from a reasonable assumption.” 早期的小波工具箱及其中的降噪结果,可能还难与居士的处理相连通,然而居士未意识到这一问题便已离开了小波研究。 工具箱里的函数thselect、wthresh(门限处理)、wden(用离散小波变换自动降噪)等,以及Donoho降噪阈值与那些试验信号,从开始就已有了。通过GUI,可以做降噪。它们有了很长的历史,应该已被很多人使用过。无论如何,借用其中的阈值,未必评述某阈值及其思想基础,也并无大碍。 在居士上载的程序包中,如果把Donoho阈值(《普通离散小波变换的局限以及小波包域能量分裂降噪法》,2013-09-29) 计算错了,那么就可能有损Donoho。Matlab和Scilab是科学计算的超级大腕,如果“对不住”Dr. Donoho,那么,他也许很快就知道了;但是,在某偏僻角落里的赛特居士SciteJushi,无人监督,就只有自觉地尽量多做检查了。 如图片所示,比较结果中,未发现谬误。所用的测试信号组x5,与《小波包基的选择中的常用代价函数与数据规范化》(2013-12-22)中的相同。与那里的图片比较,这里的Scilab窗的菜单栏,多了Toolboxes,其中包含swt。 使用由x5生成的5个复数序列x。从图片左下角的20个数据可知,Matlab的小波工具箱与Scilab的小波工具箱都有的thselect,计算出的rigrsure和heursure门限值,都是一致的。如果heursure与rigrsure的值不同,那么就必等于由序列长度完全确定的sqtwolog的值。 在程序包TpwpSubs.bin中,没有对应的thselect、wthresh和wden等。但是,有函数TbestThres可计算那两个阈值以用于全局软门限处理,其有三个输入:数据序列、噪声标准差、准则名称;有两个输出:加权因子序列、阈值。原数据与加权因子序列,相乘,即可以得到相当于wthresh的软门限处理的结果。在Scilab命令窗中,最后显示:阈值完全一致(th = 0),门限处理的结果之间的相对误差(范数)极小(er = 3.122e-16)。 两个软件窗口,朴素、端庄,内凝了人类智慧,蕴藏着强大力量。但愿居士放的丁点字符簇,无损它们的形象与英名。万能的天理大道呵,接纳人的感恩、谦卑与敬畏,宽恕蒙昧、误解和过失,怜悯生命之微渺艰辛而不吝更多启示!人类社会,岂是生物学意义上的代代重复? 图片 新浪赛特居士SciteJushi-2014-01-08。
1311 次阅读|0 个评论
[转载]普通离散小波变换是小波包变换树中的一部分——续
SciteJushi 2013-11-10 18:27
原载 http://blog.sina.com.cn/s/blog_729a92140101mq4w.html 附件 temp2bio_All.zip 博文《普通离散小波变换是小波包变换树中的一部分》(2013-11-03)表明:Matlab-R2011a的普通正交离散小波变换,是使用TpwpSubs.bin的适当设置的小波包变换(PWP)树中的一部分。这里,进一步给出一种设置,使双正交变换也具备那样的兼容性。 试验程序temp2bio.sce和temp2bio.m贴于本文末。所有程序、函数和数据文件,上载于科学网的附件temp2bio_All.zip中。 程序temp2bio.sce,是过去检验正交变换的temp2y.sce的扩展。双正交变换包括了Haar小波的情形,其中一个滤波器的向量是空的,也就是正交变换的一个例子。程序temp2bio.sce,已可以混合处理正交、双正交的变换,只要把滤波器数据在函数WltFilters中的编号适当列入WavNum即可。 程序中用// temp2y.sce标注了3个语句的替换,分别可以装载正交变换数据、列举正交滤波器组的编号、设置曲线图的标题,产生出与temp2y.sce相同的结果。 在Matlab-R2011a中,有15组双正交滤波器(Biorthogonal Spline Filters),'bior1.1'、 'bior1.3'、 'bior1.5'、 'bior2.2'、 'bior2.4'、 'bior2.6'、 'bior2.8'、 'bior3.1'、 'bior3.3'、 'bior3.5'、 'bior3.7'、 'bior3.9' 、'bior4.4'、 'bior5.5'、'bior6.8'。它们存于,文件MatOrtWlts.bin中的Scilab函数WltFilters里的编号分别为: 1、84、85、95、81、86、87、88、89、90、91、92、96、97、98。未定标的数据,分别可见于,博文《周期化约100个小波滤波器组以分解单位矩阵的误差》 (2012-10-13)中的case 19、case 4、case 5、case 15、case 1、case 6、case 7、case 8、case 9、case 10、case 11、case 12、case 16、case 17、case 18。 Matlab中的15组Reverse Biorthogonal Spline Filters,在WltFilters里的编号同上。只不过,交换使用了分解滤波器和合成滤波器。这里,WavNum中,在编号前强加一个负号“-”来识别。 文件MatWaveWp1.txt,包含了30组256点随机序列的试验数据,对应于正交变换时的MatWaveWp.txt,由对应于temp2y.m的文件temp2bio.m生成 。 从小波包分解(正变换)函数TpwpDec的输出数据矩阵中,抽取对应于普通小波分解的部分,并计算它与xw1的误差序列的范数,得结果如本文后的图片中的圆圈所示。 抛弃xt1中的零值后,用余下的非零值作为小波包合成(逆变换)函数TpwpSynt的输入,并计算TpwpSynt的输出与xr1的误差序列的范数,得结果如图片中的红线所示。 图片中的蓝线,与 temp2bio.m生成的曲线相同。相比较而言,Matlab的wp2wtree与其自己的wavedec间的误差,反而更大得多,但是,也已非常非常小。 程序temp2bio.sce: // compare TpwpDec with Matlab-R2011a wavedec. // compare TpwpSynt with Matlab-R2011a waverec. // use the biorthogonal and reverse biorthogonal filters of Matlab // include orthogonal case: Haar wavelet // in Scilab-5.3.3, Baiyu Tang ( tang.baiyu@gmail.com ), 2013-Nov. clear; xdel(winsid()); // kill all figures mode(0); ieee(1); clc; tic(); load('TpwpSubs.bin'); // load all function subroutines load('MatOrtWlts.bin'); // load the filter cases MatDat0=fscanfMat('MatWaveWp1.txt'); // read data file from Matlab // MatDat0=fscanfMat('MatWaveWp.txt'); // temp2y.sce ! Wp.RightShift=1; Wp.DecL=8; // decomposition depth Wp.DatL=2^Wp.DecL; // signal length // ---prepare data array WavNum= ;// list,tested filter No. WavNum= ; // forced sign '-', indicate 'reverse' // WavNum= ; // temp2y.sce ! TestEr1=zeros(length(WavNum),3); // error matrix ind0= ; // signal index for ii=1:length(WavNum); xo0=MatDat0(ind0,1); // raw 'signal' xp1=MatDat0(ind0,2); // output of Matlab wp2wtree xw1=MatDat0(ind0,3); // output of Matlab wavedec TestEr1(ii,1)=norm(xp1(:)-xw1(:)); // wp2wtree-wavedec error norm xt1=MatDat0(ind0,4); // input of Matlab waverec xr1=MatDat0(ind0,5); // output of Matlab waverec ind0=ind0+length(ind0); // next signal index if WavNum(ii)0 then // get reverse filters =WltFilters(-WavNum(ii)); else // get raw filter data =WltFilters(WavNum(ii)); end if length(hcoef(:))2 then if length(rhcoef(:))1 then hcoef=rhcoef; rhcoef= =TpwpAllGH(hcoef,rhcoef,Wp.DatL,Wp.DecL,-1,1,0,0,-1); // make base vectors. settings: -1,1,0,0,-1. hlen=max(round(length(hcoef)/2),round(length(rhcoef)/2))/2; if fix(hlen)==hlen // forced sign, for Matlab data pgcoef=-pgcoef; rpgcoef=-rpgcoef; end =TpwpDec(xo0,Wp.DecL,phcoef,pgcoef,Wp.RightShift); // decompose =TpwpWavelet(Wp.DecL); // get ordinary wavelet blocks =TpwpCoeIndx(synflag,Wp.DecL,Wp.DatL); // coefficient address in tree CoeIndx=gsort(CoeIndx,'g','i'); // forced order for Matlab data xp1=dec0(CoeIndx); // the wavelet coefficients TestEr1(ii,2)=norm(xp1(:)-xw1(:)); // compare with Matlab-R2011a wavedec CoeIndx(xt1==0)= ; if isempty(rphcoef) then =TpwpSynt(CoeIndx,xt1,Wp.DecL,Wp.DatL,phcoef,pgcoef,Wp.RightShift); // reconstruct. orthogonal: analysis, synthesis, use the same base else =TpwpSynt(CoeIndx,xt1,Wp.DecL,Wp.DatL,rphcoef,rpgcoef,Wp.RightShift); // biorthogonal: analysis,synthesis, use the dual vectors end TestEr1(ii,3)=norm(xp1(:)-xr1(:)); // compare with Matlab-R2011a waverec end // ---display plot2d('nl', ,TestEr1+%eps, ); legend('wp2wtree - wavedec','TpwpDec - wavedec','TpwpSynt - waverec',2,%f); set(gca(),'tight_limits','on'); set(gca(),'box','on'); set(gca(),'grid', ); xtitle('Compare PWP with the wavedec and waverec of Matlab',... 'Matlab Filters: 15 biorthogonal and 15 reverse biorthogonal cases',... ); // xtitle('Compare PWP with the wavedec and waverec of Matlab',... // 'Matlab Filters: sym1-sym35, coif1-coif5, dmey, db4-db42',... // ); // temp2y.sce ! AuLabel1=char('塞特居士blog.sina.com.cn/scitejushi',... 'Scite Jushi 2013-Nov in Scilab-5.3.3'); xstring(1,min(TestEr1+%eps),AuLabel1) Total_Error=sum(TestEr1,'r'), Time_In_second=toc(), // Total_Error = // 10^(-12) * // 19.923036 0.0076162 0.0038172 // Time_In_second = // 2.032 程序temp2bio.m: % test Matlab-Toolbox: difference of wp2wtree and wavedec % use the biorthogonal and reverse biorthogonal filters. % in Matlab-R2011a. 2013-Nov. % ---clean work space close all force; % kill all figures clear; clc; tic; % start timer % ---prepare biof1={'bior1.1', 'bior1.3', 'bior1.5',... 'bior2.2', 'bior2.4', 'bior2.6', 'bior2.8',... 'bior3.1', 'bior3.3', 'bior3.5', 'bior3.7','bior3.9',... 'bior4.4', 'bior5.5', 'bior6.8',... 'rbio1.1', 'rbio1.3', 'rbio1.5',... 'rbio2.2', 'rbio2.4', 'rbio2.6', 'rbio2.8',... 'rbio3.1', 'rbio3.3', 'rbio3.5', 'rbio3.7','rbio3.9',... 'rbio4.4', 'rbio5.5', 'rbio6.8'}; % list,tested wavelet filters ind0=1:256; % index, time of signal dat0=zeros(length(biof1)*length(ind0),5); TestEr1=zeros(length(biof1),1); % error: zero dl0=8; % decomposition depth dwtmode('per'); % set transform mode rng(0,'twister'); % set random number seed % ---compute for j1=1:length(biof1), FilterNam1=biof1{j1}; xo0=randn(1,256); xo0=xo0/norm(xo0(:)); % test data, normalized wpt1=wpdec(xo0,dl0,FilterNam1); % wavelet packet decomposition (WP) xp1=read(wp2wtree(wpt1),'data'); % its wavelet decomposition part =read(wpt1,'wfilters'); % get the same filters =wavedec(xo0,dl0,dlp,dhp); % ordinary wavelet decomposition TestEr1(j1)=norm(sort(abs(xp1(:)))-sort(abs(xw1(:)))); % error norm dat0(ind0,1)=xo0(:); % save forward transform data dat0(ind0,2)=xp1(:); dat0(ind0,3)=xw1(:); xt1=xo0; xo0=abs(xo0); thr=max(xo0(:))*0.5; % threshold value xt1( xo0 thr )=0; % thresholding xt1=xt1/norm(xt1(:)); % normalized xr1=waverec(xt1,xl1,rlp,rhp); % waverec, inverse transform dat0(ind0,4)=xt1(:); % save inverse transform data dat0(ind0,5)=xr1(:); ind0=ind0+length(ind0); % next signal position end % ---save data into ascii file dlmwrite('MatWaveWp1.txt',dat0,'precision',' % 22.17f','newline','pc'); % ---display semilogy(TestEr1+eps); grid on; axis tight; title('temp2bio.m: Matlab wp2wtree and wavedec'); xlabel('Filters: 15 biorthogonal and 15 reverse biorthogonal cases'); ylabel( ); File_Data_Size=size(dat0), Total_Error=sum(TestEr1), toc; %File_Data_Size = % 7680 5 %Total_Error = % 1.9923e-011 %Elapsed time is 10.581391 seconds. 新浪赛特居士SciteJushi-2013-11-09。 用 15组双正交滤波器的误差曲线图
1628 次阅读|0 个评论
安卓(Android)手机运行Scilab做科学计算
热度 2 outcrop 2013-8-17 19:51
Scilab是一款强大的免费科学计算软件,语法和matlab类似;足够应付一般科学计算。这次我尝试在安卓手机上安装起来。 博文《 给安卓(Android)手机装上Linux系统 》简单介绍了安装Debian Linux的过程,Debian中安装Scilab就很简单:apt-get install scilab-cli就行。 特别的,考虑到手机不适合运行scilab的图形界面版本,因此只安装命令行版本的Scilab——scilab-cli。 运行效果: ============================= 关于博主 ============================= 博主的主要兴趣是:知识管理;相关兴趣有:语义网、机电及DIY、哲学与心理、信息安全、科幻等。 我的常用博客在科学网 (访问可点链接,下同); 新浪微博是@outcrop ,欢迎互粉;建了一个超级QQ群:17662971,希望能闲聊无白丁,欢迎加入;自己打理着一个 机电工程师 小网站,欢迎来玩。最近在科学网关注“ 科学网大学 ”,欢迎加入 科学网大学群组 讨论、尝试。
个人分类: 计算机应用技术|8766 次阅读|8 个评论
[转载]用对偶变换处理复信号的双正交小波包
SciteJushi 2012-11-3 18:39
[转载]用对偶变换处理复信号的双正交小波包
原载于新浪SciteJushi http://blog.sina.com.cn/s/blog_729a92140101c451.html 前面涉及小波的博文,及其引用的文献中,构造、插入单位阵的过程, 简洁地显示了小波包的分解方法、重构方法、对有限维空间的分割、基底(或称基)的条件、基底的多重选择. 信号分解用一对低通滤波器h和高通滤波器g; 信号由另一对低通滤波器h1和高通滤波器g1, 来重建; 单位矩阵是对称矩阵,如果h1和g1用于信号分解时,那么用h和g做重建滤波器. 如果a(s,f,p)是h和g作为分解滤波器时的小波包系数, b(s,f,p)是用h1和g1作为分解滤波器时的小波包系数, 令c(s,f,p)=b * (s,f,p) a(s,f,p), *表示复数的共轭运算, s、f、p分别是尺度、频率、位置指标, 那么整个小波包树中的任一组小波包基的系数的c值之和都等于被分解信号的能量. 能量值, 必是非负的实数; 但是单个系数的数字c则不必定是非负的实数. 因为 c的模值越大, 它对于能量计算的影响就越大, 所以可以用c的模值来计算代价、选择最佳基、压缩数据. 本文末是18对双正交尺度滤波器,以前也曾被用过. Scite居士用它们做小波包,处理30个单位能量的复随机信号,结果如下面的图片所示. 图片中, 左下角的红线图, 是两个尺度滤波器序列的能量与1的绝对误差之和, 其大小基本预示了两个序列能量的不平衡和远离正交条件的程度. 复信号的长度为256, 实部和虚部都服从0均值的正态分布 (用Scilab·5·3·3的rand函数), 分解深度为8. 图片中左上角的30条曲线, 是所有分解尺度中的全部c的虚部的总能量,与实部的总能量之比; 负实部的总能量,与正 实部的总能量之比, 如图片中右上角的曲线图所示. 用c的模值,代替通常正交小波包分解系数的模平方值, 进而可用熵准则选择最佳基以压缩数据. 抛弃最佳基的一半系数后,重建结果与原信号的相关系数,如图片中右下角的曲线图所示. 从上幅图片中, 可以看出, 用第8至第12组滤波器时, c的虚部和负实部的能量都较大. 用第2、3、13、16、18组滤波器时c几乎都是非负的实数, 所以可直接抛弃实部小于零的c对应的小波包系数. 《基于双正交FDWT的雷达数据压缩及目标识别方法》( 电子科学学刊20(1), 44-49,1998)中, 用对偶变换对, 直接导致了基于压缩数据的变换域分类方法, 不仅适用于普通小波基, 而且也适用于其它任何双正交小波包基. 那里使用了这里的第2对滤波器,处理实信号, 直接用最大的部分c值来选择压缩数据, 但是, 如果 考虑更一般的双正交滤波器和复信号, 那么取c的模值来选择系数是必要的. 用18对双正交滤波器,做小波包处理40个单位能量的实随机信号 (零均值正态分布) , 结果如下面的图片所示. 信号长度为256, 分解深度为8. 首先搜索、检查所有分解系数, 如果其c为负值, 那么, 强置c及对应的分解系数为零; 然后,再运行最佳基选择程序和信号重建程序, 但是不再用另外的压缩过程. 计算重建信号与原信号的相关(非变换域)系数.下面图片中,左图, 是用最佳基时的相关系数; 右图,是用小波基时的相关系数. 用第2、3、13、16、18组这样的滤波器时, 也可能直接用正交变换的方法来选择基和系数, 不需对偶变换. 然而, 用其它一些滤波器对时, 例如用第8组(对应Matlab中的rbio3.1), 对偶变换方法更稳定. Scite居士认为, 没有特别明确的理由和需求时, 应用小波包, 最好避免范数远离1(增益标准化)的滤波器对,以使结果更稳定一致、更具可比性. 如果用与正交变换相同的方法, 遇见怪异的结果, 怀 疑是不稳定, 不妨试把重建滤波器用作分析滤波器、或者用对偶变换方法处理. 对偶变换中滤波器对的增益,要互补,但可以是非标准化的. 用的滤波器组1至18 : case 1 ; h= ; h1= ; case 2 ; h= ; h1= ; case 3 ; h= ; h1= ; case 4 ; h1 = ; h= ; case 5 ; h1 = ; h = ; case 6 ; h1 = ; h= ; case 7 ; h1 = ; h= ; case 8 ; h1= ; h= ; case 9 ; h1= ; h= ; case 10 ; h1= ; h= ; case 11 ; h1= ; h= ; case 12 ; h1= ; h= ; case 13 ; h= ; h1= ; case 14 ; h= ; h1= ; case 15 ; h= ; h1= ; case 16 ; h= ; h1= ; case 17 ; h= ; h1= ; case 18 ; h= ; h1= ; 新浪赛特居士SciteJushi-2012-11-03.
1748 次阅读|0 个评论
Java语言调用Scilab。
Refri2010 2011-4-24 16:04
Java语言调用Scilab。
具体讲,就是在 NetBeans 中,通过 Java 语言调用 Scilab ------------------------------------------------------------------------------------------------------- 在 Scilab 的网站上,有以下两篇文章介绍,如何利用 javasci v2 在 java 中调用 Scilab 。 http://help.scilab.org/docs/5.3.0/en_US/compile_and_run_javasci_v2.html http://help.scilab.org/docs/5.3.0/en_US/javasci_step_by_step.html 归纳一下,就是要定义如下的环境变量: 1. PATH %SystemRoot%\system32; %SystemRoot%;%SystemRoot%\System32\Wbem; C:\Program Files\Java\jdk1.6.0_17 \bin; C:\Program Files\scilab-5.3.1\bin; 2. CLASSPATH .;C:\Program Files\Java\jdk1.6.0_17\lib\dt.jar; C:\Program Files\Java\jdk1.6.0_17\lib\tools.jar; C:\Program Files\scilab-5.3.1\bin; C:\Program Files\scilab-5.3.1\modules\javasci\jar\org.scilab.modules.javasci.jar; C:\Program Files\scilab-5.3.1\modules\types\jar\org.scilab.modules.types.jar 3. LIBPATH C:\Program Files\scilab-5.3.1\bin 在定义了如上所示的环境变量后,将例子程序输入到 NetBeans 中, 并在所建的项目中,加入如下的两个类库文件 org.scilab.modules.javasci.jar and org.scilab.modules.types.jar 为了能够监测程序的运行过程,我还增加了三个输出语句。 此时运行程序,能看到,程序编译运行都没有问题,但是似乎程序的结果显示 只运行到了第一个输出语句。 似乎有关 scilab 的语句没有运行。 我遇到的问题和这个人一样。 不知道如何解决? http://www.equalis.com/forums/posts.asp?group=topic=220319DGPCrPg=1hhSearchTerms=#Post220319
个人分类: 编程技术|8248 次阅读|0 个评论
开源数学计算软件SciLab
outcrop 2010-9-29 18:20
一直以为,科研中使用开放源代码工具,很多时候能更多的掌握科研的主动权,特别是计算机、数学相关的课题。今天介绍的是一款开放源代码的数学计算软件: SciLab 。接触这款软件比较早,不过用的不多。 SCILAB 是由法国国家信息、自动化研究院(INRIA)的科学家们开发的开放源代码数学计算软件。SCILAB 一词来源于英文 Scientific Laboratory(科学实验室)词头的合并。其官方主页是: http://www.scilab.org/ 与MATLAB类似,SCILAB也是一种科学工程计算软件,其数据类型丰富,可以很方便地实现各种矩阵运算与图形显示,能应用于科学计算、数学建模、信号处理、决策优化、线性/非线性控制等各个方面。它还提供可以满足不同工程与科学需要的工具箱,例如SCICOS,信号处理工具箱,图与网络工具箱等。可以说,就基本的功能如科学计算、矩阵处理及图形显示而言,MATLAB能完成的工作SCILAB都可以实现。 由于SCILAB的语法与MATLAB非常接近,熟悉MATLAB编程的人很快就会掌握SCILAB的使用。有意思的是,SCILAB提供的语言转换函数可以自动将用MATLAB语言编写的程序翻译为SCILAB语言。目前,SCILAB除了WINDOWS与NT版本外,还有多种UNIX或LINUX下的版本,如FreeBSD, SGI MIPS Irix, PC Linux, Sun Sparc stations(Sun Solaris) 等。 作为开放源代码的软件,SCILAB的源代码、用户手册及二进制的可执行文件都是免费的,公布于INRIA的网站上( 中法实验室 已建立其镜像网站),可以直接下载,在我们的网站也可以下载。用户不仅可以在SCILAB的许可证条件下自由使用该软件,还可以根据自己需要修改源代码,使之更加符合自身需要。对这一优秀的自由软件,国外已有很多人加以关注、讨论和赞赏。 十余年来,INRIA和法国国立桥梁学院(ENPC)的科学工作者坚持SCILAB的开放源代码与自由软件原则,最近又与中法联合实验室的同仁们共同努力准备将其在中国推广普及,这一行为理所当然地受到了中法两国科学家地支持。许多中国高校地学生还积极参与了基于SCILAB软件平台的应用软件比赛。中国科技部863计划和法国驻华使馆,也对此给予了积极的支持。由胡包钢老师编写的《科学计算自由软件SCILAB教程》的出版,是推动该工作在中国进一步开展的重要一步。 参考资料: http://baike.baidu.com/view/272205.htm
个人分类: 开放源代码工具|13278 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-29 02:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部