Rwave/0000755000176200001440000000000014125127122011333 5ustar liggesusersRwave/NAMESPACE0000644000176200001440000000042312556010474012560 0ustar liggesusers# Export all names exportPattern(".") useDynLib(Rwave) importFrom("grDevices", "dev.set") importFrom("graphics", "abline", "image", "lines", "par", "title") importFrom("stats", "as.ts", "fft", "lag", "lsfit", "plot.ts", "quantile", "rnorm", "spec.pgram", "var") Rwave/demo/0000755000176200001440000000000012517155431012266 5ustar liggesusersRwave/demo/chapter3.R0000644000176200001440000000521311341720622014115 0ustar liggesusers## Example 3.1 Gabor Functions ## Generate a Gabor function at given frequency (here 0.1 Hz), for a ## sampling frequency (here 1 Hz), location (here 256) and scale ## (here 25): gab <- gabor(512, 256, .1, 25) par(mfrow=c(1,2)) plot(Re(gab), type="l", ylab="") title("Real part") plot(Im(gab), type="l", ylab="") title("Imaginary part") ## Example 3.2 Transients ## Compute Gabor transform of transient signal, here with n_f = 50, ## delta_f = 0.02 and two different values for the scale parameter, ## namely scale = 10, 18: par(mfrow=c(4,1)) data(A0) plot(A0, type="l", xaxs="i") title("Transients") cgtA0 <- cgt(A0, 50, .02, 10) cgtA0 <- cgt(A0, 50, .02, 18) ## To display the phase of the Gabor transform tmp <- cleanph(cgtA0, .1) title("Phase of the Gabor transform") ## Example 3.3 Sine wave ## Generate the sequence, here a sine wave of frequency 1/32 Hz sampled ## with unit sampling frequency x <- 1:512 sinewave <- sin(2*pi*x/32) par(mfrow=c(3,1)) plot(sinewave, type="l") title("Sine wave") ## Compute the Gabor transform with n_f = 50, delta_f = .005 and scale ## sigma = 25. This corresponds to frequencies ranging from 0 to 0.125 ## Hz. Display the phase: cgtsinewave <- cgt(sinewave, 50, .005, 25) tmp <- cleanph(cgtsinewave, .01) title("Gabor Transform Phase") ## Example 3.4 Chirp ## Generate the chirp and compute the Gabor transform between frequencies ## 0 and 0.125 Hz: x <- 1:512 chirp <- sin(2*pi*(x + 0.002*(x-256)*(x-256))/16) par(mfrow=c(3,1)) plot(ts(chirp), xaxs="i", xlab="", ylab="") title('Chirp signal') ## The result is displayed in Figure 3.5 mycgt <- function (input, nvoice, freqstep = (1/nvoice), scale = 1, plot = TRUE) { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- nvoice Routput <- matrix(0, newsize, pp) Ioutput <- matrix(0, newsize, pp) output <- matrix(0, newsize, pp) dim(Routput) <- c(pp * newsize, 1) dim(Ioutput) <- c(pp * newsize, 1) dim(input) <- c(newsize, 1) z <- .C("Sgabor", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(nvoice), as.double(freqstep), as.integer(newsize), as.double(scale), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize, pp) dim(Ioutput) <- c(newsize, pp) i <- sqrt(as.complex(-1)) output <- Routput[1:isize, ] + Ioutput[1:isize, ] * i if (plot) { image(1:newsize, seq(0, nvoice*freqstep/2, length=nvoice), Mod(output), xlab = "Time", ylab = "Frequency") title("Gabor Transform Modulus") } output } cgtchirp <- mycgt(chirp, 50, .005, 25) tmp <- cleanph(cgtchirp, .01) Rwave/demo/chapter1.R0000644000176200001440000000130011217041512014100 0ustar liggesusers## Example 1.3 Dolphin click ## Read and plot the dolphin click data data("click") fclick <- fft(click) par(mfrow=c(2,1)) plot.ts(click) plot.ts(Mod(fclick)) ## Subsampling the data: k <- 1:1249 sclick <- click[2*k] plot.ts(click) plot.ts(sclick) ## Fourier transforms of the original and click data: fsclick <- fft(sclick) nfclick <- c(fclick[1250:2499], fclick[1:1249]) nfsclick <- c(fsclick[625:1249], fsclick[1:624]) plot.ts(Mod(nfclick), xaxt="n") axis(1, at=c(0,500,1000,1500,2000,2500), labels=c("-1250","-750","-250","250","750","1250")) plot.ts(Mod(nfsclick), xaxt="n") axis(1, at=c(0,200,400,600,800,1000,1200), labels=c("-600","-400","-200","0","200","400","600")) par(mfrow=c(1,1)) Rwave/demo/chapter8.R0000644000176200001440000000135511341720733014130 0ustar liggesusers## Example 8.1 "Pure" Transient Analysis/Synthesis ## Compute the dyadic wavelet transform and the corresponding local ## extrema: data("C0") dwC0 <- mw(C0,5) extC0 <- ext(dwC0) ## Reconstruction from the extrema: recC0 <- mrecons(extC0) ## Example 8.2 "Noisy" Transient Analysis data("C4") dwC4 <- mw(C4,5) extC4 <- ext(dwC4) ## Example 8.3 : "Noisy" Transient Detection/Synthesis ## Trim the extrema: trC4 <- mntrim(extC4) ## Reconstruction from the trimmed extrema: recC4 <- mrecons(trC4) ## Example 8.5 Simple Reconstruction of a Speech Signal data("HOWAREYOU") plot.ts(HOWAREYOU) cgtHOW <- cgt(HOWAREYOU,70,0.01,60) clHOW <- crc(Mod(cgtHOW),nbclimb=2000) ## Simple reconstruction: srecHOW <- scrcrec(HOWAREYOU,cgtHOW,clHOW,ptile=0.0001,plot=2) Rwave/demo/00Index0000644000176200001440000000016711217041512013412 0ustar liggesuserschapter1 Examples from Chapter 1 chapter3 Examples from Chapter 3 chapter8 Examples from Chapter 8 (does not work!) Rwave/data/0000755000176200001440000000000012517155431012253 5ustar liggesusersRwave/data/sig_W_tilda.1.rda0000644000176200001440000000164212377701075015337 0ustar liggesusers{La_7#JEZ"Q'sfՒj-Ku\g4"( +X[h6:[\o.\:!VI;s_>;=y+!2%9Y4{`~h~iZs]s33fgљ?p5_љmKwbk&6b xAKa_PYܴZ_Oms|QcGlҝRdt#{?[}exWgi.M ڍC/ʃ#wbϡ&1fnNA{\2t";c޸ b<;vlnkgי iG>uocݗ s5e- WUcd+Ɵk=_,]㟼1ZvZ\'m7Qw=evc׹i9m[,olžeKݞ&r^}[{  X߭vfUUUUUUUUUUUտ]5jԨQF5jԨW#X8/ p .f+Ll   # 3ܑ$8%- IpMsܓ%8)M JpUܕ%8-m Kp]ܗ&81 Lpe3ܙжs nMplk'uspt'< nOp|W"L^< Rwave/data/datalist0000644000176200001440000000111412377701075014005 0ustar liggesusersA0 A4 B0 B4 C0 C4 D0 D4 Ekg HOWAREYOU HeartRate W_tilda.1 W_tilda.2 W_tilda.3 W_tilda.4 W_tilda.5 W_tilda.6 W_tilda.7 W_tilda.8 W_tilda.9 YN YNdiff amber7 amber8 amber9 back1.000 back1.180 back1.220 backscatter.1.000 backscatter.1.180 backscatter.1.220 ch chirpm5db.dat click click.asc noisy.dat noisywave pixel_8.7 pixel_8.8 pixel_8.9 pure.dat purwave sig_W_tilda.1 sig_W_tilda.2 sig_W_tilda.3 sig_W_tilda.4 sig_W_tilda.5 signal_W_tilda.1 signal_W_tilda.2 signal_W_tilda.3 signal_W_tilda.4 signal_W_tilda.5 signal_W_tilda.6 signal_W_tilda.7 signal_W_tilda.8 signal_W_tilda.9 yen yendiff Rwave/data/sig_W_tilda.2.rda0000644000176200001440000000201512377701075015333 0ustar liggesusersLu񯀥"SsS)\?"4Ia1ggfgS?Zgf3݅}ߐՒ?6eŤΰX݋CGyqnv=my-$uwP_#+U'''=3K/6uԊ/:V=o8Ϳzڞ%uhNTm,>z"v{&ytM}WrEVK\O,iZI\Ikc}1%/N8+O>(M*g9 #;%ݎlJxgTSϬҝIuAxsgݲ텻gC9*K$?9` C3#^l.׿ԂfyYP@F~t]!Hv=re7C&kIڲ0phGKELqdkOiD?7~靯H ܻ2"ӓJصY)cEȘ wj~:fH{3n}2yues& 9Gd-hh)ҧ{;Ӎj=صk{7u~yW5ΒIK_4~)ȝb7~\#N=unm׹_szOUUUUUUUUUUUU5jԨQF5jԨ_N3l<ÖNt[J(J[J\tN'f:Mt6tNt<@t@A'tDAgtH%AtL5AtPEA'tTUAgtXeAt\uAt`ЅA'tdЕAg9?]tjЭA]tnнA]trOWtwAt{ABp,< Rwave/data/backscatter.1.180.txt.gz0000644000176200001440000002250612377701075016401 0ustar liggesusers՝M=sRT,x02%OZ_U @ekzχy|Xo _^u[`ykI痰_K(BHO&)ս85q:vZtXjgEmnO|EO^Msv+ԕ&3912V@xf94Tl:3ZhLs=01fnc;67_=Cv{%?OXխ39c ?;. #&;.LVq_A-1WG \Ρ#)ꁗdGR$X;5@ g.S=L#랆L~ Dw4SRŢsb1-;̔0SԷ#02c-2M}?CУs"Locz =ωk'3*.2z>eGRtOS(vѪ,A|jKډ- A`F+WxyTXG].VPT/:'.(uqԏ]4(PB1M-YA'zRu'E;1s;o| 07F̌giv:K'~?k-9ljTĺ?Y4V>˞[ԇk1'C;𩍟-\|I~ZKFa!3,pۈ%KwP+6vz?:?Fe| +7:|y3տXr"~bK!ߑ:U_HԼ V/}rBx"%:7| %DǙxK?I ۶@1Ѭ~ȿ??]ĿhvmyRi,z#t+;O1|nXjkWQbҢc_-.VTUK]lR5ޏK]L5SN|o83}0>: kL.X46SbU2Z/m{bKV-\AkjU]~ קg-ݛU zcVso*5lpM(zb'0'2H|k^3uLӺolgQe_Ċ@0/eQ;]IbJ-^q_.FwTT_ò?}O~ZWtvO}58 v{~^~߽h[˟{>m\o{U;^̗-mgA-r2#z  ~,r~c+{ZnxL3#ȸC'x|}0jW\3l} CEqXݢ#aчYMxuSQJe]):ʅM#j`߃na){ ~獕m^<|-ª nF&[& =.`\ JorpE2`>fG.3&| Uq:c9v8,>I3z/qYP"\o Q rZ~,%9̃HgBh̷n?7YPF? dH}Eڮ1~\F=*u.?2V`<<|K:I"1L$NRH FxJҳoLaS$o?X,|>(d0W OυBWiZ% ZYIyG@n!]ǡDdMXZ)g):XJte] rhX@.eĘ$値ȉPFUPY_ `4i^F`$*tCj>=0h*sIdE/\ "GkD >0*+|%Hs_["Zc>bGVؑ :uIk0%BRCz<kdP;xI_tOE%Ĩ _'+ˊpd4$ r{VMVto [ M ~ʊ F8͂ Q3:s9x\ö4!$yw-)}|`!UQ|}Wc9$M|5hⱊѠVHѠ,(9Op&̩crNdINű=H ]TBa5G  P,?q`H2ߠלj"?3-ۓf]X03̕~cʙlO똑w*3fe@҈gx?#05/%kj,щcA 5_f~,8sOHPc*&sS02(RcIМ=|+Sā" r"C L72XNmX8`lvg6V{b=+%< ܑYr^#]IOAc=r3=zhc;q(w{(T,֘4>F\Tub !@qFaϻkKg]9~lx ݦ436j/k ܇tl-I@׷?eA<8?`~yI[xK+Qv_nj@#],NLbmCBFe 2Fn]7}{NXK<{0FRsEI"h ҰEbQSF5  cNxͥ؄|$oqH %X/ )L w7-@;`>V mYHC-+qToD̶9Un,CH[Y/zNޱ9 &дޗL46lVXyӕ/cU%-?:ycg@IS@JQxa7l+)@)ٜ p СFO@A8lA ]Bnh%NB Tl[CHYIMܼ#n\r @g*th=~@  M#DGv^@ ܂ '#NC G`?ĩŻk?&e# KfFr W02@(m/LFwmKV a#u]Kd *xFÙl8'"$0 耐!hN:$*2SN߲~!$ _=XfL}&8CfQ@JF'8b3>k^FMQH,3n+r@sZ}C&{32ʬ|(k >4-Čm7*Ee/Î ;Pb<.ÔfR(ʿQYe{[KbWI_ba@ J`֋+~7&7LEmP #sB^ᓠKf K&D75h0*{B˺Y\Ѷs6@Dlp幅Qc7WD)45./]>4o P/Ph}EsJEp@%nQaA3BR:ltT 0 2O(VK\e㜔 5. dA#s+xr5U8<!haF)PJ֧f*^9`a!GQlr|,:h*Rtcc͍ p| \@!>~ݸٸ>d'QVw\0twH@\r  6&dגb_mJ:#`X&MQtcɬմX'QڕJ#1 :kg5!bdǽ=Iy<In^YƳ8?Kqщxug݂ Š*DMf/ jXI%E922aPg`p]0R2_e|s/Qrmdb"AkIAF%8b E&8Z۹*FG 3,V*Ek27 .YFLo,ș%O)"BbgYytAtqҪS侺y"Mm)M<EMr3`_)\DBVԁc,BzB^T9m;/`{$S%A0v<3`[2yq=E68㐎C M'dƾbz o\iArǗL:|E.*@csv_)}u'6s{&@] *|لt>phH½sW3izaCc hnc@ԓqw^AbhJLͻپanrrQq8J.I]We~@Z" *At, ں(JxDw:(#MdGy9ڒܼD ׂ€!y|TL8ݪ'|oX UOYHL<' -lQ䁆0y> *Xt vW!**BU$]e|] +O8~THJ.5t$MzA>]]H?<݌Of zT?66p*ߵVUe[{tf_7/EFV 3K36Tff.N Vz`)A M㭦wzؑ8$MO)f>{;FYa;$mVB>Hȉw{1Ednrs!u@Łjf>C$1Y.ኮ=ƼkyQIeS)6}^%EdǏN2X46#vZEmJj OAh^h*f ?kB{ / v<.Л0x3FJn R i7P\Zי 9"&7 =x Eݦdq[vP|[vSp774vr]7/$a(薍j2{бs)R%,դCk?p*:1~X9vVw߶dQ'=^=ʠC?bTҋi39N'EsX e"+h^ њށO6쒟5)[ A=jo|qC}7,׉DaAk=,["?Z(Ċ;Z 3ɢVGzPzEr-5'*_AũSt ْf%èZplDNN~=$,f%[E5qt[LQuń{0p;YuYQ>@i+ΥK:Gr:IH::@㈋lX; FId I=UmA7R*ꐏ (!=udKw:v*qP.}8S_ S#@G;zXm :{ |ݢSdy.K(/>FOF5HkNuGjg Sٞ~/.;]kn3NӉAOFRÑdY~ UuaٛUFʟn|bWh3lV]t艏G  /7.DJM6:#^>Fi`ȯ5@j^rEظǀT< w^Hί0!~ϯMذ#K8N&UgU'ڙؕڄBS=1\} Q9 e œ${HXǯ1H8z-#9Vu8n1^qpM6@tNϵӹ(;45ͩvq:$zg~GbA3 :pՉ7?FKWwI9̏Ռ/Y_u.[g}bf3UO75_~jE~?6ޟ6'C(<২!P"Ci_dz\!N /8$ a:d$^L#]05Lߣ| orqUa!-,tF>1E.Kԇp8XZ>Ӂ ee D xJ^WȖē)xh=8^ήPI٭!B _Jskx0H*5+gOJ-3[ pxRE'.)95 ?Iر28}2bQ{Zcm.oi Pfz0^&>' A:@"Δħd# ˇ1u"O۟~`1$9P%ljgĴ'PMτKD0MPۜG$~Y,K<҄g F|U>*w`Eύ$J}3?bN_:W$ROGP%hYmh;%#8Ri߸9Rb/&U~&n!\[3l[ >y&"R7q+oK^.b7e6Bھ5a+K6y 7>IJc'5B(wgxA$?.Ćq^F18ZmCCf N@*Ɨ㞱f9(&^G?ӞC۟XjސӞ,sM27ߤU zE 7癛I2"s-.4&bAֿr[lt4X0*sԂsNa`H˙G|#}/Xö=[H~{K.SE("gR*FYb'UZdN1M4brG~r 'bG5)zEsFkEf &j}dtnJgR fW'`;ڢl[wހnm ,Bv܅ !0~ V,m;f'moj@߳D:62Xzr&0(.N̩%(9%OL~tnTcs[7Hóm84Jg67zVt0 a`wB\yWضNUm{YқH<"a2jwx|-y]ܱZpVL,FDJJ 7TLn׮5{ -p6 [mmz·6&78l1hlzb1VU5Z6w`TPffՖ`$~T@곋s/?ϮqW#e{ʯߑUL.ۉ>2A!N4Yd7:$ >eSy_rk/OWȶ82(3Rs߆(gtmqp2[[V? 'j)r:J&g(oRgC-%5fTZduެz{$Wwh_|2ؼL6aO<d $qyi}zr :NSvh} Ax\2G}ƞq­B\De_/s֪=eav{NgՖ:kl ÇFX"bVd4`kg/Vʑd T;iRwave/data/W_tilda.3.rda0000644000176200001440000000256412377701075014503 0ustar liggesusers}LUuǏ/@Js2fb<& 96@McEMfh3;L(<:mw2_QD٘*ʁA[P{MDԼ(0Œ?;gD|~¢KƎ|c6\W=X"[w|9"x{rUQ1s:NqE'ZGΚ圵&KiI ΩT6w8O񻦦'&7Ԫy9=krSֵlΈk)ōkL<]gt4FƮ`oظrxغeрۛ >RnmM@)g>{q%%вiHڒM!X{9k)QCu=%{=f?Um_?z盋0y` 2rKt{]8JEwۓ,~nݰkgdzjcw=ujԺ~ۺon׻WΣk]-m19ҵw'o7ܻ-?0 }^`a}`al0 }#`9۷v* e~".Z{nk/X]c/ܝCSv瞟{tuo9pSzo,f7-gKΖt.v?8:vϹ]ZKU{ڥ6IwtǥMv:&|m{H} '鈛w:ں}t˝tY:,s:K\'uy$v.;INq'麓tI$x.-xc}m9G{z9ϼw[zmy;z6qGk~[sk+Q^^휸3V\w~z[}}Z˫'7}^[wώ?l駷{Nˏ[}N/zm~#nyfvԧ/G1$&o#.pki`j{u{~5gF׿o~qyW[m6^sů=O~7^|M|Mw;O茸W{ }o?øyC2]qA\3^-ܝ <q]wx+e~Z|kX< h㿍_kuU~q_<`6N_ŷsۍ喑cƦߎ%ďzK#Ьu^,G>svjƪXWGɠ$[8bո#mw6fƋGsǙ!"Y\AxoYa#%Ƀ5bj W8="LDpcGwƏ'=.~t#tŏbGlj宊)N2^VxYŚ|gcFqE5A b"dŒ\%xy-sqDy8*U:qigl#6'emX@boDwOx8?yLy"B I9{8F#n}ו8ψ͓{<d(>p|/V~aGO'|nω[ipJ^Fe\۝-ce0S|o,gcEE܏ #bbW:կ=٭ %zqV+T=߬GedԶH #\Ɗ:pnFu>E:gJzJb/˴&ʛ)^n-' +ʢ#Վ lxbYꥈ|ÕN+PN@rebp(qcخ'D|ybb)GE؈0"Rl/#l|d#ErѹΣAf1A|;7o0 F|cFxL` q@*e{:X}>b:[!qX NW$Mr#I.7v3tķǃ!ZQ*m'Uk9qd3$qSc$1bQ e#VG8CW#hue|]\a$=*F F36`CgR_KpOPD@$.SK' 튔A$5u\ϽH/Ƚ8M-& &О3B?kN@V$Z8grGy8;+3%%ӉFgM%vIbQX.^SQPF, X]_06wV{o q\rr$G7Ė*>nBL ,0 =,: WDcG@͸ @Ky0TPcدw֥Y$q$M@--҅Ua<ظhJYH@mr'qu%;[]!X%bs#UYL:}oaQs@C_9Iyzd`ʮDb]lk@li]?+lGDP@NGunlYs&yg>R1ÝaM&s9).[!IlǷxDtNUvLdk]?4Z+]~'򶖹F5()NTU5i)1?82*4M&#v@t8m`qbŇğg&DGDܱ{M7sLD-M;1堃]=.; 0K`Px)^&/;U6)(Ƃ=)K"|G帉\mo K!>\\Fȟ~ f˦ H.>v wg~{jccWC^ل&\Mb ă/iszL6a]e*2 Wۘd \NǏb2G suWI8-[] ]] gHi,R0{8tsyכY|1&eSDPѨkL׸F, `\$8 `i;tz $j%Ϝ'.DZ e~ז[zO݉J%sZBL6l܂)K^ݸ P$OF;k=!>Oݩ He㚳inp LQ M&O v"$Ua^-|v"HFH\AgJy=rQmZtYqF΍M=M?r.oR =?%UL zo9,i[,pH- W'%mK;Ԓ_}(wQ߿Du?6gQt>1pA9%E|Flbs UN8jY5+gKK WmAg75CijH䋑2 T,}i&ADtj_dkrm J 3RuM6jf=̜| Z"=<b>&J8U㑞w5mW(H[wDY +: YL<83 s+N/84G=Ey }@8IN>tbjw%e~[V*rX0n( KbN#&%26 ܛG>-Hs XQ4ED]?Y Wv("uܣ޿kXJXOR3P+nK'WA\ RH`=Xy,iAτ]2(+-[ְԫ7F+E(͎ͅQ,oa @zq\8b]TU^nT4-b2F: "\7tND඿*͇Q36B/ v;CP<3WΣ-ɽgO濑NVY9uRC;j?* i8 CZCCg $H ^^WU`I3D؍N vG&jEzвmq b3H+ \ H oaJcK+p 2CS! u^NR>3 P=Cbf1 ?\!Mڇ({3…I/?|Rz~ϰޣ1,CH|lHHlr}g҉1Cӣc%[_dMp@}'jI9f`H o&@uN [4k C"pa8~Ŏ{]贏;~C+p@%J!RZ(7 p#+@N耴) yEz; H|= ;gXs6 ,&akdj% 2)51Y\WL ډ$,{4ƌ穦~%f=)KzcQbO1ܠ i, IAA9/#LO˗' 0ֆ6ZopE[{򭅠 %8`)*8c?jzT"4 j%<2BB#LL_Q af oײ&Z|at6ղ_<^0x&*]ற~)m(|A_<4?P*7<ȿnjLtЀlIlcw8MYb#-B b.$rv*& ~> FG0iwNh.t胯SJƜ`L3Lo;8]#!N<صfR}F܍uTc \bи_Cqflc#9@)EEMl)+R\_DvZt^- О" E X卍0vԖQ=g"k6# Nm&5ٟ qQ&`=PLJ)PƥGN'À7K ?W)d>&9{c%%1zX!#"eZYo^ Rd,:AHmQ)X~2x; 0`Ua,tI_%.#B(@dp+톞K$5]daH^}pLXvwIHQ_ }.Wcd4*~Urt8ҜL5i<;&hfE@A3LJ#;BM!70"XIsl*7l#UPbӺGAe-Z7_x}7nm7LU?ֹM6\UlpDbđ$uX;hD6y|.Q.'')!X?^D ޹j6H@$ SCH\X HW*);%abݡ" #n5č@tEA{[bĸJ)4aA##:MT砅u9JT_dRx Ȉ4qȾrZʅ2z 2T,L&"xy@}F郦&]D¯ZtLסvh&ᐩrG`e`n0*# )AI " `D5rC􋠳*\d WcDF"0wAy˾ڢJ54@]|\u뱺:od4 Fm z JMPY'V835Nth*֍-^h|p22 fSe%O1:&[tR b1o> Ӛ@ibrކb~MMA ?D*>aI;t~KR|bC1ZwzO|eKfp"n-+eM,ႆ%hɳH<J;ʼncG87}Am/x[r@f"BǴ Ǜ3@+@E "_cP(zٮ13ˣIs \uu@#!Jj/l,s}@XڞlF E 5hHNn}R yPs0ߗ\r1b \@X5ėђ-zR8鑪l<eM\obъ.U4LܜO +)|1.~Ig!$4 'ɿjߛhJ%A#lEXpD 8Nzz3״8DZchU[>)Kw<v0NzLH|Dp2knj+tڤn%vth8 ;:A06}fPyQo0W^jK1P;MmtJc@_ͥ{L`lp('>bI!-YQ)n؋űgľ5G0\CȌʦ QyPapu{WIUCb9 ڠ\PM䰻< #޲tŹe $d_7)ȥ&zQf2qѦFdF53I3%wc_KFS70̵H Z<Ƭ;[f>[oB;bƵ.7_E  =`}.f"/2qwiϟZIo9YLmŲc]; ؈7W>Bd5Ԍ#P*68r[!",6sjN2H,ƃgDK tuTa%}4:)5e# )/X<ň.txj^aH9wNY,OHۯ\I *#ĝ.8K }a\)ICy* YZMIzzHWD?@{eF}+Jsl$ "uA3_~Ip.\)n2 %;PDTc!O8*AfdGg{fQ;5S"I'r:.A좭ʡG_T!,GD( gBfgS Kq2;Ϛ,:(N60څOYͰW :6 piK+;ǃVrQO<)9i^,cW`!WP̤% Ȓ] M t r,ELd藔ۊoe$3 WVL1N'Tc_]Frv1e#`f :[j"X NFAH_1­m*M20]^5#nj #…6 Db%8"[f@hHhW0ٿo\2,0O]˴kH,~np{N=<)t%dCB;?lG\[ˇ "LUtZ@So!pJKa5Ty[.#I:瀿:\D7a0bv3y0 [YdF0QLad9(:_p!!; iZCE.^h 59 wlrg!O\L DpD4X( ʬc%եBDic&Y!FRНt!RoH3hmXY='gu5j}C3GGj'fl!r8ڨ͸2Ja/fTH)91I62)In[^M06w*4L7frN!ON锣_B6nLC]y~r^Ԣ߲%iX1t|ՐL9K+UIpy]lb;\$RiOf7R\s;j3 xI^P* h9H/'iO*h?QLי*4?9򸁰 tSpmd?Mt65$3JGVA4I?tLg 2; MqhTaj"5ېp:BH IܨcfDntOT:)V1/6Mbw A,v#v4?xQ> 51n%w\.K 0*kbDL NGZa\%zˢ1Ja*]t},NH;:Ub(=fdQk5&G{ю e2TZۑqPsCƭ@2V$-BygZ429a K'Rmx[.ŝ  )+1N:4!h%&*I+󉰮  FKD;ʪvo8QG tU5q|' >4PZ+qv7#%IF1q\p%4#j}ϬlAcd70ȕdXb3[rʃ8ΆeBsm"O*Izrq0t]]UsFh{U\8Zv?Ը~̀6"JEͳD%2ˇijhqTzrzfma HeZND?]MѓmdoT2fv 9ѭq;R=;uicY0r$m HّKqme~xZSR+ӑ7g)}Db6+6KA @Vp5DA۠Hgͱ !hR+z+Qvc=) 6Ujc^d8@T]djq^n.L%Vձ %V/#Kߦȣ'<*{K$ҚIdn\I#k'?vrR93IUF24IC--op( 0:«[G*!,-|RgJZSND$q/ m8T<XCFRBNe\tt>ZHIGڞi h,:ofˡ/"p|r8Y7WUH?]-bçBSM4ʀʜ^=sXjz) Z5-G2iK/ʳ?A )0TL2gU/[<<۱@lR82;hť)$x~Bw^)>ǘ@ z>Ǯ{Rw!+''|^ KRlɮ%bjs2w\Ki D%\+t,A=ȼ1EcLʷ%V>P+5C$@ }X4bSm_S&9 f`E{nʺh79tl8M2$WsnB !XlxA<ؓf=xI{ɄiAA`Bj+G/<]cyJ: ۆᖣ\ԸfR:.2+d՘Q8}eC/QSX11&+%ɬ?5ˇsmK3iC@e )vsYd!&!E&Y<GzeKQIx&׌>`41ړz)|MX||Dٓ]'H푂]9.Hͩ! "NL`L "!^Pc3&#"TQoh0/n :Ѐ|<'A\\˲"^@D˜Yk8:Ւw6n@yEKW ġtTXGd#NJ¥FȊMRրo~τ-G?x2mYjy.1D)K-K9H*Pgpn9~ā@6ri1ei%S=zmh~L~ՇsHA d0&H͒"'0"!+ZSq,K9Y,E yk(LY ȗCqQA]e(Y )C?VZrfh@VNʭi H&J'ٞ˷լϔͨQµQzVxâY+:&֞H套>s;;ysҿ%dxEsOG:xL@й98iv"!ZkH-?Y16`UH2>j"F1dõܺfB , 3~ĺԜS 6cXLZTTg J55=v!‰B}d/ #jXP::5a!V /7VjS'&fLH֡?T&Cv vQ4( 6IᘚKa6}s ykM%CIQL(Z $d$%5rl2ϻ^BQg`@.'[&=vHL^D-5,4ckd@ =J*ƅ5P+;1qj#$EXe%u<4G/EإC0Bb5̌wšV2ƄO#x|=x\@i1IO10nyf' ,ÑEqo+,uhfHPCÁ%kZ#c)H"V~0NHٍ4MC"|"/T5^c-$@k[+^W<,dI 5b!4wG!/Czgh˩Lj A:7 轘UyK_:*RTk;:5ҋF|I1yz4)5I!ƣe]>m+&2[L+WԐܞcS-ZY wj|&O }J,W7T#ܿDAax DO߇PWC`H#+{d!K7)^9H}ưcTi\kXFiկqeFiJnŋ_/n5P u F5d:)e;2aklj02clvBRToЮ,jhcJ Z̜D{Uד!CQn@ [,MO߃Y-x<3wbz@Sn/%8LAS=ilj0PϋaSϐ\!MmL7h j`%30x6ɤ45{ju`~HVE`@oK<vV9ٵK/|f$;Xk@YFBV7 Yt3A c{v0V.E+4=uȐwJ,$`\BQ3#*kPK%らzˈukmv@zjWU:5+2gA}(/()caj&6.=a!^{oaY54 A<9兪Y$Yϡ31:v*xlBetjCA)8hNOQHqs"X* 4c p]56.ճmx;a#dηd5?=-ACڷ2pGKb%ؖCaO©q`̓Hc/QHxLyBg@fWexJ9dcwe+e "/LF3 oOKtҧLs֔;;Dz#S(%8GCax\̜'/0FFb%rc/f#/O] L&R::YD0b(YI7(,2X41Yg*f4(}#Ar*:{N6b^()Py ȭO ) SH] T,pTjpai:xY\Yia^HZ{Pڕt.McxH3|C˳uts v_¾#rV+lp|gcђãE[G0B@@e6hrסG^Ȕ/yJֆKKޅ~N;d;ܭ&m2۳yG)sOv]9x`hc0֡QL5gAJc7ܿrᤴGZ*xlW5Co gF㩰!Pdn,T_ ?2ˆF)BHqׂ]#+N+8\BvC^\z(S~”D 2D=T' J5P}T1SW]g(ہ 5>zCs =( .=vL!ȳ:mݗLkllK/w<H9WzSyO P&ǪV&r\bbCx\%Ƥmd)y_ Ub})4 BEd&oZKVRߴkItkzdV57žx\`8E|yc!`ATX 鿎G9YIj=թl;)o!$ɾa]s [AME_lef3jbފV՘.$ G!n5H 4$,$2<@:dj39KX4 Ȇ6c C〷 j5ש1Qv "Pn@1<6թט!(yh_i/ySo&`ݓ@=z>OjPl܉0^NOHF} TP%Jltt`xMeX[T$2NH̹1ذiF;4]n4YC80c_K ;77.,rFuNmICͣh5C^m7CPٶjb0#e\=-DcJ[Sf{2R\tq 0zsҌ~ IJ#3L`fPQ5ioGTFfŃRd@'n?IA&ݟS-#6k|:S<28>!6.cjJ\)ff[8PKC#V.N  |c)LɃ[ 5" [ҵX<q4n}vz'k~/+MH.ڑhL:3D1QAq0S/e==xr(OFiqs$6Q̊C蝹2(yj1|XԈЮ*@}D~٤S ɯhԜ1 M6уg0ʵ80 } ~& +rUT{1V#3B׳41@Pq.6"nU-ֻDyS PI9BBW$uG v Rt֌LA%1 Ɇs12bYyI?c.A~5:˟CA2HY^%*uf }/ 4vX,QsW3?S$%0k;1 >z@4x?Qg6j[eY$| :ę &ii,`0/LI[8'N/p34W{e P_)y*I-<_[3eI禥FZ9;SqhsT1W+m$AW J_k]f.o/?S\V-fcQN!Db$-&!G8Z砠5XC׶Q2gcy~5a/*Ԝ<)$JTE q& WRBfle=w ,a?5$S#t_JaEA$9*mW֖F3N EF3I5Y <-E/xȔ5%۹g|MdFGP@yG8݋'Tq*G+c0J WI\q5+5+R&+REt3]ܦ>_R&>g05$"&n@)an1$8l杀X GcƆrbJRk1: ;+q|B\f24δ,Wɴ&2L)gJ^aar4~: 9 2fŰrOhcmd5%j&wRz><9Jݮ[X (0x._XHL5l2\v&p)ˮβm` Oy7t'%+8I)M/"i']7pM( t iB%CFYPRIfjCb (d{^,:f3"'sO*eqyʰ u|^|j)^ӧqݠ^<vR$C@0tkHd /*KmzCSѬ"K7ھ1CLQĘK)/l:k>f1ĐFʥ?C+TOjt d"GmŌҰN'~|kZVOG^=yqKK/t9f®H@  窑~9?l 7GzCIo!hn *o㋩9=ZCڥi畣@ 7YkB /gVaߒ\ X ]RL1)>90u Nw,(qn,mp9mv7N?ꍋ$d6L0Pҿi3@vfi.e( smyZw9MM\JyX~yAqLɔ]tW ܉N*(}F$3->R7uCD peI)v,|Ei ͯ ~E }MFy0jֽ 1LIp1TUwi.uKOHWVO&>@}[9SB?OY6HDt$&8 \ ٘0%G m7MU Ϊ;s>5kL[ı }vg얧!8'ge|챖_vt^ W&?Sn2E"]K<2yXX"r7(6pv8+@czD1hN$ dfxV"6I|-N6e{Z\Yl- -܏9ufJ*]g1-EzX%jLn)q|a-,f l/J&is6kLs‘39@TJ <ϔCP$m:k(ap 7ҥpPFDAJL:%AqWwSiuË=$ң-0Oj[Su\9E@UfMKݠt0q/b ', _S7yg >we Uh8drm$PV%WBm̛1EHLNcxУ b8O„4 rGA|&{q{"Nမv*'тMr22H?^c Gfx$ ,ǑN^d:ހp\4>.{G/1opQ`` Tu_iM\,=zۚ mRD ~2pPX;&Y_~<\dڏ dRT.j΂`w3nuRAOb,\[X“P}i[}Ș'$]OIn]|oAƌ< (8>J&i8%8CK]JĖ7=>YTиc3{}ɝCeT>fPaYͫnx2byٷrs(DP5v!T_@5$ XxH55Q.3,Aut2r4>sv[r:~/%Ʊ[ Ib[FVپMAH똇$Kv|D?'=#m"G9FN p]V>M[Ѝ2 Vt(t3d0sXHEfCu1zFETl#>)=6){ XI߷NL4|5_#.zfxq t[5,T9Ivw:2ie-F!=m6Uy!T8ZftO CJE!^=H]uYڧwPo-Q1iKNZ+%Xs-9Qkd8]EH31c(K{HGV0(?l$@[se3-rvs,N ͞|# d:՜3cƣXҭu|ytT@wƭXjHMU~i1h_yd2im txr vO)%sJ@eBN+ G>c:-VȐ ɤi#jAv4{8D $|նgf%X l2r}##Hz;i[OtѦ3S|Ďxtpm!YMNhv ug!- )׮]{57}%}m̚#bpnoʄ\=y@왶&h[6Qjd>{6::8|\C |eDW"!?EU-=6q<Ϗg6* R2k3lQ`Fzx VU$P0 fdz-8ҲO}2D7@,?-tQ[B솵\Is),Ph 83ҡfmu%ʙ֧9ҒUB^75Kgk{ҜS'B$#6`ME;ji"5&dh-7#QHF⦇ܒ3DaKCv@42 v|_NkwDfZB5|{*2ޕZ8~AQߒA q K2 I$M0-sCmF9M*wAThy=:42 8@1Bpp'1m5D%A&0vsQrG%Gu;wVΕdp0%ݱGn!sAcp! tzoTt/i`rilmm%)޺5lh]1˕yYj/؜G6ϕ1P $g3P K1`pW|lѡp) @!C, Yh򋵦4en\21҆gآF>ia/vzݕ,a4`UZK1^M0"w,[ܮXC5S.xJ&|?^HF PNma`_s0D/50\,1 2T>p8LR3-xB-jf"~"P&>8r3+ 2L6K4WY6$mǒ3GM3Y%/D$׮_AH3֤.?f\-KifŹ?50ad4 >~ļL#8c*YG[&;kݟ۟hyAou<>MiF1=jOy0#7mh fӑ8& fSLhelJ &~` a{^+".Qص/Fif\RlF]ӱ \zjlhf5:uq5TS5Ō!:v;!7Z/=3+.5_:!Sk`n!'Ơ?:-m|Dt/=z\82Q!6itGă/e64:hiP/;yHNLG+spPFЯϢ JaTu.<5֚V 4 -n26( |& |lSu!x`]GŘ(믐U%BbžF NQ+hԇVawz3Y%h\g<8:ax^sf2Ǿ33|@+}Oɑp Njw>A0YsLN|ϩB4͢EMۥ4sSh4䌮2@t.k]hï[@2@tzʇV}O(݃y xle kz6C49$ @ @MO%ɖ\X򃶪ZI*8ܗ d3Hݣrb ;hw+L5;RIR۞GRn3ՂpTF}nk~5qkkvWӏ > 7))V ),}d2f.#sSAJqҲR9)pGcid$& T3Ж;=gbhbSLg`8b4Kp-dI0 9nCԢ垗Y;xi)SO2|]:U$ 0df51W4h{%UTsFn0{JMz bȳ.&Sh bu`Cϑ\73 "S#J (x]g 9E!ñSTv 2"m2)M&zmn sF$LpI̒½=?iEh%&dD<l h] 3`+Fz}"`7ae6N,bGq% 59Rfi<ژt*0P@ :رl1Ú;Ȍ嗡m9C~ǐ7. )D-{Rupz8Vu3h!`dؘ̀JR,FF2]b,EGPR%?Ly0Lv`D!09HQ!*5Uqk}|H>RøߋšgANv%K;?pLR$LD׽w nphRQA,ɼ1bn0$5/icR|5" ,F[%{ϷLF&G"e)c1ʇVϭT G^ʱkL >jꥷD>e=5*g1͹A! TPbwhq㒧jL /Sx8lհ Thj+iʌF&z՘FV)VO?哾;4ǓǮwHё;_4JH%WFD3r:x!^{*;$C(dܣ2;Ӥ]Dxk0|>j>T*r >#[`W[Y8h"/Wl>]Pwin=Xb OZOȔM9b+*0j:>2snf4 m 6Qư&˜KG]YH<39Y@W )4]O3[v$L<1Ls}:X?ZrgOdߛt!^i=K|ZM[xpk]QGYR`&ҩf']FdOXyV`b| @C\O oq&=+GY/St?oΟS֣^e{ih3 E"ϙE4-`:}m!XsX' frA/〟Gr5tE #2QּLv~19S_14> dSn,yMk-څ+U&r WC &1 Ҩ[`z7p~5$x8) S  BoEi.5iaS}] gFhE?T/ FB`7WqQ`ÍJɔ"4/Q`dAm|pQX05rZH0c9t0K@UB贜Po$-l2oת8B{SSh%y査tdYzuG[c&rmZ Fuf׶ 1L'XEE|??Ԧ4ΜK~̙譠xd ^7d:aQ9.=XOHne2LʋM 3 Xc t:2x)Z)%vgNQbF=Y(*spuH.)Wq0ȮZs74ɼ ܪHY[nn>kr@S)N HAD(׿D9!ՓdޮI-'@mclxlXL)#*(D/deASgӄlz 8LB C|Ͳ5of]oI煌$IzAGҩh)r uFQ<']y G芞JPbB3Oҝŗh:w%IJ\8 \u0x5Ý2M%'!X?nal^q[N{{q,k:gt@kxw:V ?7D٧:* 9&POT$+ UdQ 9|PH.amC)q|9J -YړK=^0u0F_pRWbf/ !Aq(UJgLdh\9L@Ξ~)+XTF?u#,<,/k3~d~qg(I+WA@3Hh4 [[:4x@HgE(xt"!D,3sK ։YRLIeքoC0'j( *J4)*203N=1@.R"R?+c7甼yCoCN%Xwe JX0ỳ<*-2#[;Ux2`RXҁ{N5P=٨9|G42P<2lqT%F( ̘l/a%, 0k&`-3#-|~6Հ 5Lv 7 %$d *g^GA@̄0"S〘fGa}M440s/qVTbN0&QD(:Iߔ`cj!=&]("e(r{ B@#`zj`}ty= UCڶ&1,fͤ ,ddV @>j&gEHe+gߣeҴLp~w85c ͡HfFX 9KHKތrK;c s* LW N#@?S%ϰ'Cʹl 1Bij*]5\V \[ȫW`*LZōZ+ƌ .=KJs]T;$d:3| `=9/A[LJ?1${NSFK /Ptpo\>$v}< aj8qxTRӼS(~#;OsZ.5; GwIC]ɼ28m} m~j;|)L4=tIvCal,T!Sc+o, G4gswNO%$2P̳nԁH-y|q+v#R/T hR!$@wV$m2^e5hT7]1(lbJFYHD~R# W-R穀4֕3x14C38B?͔Gb%@ri2&AAPT 3&_I$Ql/B0exI+ M2Th+{7B)\JnoCOZ/H;跨AޘObKBڋӓ I ?pұh~ʃ_0ũ2W>&]KsƗu(2yfșѥYP)O:Jd|0z!w)7OvW 5g82ܴTO Ԡ ,*C(_rMJ됦l6"958Iw,@C&+r22:mu+zMqe<Ō>p!sKryAAX9 u*\Gj2eG8c0k>Uj;s@Rꓬtʚ@eŸSWRi_3.I-^ ]V޲vy6 ~0R@&)2@ O-FgS%60k#%l Lf"RM0(=(`׭Z\ɥUe§,w+ U!{`|lʐhH4qBLAҨIl + ɮ,L\@ώ.7M>k 9@`e P_u4o42bIv$ -,A0mr҈)U#Ixh> dXaPfnxr.Mv9.[!ngw D)GyW~e':5 =wC`E y4wzj'iKˣ&?}ɧ .9A1=P.jq&쯣K8dW6L)3F= !{6"ĕm\Vf'dĦL0y;"WAΐqp?{ձJ5QN%M]7NuI-ާTA.Rgb%Z& Od}y=ZMd4h.*~VD*]Na\V!8R"<4$J dܯ+QnIRS̵|۶֌2^>oЧ@H|C2{OǰHQ_5$AV*^-|^u5rs;LaTx/3v&b6G\LӖ)/@^fZt̻i+r'ϛL4t[m@=y8Gv¬rFEfVjjT%^"h^;ϙE4(V*S~df|j9R MW.<vQd%%k+pثڕ\QԘ rKg+gMBJMWY˅"OÜfY# ZUKPL"_1afrЭtJUDǪ(XQt}<,q̹nil]5UF$5"T°)JQ~]έ>:y6|,9?ujb 'I;HVt ˵C3aPny~s œ!y+b%?FnIpdτ3E5(s SB(*Gaw֞d -z^^:m6gR<(]Cf # av%1P{q٤a#n W'ԨA*~-EͩY~e5CޙWg QA 1)(I:@C/FAz  @U>rG@V= $&.9DZܻYx!Ee4`чbĂOxꩬ t whˡau-);\2Rюw fJtY`ePt#ʷmgFqq1H :KUD*dqk.euJeDW0˒t2kJMA 9`sň%Wm[g[ɣ#OvdN++8I5[FB<;@YB!GNWd"f㼚LK yҪ^j1#rY+ -nfGpv^`VdreD_ngB?s*HE̐;&救:r>Ta2u%y+ n La^1Db2ͬ$0CcrW.4)OXKU"IuJ^הD ff԰bLSt)O&rp%v #a DQo,>/|+8DeX84z.ex 7M$⟘ి!%!1͍,`PʈSŁT΀h81=7)a^ƊAXe +kJסS|3-[yAo-ʘdt諈MVC͓ɇx`N_+\4jL^38 ]AɚGUj<)Ct"S+] 1 ,=8\~ ICzt8WjFHX TiJ4>DȜG4&=!/>.&ҹOuCGXcEb MlJ+5GH}Ma<|Ț$j~nbm@Е"¿9`>c𴼙q;fORY?sGS'xɹQlO H,T"Jf讟m)BI6|ٰ@Dwؐ y&meH5r4:kNHS0.20{ؠh acF'a\3A>RkXœ:׈qst8PGr~OY]?&?@i!9](VĩHgK;,!qt3/Zap[%S@,_C:\4v{o>PK2~lB/{ds2 #͗Q^w !"jiW!ILu]IeX 7*h91AEwU~rV۬{B42KVꌿjY1 Zq/',"&ME cqT +"lܢcw:dJ(l;m49߄.κC/]sfm` fOKgT<My4A̰$ r$k YDuL4uDPҭD^5q4*A@a,Tx+4 | %i8"Z>MlDV $7f@Y׺UIbǘϦx~?K< Z~/sACbIDʗE7EY BI'tNު&] @׼//YĐqs(ziT/'_wJ[EB<Μ'QlvIZ#:1 3A{7üq'8nЙC&:I~LpkzJ15⿣m. 1~}ƀ0ZQ #qx7-e*jIHf9Dn@`h 7H }D@DK"sr^_EERݡe;CT9Gl5w})(6]7jPa(5q'[%F5~VUuL!$ C ycp!u4@a U%yd1΢BKt,q)0$D/pRl:B2`mp]?,AK@ռQ.)E'.!JMs,({g8NiΕagAah5E2q(urQ,7/3q1EA3XԱFr,4l 9MO3!I7#x,2a__e BϐU%(IŃO 8ׂ+-EZULr.륡Oj JS aC٧y#p W|^nPcbi5}1'u4V qӔt$ga@w+}4lYu9DTeҼиY$.@touX~-/}q!> DEeI`WOo@6l:HPS|ni<@=q*vo qseȁזuAN4,Q*̒%.Y^Vr4óDʷ> !B "A]-4(5f1vQ0_i9yRQI1$M~ =}G SL);avlO''s-wC)Þ\Dѩ`54:4[YD3U!9}N8~?a-8 Dtjk5܉6C.]K* 1hE>3hӐذ\yCnJFhl?-\&urZCH?2Y Nɕ raT@Di#byZy};f #X8dI)x~)|"<8<*"3.H 5{P֮^=Y: XD^ u-9VSs'/gB pcAJϯX݌5c (DOF7lvfhtV6M4)+\?$ݰ# tP)ϖ+qITء6P;)* 6libN%Tͮ;:OօW~rCVAKdG {FYTI[ ۰s]Uk7u߀'Gkkl -[Wat\/I}1#Z%ɻ&(yjԓ@kmjZ2Iȭ#.~㫳5,fT!SNP,Y@@䅆I4󛢆(,( Y2KJ%JZ( ,Aז|'cɁ5qDWO)..H -08,zl һ*9?mI1&>2懻"(XҀ 2r/PF3Jw6%ve|oU@CvӨ"$ JqWP[ʅ谬bu,tX2G|GRN %|LejtGuj0SP9ᩄ罛O\)xLOc4aWI{Ŗ$d]P1yz5ylK"3!]c/ark4D+F`0W2Ocd ́LZN٤D~吚a 9ek)OSm$𫉮 9_s̙c2Z&C  (Y=ɕ͌NP)G}ɪV`\:M"#~r4K#g9+!STɻʾɪrӻK OrvIт_21zr0{pj&aԦtB\HQ'wv3Z"!Jqjr`4Xɷ[⁼~\b^}x"D H! Y~ <[qN1V` x8¤C7b]B1щ9pƣg܅-a'O`:5Gw4~݁ Ht: icN@Ű!/>HTxh,T~G'P=Ɇ;şqs@(9ǸS3hӟ2OC{/Fx4C)9 Σ/VKӃ(\XkhվzjS"+8`퓳$})}M4@DKn5mi͝p#U$H0?XnqD3ʱGyO _a@qPAQInZü4j)`KU3v+V?ų70!Wf- ^ "OVz`:2Ŝ%k%kf(Z_#c0G9ɝjFuPvr]:re󷋻hW]pZm4lZ3.}CtP2NѾR+sHx%*pu vanZy*aj* k}HX"]ggsKw . i"]'5U#'~ޞ9ߚUӛ\[DC :qn5|*c$u*OdN˒շd Ag^qP]ҺWG'CXN qg$7 nJ I4p\|7I>1=G"ebHgFzͭD4660 b_)`cg7:sW#fC&aU(oęB@L!)zUhjZ[z5TʈvI~i/X |h-QXtJQm") .;C"k oYP(#Ub3=.SԾ I3䁯N`NWx"/ t,UvϪi?2{ЄfSz/@jX9ː&ok(c*GG4,8b u$;}5Ti&‰9A;=Otv5B:ӵ+lHi޼&B`X'$cRY;Zqj(Cg.QB@2{)^5vR)jbK9r 3vcZ.{\+`CV516JHdN/^ o/DtfTuX[c\Na;8tߧyL+xTl t?ʂ7S'7L||ZFp-c"0tA`Qɞٗyp1c l# Fd ls2Sȃwd sm ]{}V[(2/ lQWW$̮ȋ DbV.Ìu*`&i}hZFv<%UasJ<5S>+;7vsF(,} q;5,J$v:r'nn4'Dߣӆ= ִU?x`.$O[Ke$S&;F)0EW|k+c"px?Mx-xkG/yȗGO?JuNW5+OKIRO|EcJm@>. 5A5C+ό{2AP2<8wf*T| ;|?_M!H  mC(Jʬ006TLHqDd4C_/[ ԓ8T2Г(ai>Iw $=U\5O{WT 4иռEa-b[tY|ó6Њs h # Vg=cDQ0֞˯[rY$Kd򧗉$Q+t1Ԑ.쨿;I:8F T֎,,FT Eq+fcT2vov l6(89t=S5h8'PDwfas*6 # n¿_c?vUJ|!uڎƒ ֑E"`(0!Qp$c*vJ* #D"ߨGX̼r?㉟Bm=DhfI2vDJ^4QceST̥~#K&dz٠G$ԋ`I&OjUXx%@cT kRfEFCiUrNa. @2g썰1Tg,8ߤ;#Nu˺}gqu#Re҄oclJ5$Ekr}gWJÆGCse-fEMt-auEje]Q  t[0%3؟4ɾ *hkZcOTa 0"B2]M?j;k՟QS2bԐX!<2X6~XC+^ LGeI f1!}D/X}͐+"u`"kyw82_ 3jUkfǞ utC&VR(Cṙb?*4d>5*%-Y5"9oYO!|@NK)}k~݋B+1Lw?Y2Fq߬DPY.86BjlZ4q8m0%onEH p̀GwE b@Vu尙& b90PJz碘N%p1@[TJm,JK^!}uYTs4=-/1J Ug摃}5j!*h@. ,L]"fnmc 9~%&j,CWR%K6QnSi.Y3؆)* dCgy=Rwave/data/noisywave.rda0000644000176200001440000016020512377701075015000 0ustar liggesusers,]e@Tk;veiv.Q T;b ]`X(a`"|4 oO˽93sΙS<<$$%VJ1q1)1yo߳{?PQ(7qydPFօ]C҂5ǛP~k&{`0fX&#~_Liş_:zx-[-jF^W^K:p <\ e&-:6eEά݌rA@|{UiGh3RSwBsR0.m(!qRuǿ==̰f41s=^s-~?vqTPGj~_:)G?L}9jmcOY{.{iOdGn;w{#4R9d{*YH)[1'UW䯤pzKTU- ^\qs=(=zgj[z=5 :d]29mwo ]Ձc33i~[@y(n>j.~sAhjս(`;njAP72~7Hݲ5jMR# А֋ J tprʄؒ?:D }4Lx|q'q~>EU٤IͼY4eKwIY@UbIqOB˾8B/lߍv&T \lH8%7HzxO#HŜLIIҰ# MVî#d-G'9I ~+zfUb?;5AAGhQiw}QMG#nedc~Rn_yUg^@#;*M!AM 6_u~܍!X=wΒT MWAa{¯P]i*fn3g*GuY^AZs6i\LMܘ$ >2dO2Yg+\7̏Y_Po8BԮ,Gד\])NձnXZL sl}ނLi60zdoRs5-\@ O69H}>HČoGu9(M޷SdF-Q7>-)תp=jwirc5ӷ(F=~bO.rflDq*i9gvٵ 0~ĔZgwbt'+{j3Ft6+IZoO}/1wob{##׬ZF~k~Mږx^Ou׫w o:7]GHٗu)xN-ҾNI!YTi&`ef\=)3w[ÓjixzU'w\qaiIȟTחQ9(~aƷ~PıTݕ٨8T%ĎмvOk+I n2m_ =Ɔ\A*48|ۧp"{L;=ϥO,Js /֒?K[o'=*}]TY5 ;؅vS-rƮlT]κ*zʯ]~(#`_+pA:zWf>U~x 5Z\dc7&"'ogq}Tjw^k P;RMGvԍKcw[|j8WL֞O{M?U?`(cۓ7FU:/!^|_%oLB =SEq,9MW\ekGCT=+[ZC u,H%OO)'@s͢8).(Iގ濇+Svs @.^Y6]c>^ 3fV/#{pf_Oph./}'p˄'=.J1RR=Kժ8SUgył_ą3Aay<0?4k7{h5~8'rQ/qu#h͓4q jl }pơpR>>_^n֒vՉT{0qܤj^vv@`_ &K&k]9G:kǗl+N5WvT# &UGw,3-Y&1 Wy2xM.~SOz7ZZNVO;]%8מ BqRPr`G(2|0C[ϔV (^u"+̮a!k{UeB=Wތ2đ޵hj(;ހz9*!CjsQ˴:&EН RР"zV']r/ R<ڃcnBw#P!]Q3] /j Bg4 *~Y_gWԶX>u8Or 0XNJ~}>䧃{I]U9޸Zg4櫁ΆAwo{0t IЏw8,S= 3ߗ֙L^53"v8=V "oQS} ~*f7w9}Ԯbvka+uUci0X&߈ aq!ЋO&}j 0>8:!^U7j'U".:f{Ի'gOO9~Kug_z~ِΑN_z4b')eݫ!!ꑿ`hQ PUdJm{r5'y*euPFPxb?v7Ea۟ԣgK^Rel;xԷ)1Z?ӡlk$8/:jb3;\h$*Yybx'tķ/JHu,|e&UyvUnKdZԌ/۴O2@eQToMC,uiؤ?m귓+^:B3IMcgG_*"Ե7HhDE gSI*gqգ W]w`Ң+㹬$`~rCGSdL6ү.̍ ͺ@M;BQz7|2Tߟxp)ʎ!|IA*[" IR_̦c^TC҉~Q58O KQcxq̧DX͠Yc,er7$ge~~XpAL ixRGp?>g\>Iz͞ 3f7RFֻѷ/(m #HF?|dT9ܾFTh>SnzJR"JwL"ON*C?ߍQ+Q1uERydij={J&?YzPrl-*cNqn4P%1r48]_,L_HI(StZ ""#&[yV+g5;NDXDnsjKqU S&& 5k'/QBËNbV^PS/u]x"yjLr;.jnI-ώ"{!{t֝ϭ4{\d^ǝU,Iۨa>ru6{AAȆqۦr/ gτ+mzcM7|*XVPǧT& VPsa+޻30>L+Nz ]|mJ&%nt)R`we(׿ZC.׋pD84V{Mf s?5r!2?*s{˦=yogOr QTY1V\&o0}Yۣ^@2y| $<31g?pa8H[.Q# &ǯ9ibw6ϵsQ]Qf .;I5[Eey r[A5jNQ5:I*[ꖴ B@ⴷ0/c es8\xrD,vT; ⱛ/ Dim)z~~W9ToǙjK5gL%N^Gݞm:H $|+*Eq&}B򍠱8;:( Mt# 59>/vPsdK hp45}us-SZ6z [!{358#h3lv#A<_.7Q# b>MJڋ:H4CgB 2ʤTiQUGA5|uQ91Tz NpQc ه%e^[ƞd( %36ǎ̕c_kψ-D55!'Ռ3=D0ZRJEOTqtԘZeE9Ԙ FQ#E*j}0*_QCUa)L[s+a5rffB]=ݫO%GPKʝhh?z 5[V{c%=|~kN‼n6|`tw|` y2`eiIhAp:!8gv3ºFg^3?(|& f(mޫ ouˑs8~SH\20js,-W ;գ|տc+g|6K]% a|җ5rk {HT; ,o]QI]:6e=# Ͻ]/AB_@~Z\G9ݫP. suS,n L}Gxvw St7Z3&!u,dr?n4%7ޗDۛHʨdE_X~6vೕ~=[UX_0# _$ozǦ$ykV;-NԾw;#m. >MW[דܠO3ICK6º`OC}qT[$2fQaOےzum @C}ϋ oTw.Op ~$^сmHON >MBC'l`]sPwN_rGض}~x6Ȝq\ {Wn ҦuA9*hw?H9)Tu kqh[jGMh0bOyT rb0U5yf 5wpbc vSԁTY_R-}=fݔ3I0:$餞,7 52c3obTG;ө'ڧ5Q/.Ѐx%'{acZp=Tܴ,a~b| r:wǤܼcj۸󙆠ő5VO@wu@Z|X|B:N}(Ta<bhzGzw| /w7qd *C`>][pn}/OOLL&0J_Y<a󟤂7E6iMm 6uJC:6h9XF<Y1Ǡ. 7^[_@K Ԛ6 F[-u+G,kzTSsD*3Be䔍(n} :2G;tZڊjۘ<Lo[*yLF5ӽEK.+QKuTWjo:u"귘IϛhP;a> 8{a't~ݞRȞohg_lKFCކ Q'PpϬhlٜ=>3N7|]xʆwF#_[4ʐ*NZb9 )Az>6kƿyi/g_[=V#/~ŹQg̸ IFInO]m܄SKj~looԄ,#jϮZWBu鄊,֥5]PfaGKgb-yERtfḗOIY)yqd@}r%AC/SWX|-IAAG3M^oU&P=g<*:fN:ޟjlb|SnTX?PGωɭOz;eoJߺ53O(7"{vPUBޣ2tg;i:rql|(),;|"L][x*<#t ;R~`LYx(35R$(74$JU]!sT6OH=69(Qqd#7QT->~oE!C& Ku?YuU U=-='E7LSqYXMu%n{0qDQ:纁e0R B\Aaˠr0P 6Sfi  ?Ӂ-_¡ Goes5mJ¢lay' sEwAA:|{p@S x#cE8Mah¾߽ V,4Eaz?l y3EP74cmN*Gnl[ i3]{4(ț#Ý<+b.g0M*\ ɪxoKZy7g<lV:(Hg}IO}"Z>Z*X)lteS>$}IֻS7}AN;lcϮqm#}ek7&DJ~-T_R#sI4{"/GyL NnjAzTw;)A6ݖ  F%,P:o K^yŲޓ5ƃ r9LXnde얖 T{vQaxS?M ϊ*>'iSœcAY /.CUrHD+oInIk|Ey(宛Hc {F+(F&|p'ʹ ̇ȦY*w'Y5j~HʶMok@COQ}'/w =yG/Gn =@Yqs7X"O_Z+Ac&cQfHvW;榢tIw)Rw5ꏦӳrݢ}D#'+xqnOyhv:#nF]GM!ƻ%l\># m0(w%-Um f.$wCy۱jQ]zHPR]P A ŝukkQ:=E[ IkOȒ |@ЭKW>1A&~<ݧŐNwl2xptX8ȑ*̀#t }aTh~iǂo& LjW6pUtEyvT֑KVųb#,@AdZ+58nePINr ?P?e84/LmLΜ:઩d.>ڂSsm@ew@ڒϠdU͋%`@lß??0qN0CtuwW%uCF+'&nm2xQ?"Vw% Y- ޽q`']}ohmcq)< 8" ^' SfY \mX#A9м{/i_AY>?g C7 =`O2=TtZԛ_iKZiK? $ oX%)lO(.iYH}5I̙/Љs"g.Ŷ$%LtߔJׯ@:7ԛk~oO@Y1їɠ}9è 18c(KDz5yeIi7~r{A1yYhX/d&]6C2иY|C@aUGȠWds}?52OPL ؀Iqv"O.AEq9ǷFPDXQ(❣O'ޟ])I{0o&mWG N!}l2(F5Y_Dg[I2ݖeIG*3&U<a 0Sǐ>E'xKrO\z7C(W2Zw x%$w1?@I4r:ff?t~YܨOQ<{jG JׄϩH6jX停9SWV&PQϜɢE6SQ7GI7l^P:y&)0QάL:W@=b%櫄\yD/UQGXt6)UeD9¬*jJZ#5 CECܛPrr(T(vaEb{B^=dAd4ޡ`ɍtob~klŃU*S執n#@zڦT_jVH8S>?WrsweٓAN1wccdq>RZYAM?AwcH>=Iz׵QX}f&40/f'w3`Kխ@osez}s7? tV2.FzL7tͰx?J9+Uu:/[AS3W~ylwy8nqY\M[t}*=wlZw񡚯 ?[snIU3ixcTq wAq[E_`W(.u2 %o enMV],t;GwĒH|y{S%_֎7njcL?Of'/ 7=B{OkQvk~4*g52G&N~gtAh<^ 4 D@&uflGcBA݇o$&8Hy_Y=qh>#hߘ4j`f^)E>,aCcǣ~ϚD^y臆K^W+Ou{ 79VCV{[jZroTCvj-̲>a0M=KDqw_G 5O;p8- * |r y'|SPs[f-NSu7MM.Mn2&q 37 ݻޯ$z$8|#|q6a3z@MCGnh0t"b:)_=3 ҮCw ²nz+b 0-AW/ylA3$Oѹ~nRٵ@ç%`ͬMvөSzٙ [(({m[{%:i流5oè el|{7Rm!OUǽZTǤ~!͘(%T5FW@M÷ 5zmT?)S]{;U}-rۆtU9 հqr 7fƓᥠ:٪cyAj@]Xjm݉9r_=^~|$l1qqXGsضIf, l7n,=ja3Ljuf~ꔨ׆`iiK~I+]/^|+6ه׀ij)xz`&gRU.Ŋe˳b{0fOA߽n{_jU#8wTy0><]{ fֶ-n|]ԚI;AwNߡMK@_˹=A4V74ү-%Z[0KhJڙ~xejLTEySbɃ:Ԡ Eݝ䁆 {"S+qﬨ^A2J/g;>Pja~:fK<+iyQFKtl<\e~Fn41[7|-ryNNpA+i.j8OTBqbg|4~-&{84 ]e -v.;M}m5[=GNBiFLD͘g8sp8!z# )t0~V5o5o,=)k#\<@Z4<9-&zťzcZ/Uh1BPQm{,'-dA)D%Kg4rL'O~Bum,t]1x&-D@ӽK&Gڹ-}PF>kMxV{22sQw%MbgÄuj5H"|SɄ(k([_%?n"Vɽ@l隿zgOTg3[eHJs4G9`]x'h>4.+Ae򗋱߲z; MtJVSo?_ax LVOp`3؊߮ `3Ɖm!0"l{0} V3ml+ڽ:=I*G߁`sk9Vh&e0,"oO˩8Mݽ`a>+y =- f/ErܻIz`pD$cT`l0Y2~D0[ʋ`;bڊ+`eه/-o7h :Sx ?^a;k@&R'p~98o顴^2q4JLM)0 8>Ƿ}͏z>؋.P?ΙMlgUr1Tp(v72ضP֋u(yHIַ4QyQ@ϋ!W[FMS=VE65kEz ]mEdҠ5w]|5fKnk ໖ cP{ܝf[`mԱh|9XXΩACG-7)򿔊<B4șE [AJh:\= Ѩ}hԦ8؜ʏ'y"h[cw_p'Ի+D5WCװ>_^Y[ʱc ? oP!$B}) %FS`I+sѸ\S c\\3&_P0&$t*pl~ɮstV ?(Nrx8<{Eځ7QGz̈ Pz'9Q'4QOD!k2Wܞ:[(ί!n#% PVW} |w'y?I5۞H]TKwITk :h5l) d3l:m*4!X_> A4p:Wƃ#/V}`XVփQ!6 0D0zr=t{sMV^Ou=5 ]ӕFF7>Z&g`^):*zJ_XCXKtOqrIZI`d\w^n*-  V1s >S*s$r#W=h˝\GNWTӻ ZՋ/Qn"]/ Uۆ3reHGZGLҡ>TuAvTɪeN!(e8Լ vNr6:(g3[:JtA >g2FU;umXrGhad/fAOQIXFVj&7=+k EWv QsmC,VٛiDTҰ.jQYV/6_@_fqݓ "SX EpZ8T):"KuhvF o؏#E]g2b :^urA7`3 hrا [[5 QW1VAC[ߧ<)Cޟ|G;pgD<?|FG!71!zy_3HŌ>؃\~ȭ#KQk#7wͰo{*[)#8?#{px xQoCnf#=aAeⱙpB J4XT[7zfC^:|S@TؿZp`EgJC+TWʍ?|Pپ(PZ%q|W0h[4Ҷ6[:Bn/Tp#8%y+>q~~д+]@*y҄iFOt &?W.I` _dIs%%/L|=fkEQrc0KV)]o3A -̪h90~v|<ީ I_fD<3\%Gs~mȧ`;`tt35̣iT`#m#uVNOw^e?Q&{azZŒ=roqB}qT9=^MuдAjB.jd; 2trQ #Pݓ/ׁ#nB㭠?#px9F{:膯*]^4'rO5;NI Vs3y5wBj9v4)4^W #iF+tse 0DӋ`Ć]W}6[#׽48YfX9a* )b[AG؇6A@g,94+Cq#p(xz'h] A3Ag~azp`|$p:4Ee??Q{u8mÑ[A2ͅ.-D /AQˬeTE ~rEF^gElz nt*)eFUMZe߇4jr 5)K;n &>zZȆQF(sNQ}r:Y2tW?tEVwܑ5sw6*SV1}TdܯyPgC6!Qk&U: ܗF9:7$ Ԋy=c4(|ir~˗!i)% u?ic+jy컻 5) ouNoGfuMZ* B~Ia9ڙ(A@^ћJ ZFp496Z: r_Fhe{^ w$?7Cߴ:D>ȱ|U4ӺMM:ͬђŴlL*Fx}F}0i,_>U׌XtEMȩQɈ /Cg*cO Lr57Ugt2d#DsA'}+=x8J2VaCLF ~n&(k ̛V-r1׀ԃ*"L8P)  h4ETMZЛXcYn@ߖqN{>&g7M.Y0zidI& ,W'^<2^Mԙf .;;^Z#Z kSUqv`)6,o?|Q /nK^U0 (8- ,E$I´y ɑYl ?+w_-%=l hJOe{S@6\<^nިc9)hۖNm/KDIvu~;haVOc5[@ 6f,9 R2حvۀW»#ȢU 3 <.w8NzL;ޝ"߿V% NdHS"vdDxVSM㠟̯k[et fm,NG̦ƓR(nL/4h-<\A.v ԡ˄Qhpq;ṁ-xzEZIq(HUKx#ꟈ+ZuG׮_k/T(zu\DU0)Ѩu:k"4,ձ{j7'U_B#<Ӕ}#b+0r}YHL}u<1B{!jGhF 5c6fGԘipxԼ\m'TO]Ft}sOP3Pߣj7c܆r03}ڌAq=- 9 Xzr *#1-~^=Tz$?umGaïL(@!7# KwT=G ,ϲTSAP_ܪ#AM-w6U!9&\p C`tT''tJjgRA _<%Mrc}j>TP\SiwPl0[4(eڌ-__gLXU΁Q~}P3,AiyD~'q/c-z.(nh_q1:ВD(dwtvFc=vDRg+'g=t/% sU)ڑ?fmH|AixjpYe43dPauf [~#PuҬ^6eO& j&/f< f W3_ Bv'5"8TuS TS}8 *kG'lX$Id^&nQb ^uzL+uIyc}P,* Ⲵ`HߏySUo2'^ ,limA𤲗U'@{\/]wsRcKdI9=ݟ+N%SK mC;ߺ\ aQ]S^DomW'Y}ʁ(sArMh1m^=9-2GY[esFk_gg# h~_~!$Fh5y @} o;Lul]h1Elkէ+[xhbGY]V]чUGk}4Q-r.\4Xh_ٿ? m xV[+o^*!oxxñߠiehӫ)|sB]MOe_)_G^뽁d腩( wѶfQs?ϻ2 -+zN%DND y˝V"kbŝ *ӃE76PxxSI3~ޥIZuՊC GG"1_;`W_4՚das2^(qKP?nWthMX~9h}. 4? g% }nk AEؕN~zGu& ٥ s7ès[KUٮriICn|cW*E.)MkFwV)=Ɯ?63s\*Fp5t.Y8PL?mlu yCۊvIPF" )hlGȵ`42j|2M_ľA iY^hswooW`?^2^4K@ȵj#osZy MT+&HN:Ϯm/]" ~BOzW}_ D ۍF'/U2#{$EU1I2w@rKd{Q}~;>jCaaȌ`|xA߲ Ƅy@`}y݊=/@}Mo7.MAk, zsXe_YgO.Lf!F4&ф `Ch.dž@fF "-T>y4 I{kM`G? ?7^&- @97NBV.^.*s]K,<&FGKFD]@ٽmUQyg9(#XpPX9#{G#4@Q n&lNo{Omz #-k?\Zg6Jd[nt5꼬 ަ,crX |gBe?Q%*}31&[bBT ܩ&L=׵YއZ{| #h,R^Ѥ։ Y[+nEv%WA--&FYѽkxMlxntyd^_#g#Iߨ}N$YWxm\DŢ:ZuBsHլGK}q4 ыTHN-YEHσGR pfW7ANTO4KWlq6Mk]6J&Z{ԒEa$'WS uB`(G&>-ã^eܝNz2-LYF 4 Z?~KUKmH?sH1Xc٬)-@lSփ][ $]7:?t tvv6g{zq4p"{Akk\鉱A(!㝚a}xnO=O`z,qm#t>K^"^>!PmAmȗLs-3WQ}d5ku]mZ&'9X|5yPETH']=-xT0(  Zv)d 2 , U@9-ֵڮ(3vԐϴ@67*]ӛ؃"pb?T &6 YGv[wKTGbO vnLF]?Ivo7-#gQ4$K<#gЂTCr6 ^I~@*ѥw-n ,҅@6C(>ޥSMtD!(&򼽺3Ezɏ@[{k~LY bѸK*Ayjp&C!2'JGhHҹyv=:lv*;93 ]Q~26u@[X_vzmҗa]t?r$h;TY_wWv)g^o|g7Ѩ~vh oAd݋nCcQIg|Jhj\'e74H9 M/VRhnm4=&-3ܧ ݫ Uh(&-kbOs1 MxǬHe.h66@8 o4wT,N)-ft=#Y94_@2QP-mG8IF>g^U*`xSIicԨwDws=Emfr~1,3SXyʉ&MC3'}É;ٽ''n 3L۟/̃'vyǴl`#Af'z\DPZ@uνG@n m⎣^%o +) 7mX J$Y.{ UCOЊ+8O}$ßrK]gnو%}}Swq˂ |F#f_ƒ n2i{Uw5hT7'E~]ű=`%f`THM0h3zrxkTQ`ASPxn:s>7`+iE{-Y7_`'p7kށƔɷ}sZX}e Fj5 {O '0% U_ \RNUG{I6F_D+FZMN& QM@ɛ ? UIvBؚ׊l_ P̮{Pem?X\tGP1G_h2yS\bBėʏ%Z-*xpiCAlQFyPy;Qq:z`Ρ< \zX*u$>jHy jx Z)Kݒ6BN*uo[8o 鄹Q_ơk~Gމ<Ve*4T(BeL{EK/-#XtxeOVLȩDm\t4u=2 o3>¸.)r0OaϥaNԚMۡ#ȧ^;P䳨Ys_8mn0UT'Y_$A-kePkNy"T 0u鴭/F&M)Νtѓ4~C=;>>H%K~f_}PY&I}z&W*j/ 7!| s,9i5LuڦtϤd fmTVt:,?$wQ lZn .MT5K_uJ`2XD}&澃li\Pt|8}*̮*w(y|eAhqA}C靓@v~oAi~#r(XnA1v'Ad$H TýP2VkMt7#]s}dC_TN)Q5Nׇ\R%^Ö\+ґKӠGBS{*Z{S{\q[7P#iCAq V\`4T2ER[ qj6󍀵~bW<ӓC:78 *8/Ot* Zf:Aq+W@R\`ݧmkb/٨X8;Ah?c(\gsjj(ӧ^Qm^w:*#,%]Yզ٩X QMq/-#ɴU꺧0q=.(+}$VMzna5 gnQR3TMFUGoUBReR=I2HqZ*sn ϐDc/AҪ4^ۋ,Ĩ }$+"5"jҷ_rt6ih!ե Ze)^\_AAqD9սf2} Ҧ; 1:RjnQ6#]}u1.?H;Ry!yQQ*((6\TEnVȢw;I?V3PehwQJғPy\Hc=2dL j>Tet(S=؁JCXF /&>cjK$/܄wBv_\Rqޠz7z+oC.G 45rkḾ4)x4<'hZ%MNN^a䏜׮ GN}lQ=lP~+8S䣧2eMFMnY撞S/ȓog-BIOF媣C7[3}?iN[_L} ooD;9i~`U`ђQH}665֐L[ō!Tl3SQijEeK}u 2ͧŗ ?yk _+PzR8p̶ݥB8r2#UV Qi`</1~Ƒ)RԷYW kT,Y|2ǭ&SI[$n6ǜ4M3oK0^<6R({WE0Let P\Yc W%y hn"}u.+:YLj:l 6pNfA+icK=h}jp\0mpvfXPZ9ag dhg0.$ .i: j {CHz2/1 ]R! YsQ$Rd馚Q%k1_*g3Z?j8lm+Vp^=if$r(/D_Go0Ciͳ;#jΡm#-C5y[!;3C09xD͝4=9<`u֍|g3{?Р^/cae\2T n]w~GOFڴ@y\|'<>h EYi 0nї(hϯ]|4|lx}~*KErzQSA^Vym}9w4(Ckbp44tˠRb)G˚?3:-rPf(f}bASԢ:$i@ Rod^i#7@WG}ׇ6 Q)—2vPrӕojFNA>}, K"5]]+Hlņ $%b:[N'81j\3kd4aNMz!s*3]B蒨_>Wgʤj赥IvՑIDд3jRt*EtF5(PCQ~QĠr0%ԯWBSB-N"#%wPB)whW~Ls7衔%(ٟDoä.K#]5  => `/D51Or$jSmlBu׋pcyæJV9bLZosgY,Z⒝(82=֞j~[C1Y:nQ#| WLMi+߷eT<~{E@u VD= 6o95zρ:wm冿.}hגRaV- Rh,m1hm?[1^|^`.97USONS  X<}֟A׏OTK兜{@OK7Cq+Qێ(S[@ m>kL}`H u\kK[F?m z"ݦl8)NgDc~+ol\y*ĵ=MFkiԀ̀~~YXafȿE@wz'ACJmPoKJO-$p*Hi0j|+T.3%ޥ*RE>TqҾ);9FT[Fw<΅TΚ 62) ވ<QK 2 P1@M/0-t0;p:r0<>d1{PqPL.lupkR|ϗ(1tO՞N>Nؤχ[kW1"nZ_<{kVqdf=mgxhE6I1}.&2#! Ѵ.:~k"-#vm{ IP-_-r;?dM3I`y3 A|h϶RPhkϧ q-Hl-԰ m̢Z= 5X] o>3\ܘ02ZWwhW'y>' +R6V0#iWoT y}mi\T4<71YJNV%" Zw&i}U9g",6yCOE@iQiVWPÏ#Q%ᑣ/{ud伮 *KҋCPst mx^7jQ=]lyn hѷ,DC=_ PpE-dH"N[h/nF>-F{^DUFRfA.=ya!;cN4Y"yE pnaۿhT4w6>&/,hNj߭l OlCS\4e NXqȯw 5%8/8FOwd4?vm, <ԟsiy5RWQoȷF~2h1ы6Qy?,k,IAMgs2P9bQņ᳣:&=&# 0L% ~+*16R^I{qTʋG&ytR )dtXT*@YlxO=lFDOO L|d'H1ѩ~mC:^5댦% ўgFOm ۻg 3 p1}lPeg_i ~nn?-^/rX ? F̌c]Dzl˜J?[xzzA>‘0+9nh={nyAb Ws}#W`}PY=~yt%&if];M`̴N`uA/S9f^e-ZE5s 'mhF+ >c4^,9 _ׯ  d{:pBl[NfZZ)pJݹV'(0ߠaf nT8zP a\{3jwc,ȩ>ԏ9*ъٞ?5i`q(;QPc:I[om"bE=IQ?2Y}?Ґtb]RQ@ӶĎHy+2P>gIU㇄b"\{#\HEylR"?E;9I#Twt=T P&5FuEʎmEP._p,)tJZZv+މjKwԫ@F1?F֗^M+=dc珨GS݇9j 3PY''rBFQͅP,{DNHkVjX*98HҎӼ"ꉱzP!I.؄%NtP XX#+L!v>&4r/e*dpnz;~0̡fEu C!e)ϡ-&Q (pwZeX|k;-i T;$3ɠѲkܸ J3'ZFqjaV1S6_wCK_ -oq_1C49#onn(Ej/w<,yҽٻh]}N. 1/3Ҟ3Q E=/+ r΢D_Ǡ w2GCK]&=̾5()v$y`1~34_ ']~,- n{ڐ#+q酨 t= [zDa 70ZF+A+S 86먥)n6SCƯl}[ ol3 ~"\;LxM+~EHu>Ƨ; =`n}d]>Ӈ;$dH_g}O,&6 08~fK/0TU+_vvUVf߻o,s=C8~cT!V`ݒ{X;n~e%c+fjzrL=bK@i=w@aVg 3x 24 #_ Tpc*.Z_E7<(GMuWA0ߤ轲ih0 tFҿ+=&}mp4s4KF9{zm8ˠՆUX?QE,dndMf:IfVrmt$|F"K.?MP˒ e8~C'.gOO+z1Kحvi tϙmϠF{KH_9NJGw38]D|=oZI('f윭Q104a\P8N QF#w Q2zʉ4edU(7?N#6i༺ i^]p g6B)Mdu 1>y|3[/ׁqnUg9s 'Tņ-nSܵCN U>]jxȾі맠Ea r@/¬%ٍZ5B]s^ԇUtzGvQ?IݻP{,A8jOurEԖeQOW'p 3wDTQhcyt&Ă~O"a:7wn<j"2E^ v.|p1] 9<6*#_#NIlQvif;iJ6 ,Ɋ3i`RgaB: /A">GQ`Of}| >x9oLF g=G}FU(*mZta(|_rm_e\cΜvP>U `֠-ol-EgI,&5*9dGY;("goza3;Frژ}:q9M_d3"Aϣ-"먾V'2e7rxNi>AZ+lxX:x`&˭o^cکq^؅:L~Dm Fc7j΢ס8m+ Y=WmQs^0JƼqw`1!N~,70:sfN_T⟙X(ߜ"^ҢQS}28:8v>#]Ìo*60dx'2 mP g&\x|#f:U=Ҕp 6c#'UTDr40{o'ޞZy)eYTiWv4텫A+yC)-Af$T[]@+wieUP;!D<wQlʛ\_wMbhR wwO4J y7ײ`,siLmgd{DEy. k;AJٯ*j+ISAsgW!5&caxb\ z;R M @OO5ayTOSy=HYYoA[줍.6^#A([@/>MSHۿ~۩\^]VsS/Gz/@h_es}fGK+*^m3$6"Fb# 񎓯kij 3UG͹ H lmy v:yOD0;k#77u v;'{W;Y|}~g*i9ڙ٨`M @}Ύ.(KBfΕ_U*jVIi5` ]HEk6AuFW'ڼLT@Z@Obcq~5hB<)YQKӧvo5uXTmƩcfb&VQ1c(؊bb'vyTDlELPcou]oa}Cg*SVi~U)+ݞVVd^Z懞?S,n//?cp)`{7dj ;WǾxEĶS͇Ief*m{)|E2vG39)A9l(eTo CO]fI XQ Ͽ,_/ .EqY_~7,G:4߶/{K9'snXzG+V` |8\Bv`wG]0Y1'oK\Xv,xf"W 0^Z!2(\E+f=S9 L]S'X$Hy@}eS5jL}"w8`ދ'[(2-1&5X^V@8kߢtDzA_@fbW$34īw.!\^9 yeDžMheoi@׸h 4՗n$ %ozs+8Nlb<8- N!0{HsbA@p A`ʶ'B_ʘ:qnkskcuziqSsY;wu"5ОrزͧEFjCy@['|&KsPu˲qi J@qb 윌N}I[<Ex c3t>lɈClֵT^A.Spjc|R^ v09Zsˬ+:VE˅(AVqyY.MqBhiCgvywE&V4>!`cQ٪b/TZa_L|LԾ\t) Te7T:m:#>_C{ v SO oAWys#_V.@eZݦ]@wPP7uQQn>ci(X(+M (=ӱ﮽(\(j2mX5Ifh_1fqB9CS֡DJs Qi6[/BQ6>;^4*zfi';- nC~35ÛvCЦBa|8w4Uן-yXv!|0F- g "xwLI'&kfnjƁCb0M/./u+9KRD #ۻ ώ(0 Ux4I_?|aV5[t,~=JY`u 0o.; Ǻ[]ۗ-qF5y'gEWFMb[ p i2mpI0xX*$%>%Sð܉-?0o:8M:RP+TՁnouxwpuӬ3Y)Nx>8۩]'b]Ϗ~Rp~dVr }TڮD ׮rŠ;h >4t1়| @B.|P> 9pQܯ*-w[1hyz?`mFaeRo%XOO_R6SvͬLn{Ni,ƙdm5ABCeY_F{/'6n"[4ɠ*;/QdsӠhqa~rٹ1WJl3B޲Dt_34jgY}Q;z~Rk4uA̎_a'W|Dׇ&ۣۤg5/{Oˢ@b0@x/Qqً~On^n5.]n> WFsl[{ϣք;MyG@3v;':^nۛ5h.jHj:Pa6=):>tt풅&^ K3 i~SP49MsT.ʉU_1kۜ&v&gf`5M l~h2k޷G䜭KArZ/Ӄau ݢWC v᙮O~wl`n@ėۣoi̟eEq[63)E桏 ed6Y !,6?ʱWzA-;V<$ϖDS[2{uѽ#lfSuԠV8Ie+Ș-n|@\wa넟lags";<Qu5E3ZSakΝ@=|4J?~8p)'_y?w߀舋$EX2m߸O)ڶSA.ZG1`jf:mqE?yĴ}j<-"6޹| ӹCOOZ.!_N t4^ZȰ1g&vTv9쏞i\MVd[;q n}%6ǬI:wm$::?v"c] p:-j>N䙇?HlQ6!uj@C?&5sP5cu=oN IPڭ1T|6r~`ӹˤg4ysuFn&^sxh3ѹ Yzw[K/-YͨL}6roO"{p9:CхM/b) 26Fd"{6-/5oqvm :[۲x1Y/ٳ)m,S0ilsidfobbQۄ檫g eUysZ/x}dXnpϲbI۷PѢS4eGzx} 98QXFh&$qרاLr:f. 77Ym˶tN B#~ M9ϳV6Q"{yD 6B`qWn7eJ[gk1EgLaw^l$󼮚-qmֿZ:Ic,3;S(ot Sd*@e=Xno&0Eځ1L﫢̞!_/g[fC”|#a[)Suy+̠>2E+3{2UVҙr4%gInMu"Pu}-?W^> vyDY땾A^MAI֨*l^ѶI&*?'o|tY ck_g-2E*ǣI7֢vΣfUR_tMvE 5ϹS_ ؤ] ;$ u8_Fz;\GWObHLyO>(3TuCȅ"ɴ ԞLQ 0V=yί^'وa~)?M5r6DSGD'发[,w5WFOS"-ooTF0Tڵ%kj:7HAm{zoD'P9QY_Ƚe5{N#*fk_}Zy|fn)\ 7ۚ׼Lx/6(toʹE[@?M-1 `3sUKZW7BZONз9&/otQ+ v>>oP꜕׸i0&u~<¤QO$Qy9u|4|^jvͧ^PYݚy 8Zd1*R*:m5iԡs5پ. U[u =OʿoV ;īk^X-hUW'Lc]:b??z~~Mxyڢjkg@u+3Ǒ`-HZ .i|>HNy ϤQ=FDE}^h7 AejLB ?Xwy) $X5hNs@c1WIlK^(W.x}cTzPՊʚ6\EekhE'GBHzO29v]^Ž;kʇ(18偣Q'_"X V6\C@Ũ>L&?E\O}]5L~WTc=Jz][QFݑQS8(W*gcAGVvG䌄Y{+PX8<:(+Qɛ(!_/Bi#&'C3 6uV m;u8Vu[lOpe-h9uf1ly}FØ%_HA"iظk꼒~lv 哳{\WQpX)ja mHSقVLy^gѵ?ZԎ/WZ2{z_m±$, s̮'>;^&Ɍ=}:\{lZPg$-^vse2k~zhp$/>Vȴ(JMp*yL. xi_Q*(6^?p@`H01ijKz/8w43շ; 'F_` f~?3E?Cs)ӸƘ.y9L)#VvmǾeS&7c75@_PՎ?]duD}c 0E/D[]}~=Kona'>\=7Ob}ޮ^'MDM'fƠ`#A{IGGDfYd =(=Nbt{Yoz/}/jOЭv՘"t7u-=9CdM< GJC_uPםbQczxkQ;@]EK}G<hwE8$Cy Ő{TQ]Z&!(jbvǟ)Lb[~nR6lcױ㶳?\lD=W93NY/J&-.;'㮕6; ]{lD4i$!lޅ$*drKwCܸj-iφ3E;)j>0x4!E19۵4vDdry^dg\pqNe5`{ a[U!{Ea?{dB]<{.H]NRsug@7nRkp(~)TdwУ3Ps I5l>#OnQL5} ͭ`p96Y옗 NzeMP罉`KnD HY':H¼glN}9!J^ |,6̈́Ŏ$|\QKyo}5NRVE zQ3%~u"<#]2灡iiP g3t n_\=.$8+w ʉoOrSګcToH9??mDI ΕSJKE6gֽLط-o ^)<[u1"8SYh-y)ڐ ttցj6FFy8(V$^0&pm{' F$w5۸j9Zd ʔns 3ճ?[UF?[$(mlC6nD{,z7s2$N]Z8;W."FB^|gYX㺻^~i`-joQ.,pL㮋\=MPn-G"?U4"Rn|1"]=9r ~jOC.ؑe| ( suF`E(Jqgz[ Э>~MGQ0vE4JǝWWА3}}{#'vLh#CCP2mzћfDAxrSpXG1DI 6]J8 <{#߷xwz]^y F|Qr =_B}XʐCDuw]fd"לfIGyb^OA *y^0ڞ:usYN[¢(cmZL9hgK9h[cğ1L3mabC߃l_bO6qNwk`Wdh–/ ]#ZZۃ)U}3A<78tqPӝ6pd` fD'}n[A B Pu_PST/Yf*D%@[nOAd(<4]\^x0!d +'ZRZ|%@>gu<|]]?pQnÔAq 4 IgisT{ #3AeJNʠiה`R8]:sX 0-v$ϤA':ߔc~~˻#k0m񹓾=vW~^}ohG6ikwxwmSCy%"?We w6!Ǘ9|h2e7?B`n!0isG Tˇ-F@w_}?wAMK@s7uu!x efO17}H_vK;4Uߙ@/i.iZ|W myi^8#ǫ i}|!ƒ1\16v(*-9Hы+h{*ǵ4v*[-y|~j6=8|PߺMtzj} ^y 7i6z twMt͈ծ}nNEvx ƢZr]PmXia0FE`"[b_I>׹B;6ͼ!#6K>cO=؍Mkfgi593&WO>.&ӹk# 8zzl}<WLWw=>9um7ڣ߉_1@Vf?*} ujnk=gG(Ò_WREOOOn5w,F֋ggs}涿p !ި.>%%\{=5:;S*s0M#ZXpo!6?Zq4/? ( q"3ؒ-f^$ׯn":zg:ÖQUQ.[tgY!o9zW,`Fs@7gӠ$zaz|ƝWmAO]/=bЛ:t;O9۞j9lQPH74͘?3f$FH*NM<.ի-do:wcH'B&tn];ܝHCQ|J^֎{.p:kփ!͝MXK໠N{=hKd><7$^zhcr݉.Z@AgqK[P>+P HOP=8yHLuKgj_v֩1y_G&*#*w٤j[#EaRL[Қx,s:1?WVl("e+TV'^v~M9o{‘m;|]pyւʶ+ E_+v vf%н |u{"3E)zb#ؠlCG*$A$6%W6d; [F987t7Q!/Gma󨶱)*ϭKwi|Xt-Uz]3xѐewkbAԩ+ѥ֟IyWQ+eϘeIoz0| ҈0=|ez1=tp2<@/618m KȵLhsc9!=bk(;~-|;^0fTpOwu80>YWU=T6X䃁eq!lߞa~.$6>L?2VXjox:h*,w.Hc1P_H\lŶ~?][M{r-;3В<'5PȔ#Sr @ 5 "qVno'^)Y|3v,uTm>Rhm p>J03utM=A1)j1?xP+ {߫A>d& .4yHS CJva6kʡw-'CQ#@bLb|F:[ո1S>K@_"Pzc pP|}Q / z>:iĈv d-iS}&hW+^g߀o?Ѫ?}pi0a|0_[.Sm KoA@Jkf7 qׯMJۭ@RBpArl@؟@څbԭ!?bv|6Xi'LbWE܋AUa`6SzLeOD`Q\|heâ-HXOtgNK'%hhێ(z8Gߎ;xb 4G}+ZڎԠR0dt Mаjphy1իѻlMo=4z$} O@NAлѧr WܚX Q=Wo޹˩:q=) +Cn\4 Zזrۚ{i[4Im9wp \!fx^3L֤ĢwC%W!9IE|ήtڮ;*>Q8c_kQym EukbMm {F 7&Mo@ ;Emxנed35t.\I6 [k{i?,[p<6jց׍!u̸&y{3˂(> iimj2`ٖs{@x~+@n8*//7~-~@3yK,?'^pu0[9fDb.ɥdEӑ Gu3 Lֶi( /_AMrbp6ՠMoHоmS eN#˷[:p9^tqRR[A.9/a/TK9MA6ϱrzMup<3(eIpyxLŦQ4oyF@3,r ù[JAg2A`g1>T֬;SsʘCflfM.od1 E͚_46ޛ 0ɫyFr V|u93^`f5"Y[=5avl)_ 2 ],-Ӳa43+ ct w`*x5[L=z&C)LI;o@|;[ٝŜ=>0EW/ihpn_we2[R$8w [%R>Y2L6E(#7IwK0wp'O`j΍ֆzN:[|a<91GwG*GAeGɉG{MGNNPh'ݟ)(J"e'ݥ`?Њ[ӊ F(ޛM8 #"CفS8e[Pdσe(/e5o+%7-N?Ea36iתn tGTx"ӭPy⠰6{B6Rn-:xZ#ŒF7;yno'!;eͥ5ۖ˜ hEr&G9t8BݿƔ֥_N^E;-rh?[+ڍ؂⾪u:C6AyxQFS_ʭg=6;^:-xJD+޿Eb>(}?r b0nn!mu\f1Q6C7g*|KٙKgP]rynZ4bq It$e˞hvyÂ-){tSm440>ܹN}Y(\=pd+]WT܎_ν1FFTl";׻kThwy'7Eqh7 @ͿG9pYl"*|=q܄^kP q^ {q4ZJ@ Le?€Sn67FӚ4sqADd_aڌ0F~TL.S<ћS>GC`6i2{_/8<X#C ;\/ǖt 4? ;1FδɏϠy&r58-=t(h08u%NK>*NrRy" V}roֶ`'wj%W*^/粄)::.<'DEKɲNp}2xH\ 'Vj̆ݗA%kl']Iԭl\}Mi$Ü4W:M'8g#Xyn\0I'`2)XS/ۘ[]y̤ҧ'=rPo*7YRZ?`JY.9ݙ箳gH27U~j]z šcȳe#Σ$ܼ62C|¸zmB[bhDB>Ƀ*:Nd"wDEy9#]QzV%yY؋9FǫNWQ@M?43PoP1:w⍨ !e8]9/Gq"ZiV F/Wk@Eu?)u =u=ynhքMwh~}gW⑗fz-@׹ N.:ģۏߝG9٥Q?W| VC}PbLhѧ[ Ұszf0b쥧fŎ}{҉rvDS+ 8"+9Ř2^w<[`C@~E\UΛ{ܷ/;4[ׁlMVxdD;kA}`&1P@0&M\j~UI7'@NЍ"wA̓cࡡ|TC>r$8\|jJ&.Bu A!-Gn*YsπUq`OctO x=_H]_ߓw# X!.o|\Q>&xA 6fIs.OQYP> d^y6X5vJ4ؒA8(;JmgR[Y<~a{Ru|Ky vlbS8=lR=Ջ3EǿLZ47Gm?{oP3yM, O9I~p4*9TZ޻Z-[/_E~(P=o)hCu(I @ ?1e*"RBiCBљ9k| D:(Ym$6ÌעbܕbѩBQ|ůB9ڎ>&=ؚC#ݹ~se}hFz&'>`IdO D}9^z.벢;pf㞥rXvJ) 4gCSJ@sE=4d^ϗNb-<ޡx()m׋c>k]0@'SBkfpYGA@w} @{[Hh2h'\{?dԷ/nT |8$#חfH0P^XܥxG%K(7mOov%[\lA(\Fr;p5sR[~ϗɟL3旬֟~[a؄s)\;vZ&0o39blhu4S}Y.s5SM}l c~/2$+/!qUۧ<fz9X`@My`u`A<؍SIDpB9j71gT <\V3]|tm\:>p/}o8Nz4.L\9]IkGs[r nvݰ>ڄvEMzY+>6Iēʤ@Req]=8 qh@1gPTY|߰$B\rWk?5ELXkesԔ+V(~2-^~]$[(119"[|ږOʊr[uAk'ܹ:AK>XԎKQ=P^G0P7t [ԉ2>ww.q7~넗<$ߖ=: u zmSB{AV4]mmF4YY^)>OME[O}C;76W[}/\==={t"Ԡ[1=rmwH5z|n,)$y`Ğ[!sI4zpz'AFnm ݫy]W/hMDڟSauNN{rZQ#Aؐ1d6TSCQCfQ'YShs;hAb3NBfK~ EnL/փ JbF30[`h;/~Md4~W$ A} ?1P%q?p8|j\T+5]kcvׂt[o c$(/<4wPWߗ /28| )7),ץ|>8 l, J . :Iy8w9AX{G)43KjhAsAnV/L\|@CxH}Y'^\㎹r/7Q [|Q&8Uw.i5H.^~axS@R}vA@\l./|%HX qX#@b{ܪyW }hDYL휈+,ŠhZwl(eJC.Z0CR˘ܤ#Ѻٴo zyՌzw0?|]5$/cvBGkJ59`j?}HXikf\v`ܩg`>uH֫_)LV7^oq՗]Su֔}8QR얿UúLT0LBxo0O/SC76[;){-Uvt.ƱD>`͔Ʊm)ϋe_ES?iYgQl;vkFұE=BpͯuQ:ֻS/Z]t _wf) :Cf{ON<E鹓nB䙚[Q65rT $N^h̷9ۨ5ƅX%cq< |eLq*j'8z yC]װm_r>KQ}XB 햗wږًuDּ^?0Bչ~D{ 1m)QĎMDE?>C=\#hK(WxTon(ΒH'w=C듚.@!_CQ3"E- ?_l=7oXzEJz}^OM4ФI~6h39OG+Yb4]܉–H4tsN6[9dbS6dqJGgr =.+R#Η l͢&=gX;_GZb2_b2MSpXGm #6:f<–_cj[mu35W+wkz0ik-Nfjۮ@&fc3FU'+}~nbjHK`>%L4i6Oue;{R;A2wb|9\)LOSv`'W逩nɽyYfs|n+Ž LΊYS70k+u4pÃIjѵ SW'@'&b11Ew~M`jSA+Kl6}MɞJTڅ-fbUެ/ɾXp<«- K8Ē5&jSJ+ K>6C;ӵ-tfg se7fgc٬1%7%eXr5hK'BB&/.0ij0Kzu0KyL@1Cx?,z;Υ`K|Ax$X[ :r[$NsLz į$D.+0b>Le9*cǀu.}e6caF !tN=sgf hX\.h7ԭUE9{8߁ R~>dYTʏ|, Mb͗q+/G`ykx5rkEC> YΔI5Sj &a@-#꼘/υ)ꟃ~kO?&wƍ7i~Zx"0HXLِi1GK ndOS 9fZ3_{~J99L&I{r)K0Cw{6~|PHh|j331 7%<+6߿lD ŭ]腦mS%[G-@~b66t<.ƺv;ŶN$'wj'OsF"ڠv9\''QkLsePY"Y%*u* EEP@;1Gi7[QTFE'MOƠv tۖAh+w_<=fKmwkTE8 (ˣ)Jg+;:xS[igԚ'+T< uI-Ot}u7*?^ :" DwGDE"FQ)tGI`1E`Gr' =i.Bys(,Vw%JK-.~^2r>EIXfؼ\' y8ʛ8-6}7즇Aևr_W^g Y#3#~Űa@M>s&R|C~7#<a;H=mW@cb/ hwɐ]C~֟0̢mGt-_ >,+L{әk 4V At5?LР^,|4( ,CBE{f`jemSFM@4/M'Gʾf T\/~rvݼ8Le熰%v6ʾnv&;E^}WaJNL'`l:י \W,d4Мm' iǾ_x.'2}gu(4?ľ!-5pd+4MU]ZroWQE"p}g<&oLPV{&h^*$hZKsh|lt: _OUӨ ƒ&[d˷EsZn^7ۄBggV"b&hbXa 3(GMmlurPH˜J4J4wYhdDsTBso؂0 o)=~exUjw73ψ5ggFrZWw4,Z]Ԉf|m02gfM}D ?(>M^S9~E{wBk#*C /eHsp*:߆Aaֽ"&5~/^8Rwave/data/purwave.rda0000644000176200001440000014021212377701075014441 0ustar liggesusers<]u@TkFE;0P[t @nAPP1؉ tݰ ['6@ywSݳ;<|kՒVsBO_~|AEѻF}gC=3Au ذmqE1~ı3b}f]LNv7vtw .ŵ18CL," Ms}ٮ%~6["cRz1m6QGQYXf;]ﶭP>?-Kۭ̀v[1xe馥pȜ2 P\VAş/l5H߬<d71IYsSO*/'+zx9WO/fc̛cvcg~M<1wS_:g 53nAigAՖ9>R7j@\T^/{}hM-ĴSS/~|)vO,/Yk]δAkf^Deoz#u!4 6w_h1l vo;2ίm>vF~>SQERfg$|},qer<4&Wf;*$5U/ZgZ%҂,bT@*T]^w3 jΆSMgqɯg-~6pEނwxG7&T`swP/ǁcgxmALִh<|[*}i }(.#}7;;kdV5GӉXv]_R>2P>0%qX=v1wf˥vu^Po̺{=ѡ V_ӬUS[_ 13aYFr>P"j/+e^\:5 /d"'|Jy 9se(w>uw輚{+レeУ~wWM0Z8*Z^* 'OƼ-c-L--? k:~Z>F<3K3/júļ'4dž UQs$lKS!eҳf#Y xujC9TT+sɏŴ- 'f~;\^7O{~Yt%ޙ,BOZX\:p i_#p3u2GGs㐙ayX7w<^/wO)Fek.݃ B }qo|5l,̾{ewwig,Jԭ= #Zʏ6.i}KmAz~PPv8p;P^Cy!o`Zkcûc_ݮJn@=Z茻#3iۉU^!c1km'(lP6"R{foZ/`}/ S^avjy}& U?]'RRqfkk#V/:H_ߖ5|2z"s+%2˘ؗO!H _-ڢKqQt^#] NaV9 v,¯<Ы!~^TS)COL-m$GCY}{< rtfA:.@9uzg n̬nQ*k<^?ĉFI@mZ` \xd=Z;_\t?< :Ag܆KƿՈ/_9sbтea~moWbYۋå*!(w=J{S>E_5=Ԟ]iW|dy{/ğKÌs!MǐJ|@Ոu5ɫP6肟[(x G}q,1b2C$]^I}juLxE^|4rvG@U&]bXTc]PT3G@To?7flfއOM seiTŒl9a trǖ@%? %<' ZRNl^>ۡ0VNHz|D-Zq5r-7>nH NDH(ÖV(]4v*|ۯA2!<~=EG\[Ud6IA:yؿvRx/*-Lw;ߟ6Dquw˙Q`{0mڄz)60Ǐ'R0 Zl[rG(_vK+\?0.~?le{]^:`XZ|f`nN< b #+_ng}pLt\߾4恩x;<<]Vw8 R7[XBMi+ וf`Ն(uǒMՍrVۚz!D5H'ϧLlѧn-is\i67?Tv*.t#;o?]q5ۆ,'e[KÔ &翌Wm~}/=ĺBL{쪅šksbN/vOc@6#QATP:X[ZRÁ>9^\f}o\|x>Ii͂; ڟEPnJs:vZ;H,xe4~HRg{cFGvQ^%cEb-QrphtE;oQJ_jsp8ݍS~:_ Nsrge6 }Hͷ?YT/8[1+?ǓX"/9Z5OUπA]ݮLsނSO<DmyAY%izMfsѰŜ߀a wnu'SR/w͓@u ^>\XvT<S& 捳Bin[@ߣC̼nu<ƘX_7f>÷,K͜s8bqcuݗ&(hYܾRV~=y#3qy׷<d}]/L3z =tIbuLVP+au@;FcɠU iԵ*svhM Rn:H2PU/9@MA"~В4Pݾ[17WNIE3_y5f`:u:?n P'w9(y9 dl>+@2\Pzi¡C}1Ҳ۷-Eo)@?rۼv[d\Q)N0*'mwԻz{1b۟~gWu@&`Rwe N!װRBMFF]~-ߢK⻣x$WW'0)/}RW=V!G3 }UGʠ}O鳡e{{ 3Wvs ɝjv7zY;< ?C}L=!½@_"{q*+AqBUww2cQ6@eVi(Owrt1O'rhBC)1:fMgxHtԼYK;ˁL̛eUƎ,0zлK|z[GL:: |T۰m=X67Do dqn|gAD+t?S5+7} s>L0z^9U\g k7[ s:'W_pǞuV3fvd8hc fgTGQ>H8*/w4rʶ%mbX7icUzON߀>`}[_AKyW n& ֧ٞPNgUvc^wpd$8{5ryԈȬx0s縗cԗ͂=[ՏDQzB,9aZ̼s?zlW[vo2$~mѝǡsPsxmP}6 ]W |\THMU++/r/jBR"`=p}%|4PλҶ 9էoL(>aȿ5mWrhͿ<{R0`M0cV3K@4C!+D} 1E嗾_EzzmZ!0TBH*2i]C&oo\oăH; 6 5FmA(~glEB KuPˮbfr^еj\vsZLQ~:4omNKf+\G? +OAU8ǬU"]rr( gϏ]'σ]}0mgtXnX%E.l5mL:s2&mDjټasB3.dkMqB&?[j42󛎯YxW>iBe)wOP$XzP!,:zӊ c:t=GYKk7̩;dzbk%N[awE f\{ItP,Υ\yofPbػwWPvɖ17Pɏu#=HLwl״6նW#e(Ǫ>>!5$FKvJƕV= + !v9:L1ƒksWlle-=aHi+ʑ&Nu*s$ٹ~w5S Lbgg0i[i Lwi՚y1Ɵ@Zaڢ@t ?Tf~w$}#jfX:u+)KJ:n3,:5ZpgbIھe9dn5 &2 )NQ {|ѹ W5eojAlOB7  ZTm^| ~.(] U'i>qvJJ6dz\<&~hP*Kh~C2U?~j??>8%ζ.S #V6{9/0e{ڽ.n4?1EWlmeQmST@-AΏފ=(8d NHK?\39,v Kik޸t+d 9Uj]mJ1^k2 \o;$"qŐ뗚epc?]{Wy404\ <14qu0\>k=pcV;&6ixZE8 yUb2 ο?<ȣ]Ѷώ,3}8h7$vه ?=R%˷JɦJIl-K .{ȳ⪡'Vl792Qq巐mt`d'NX ^Rø-_ea (#c]bGw_ȷc#{!lF vWLf< &GA!TY}|u^iɾKt|[0/Zflշv AGp{U?IOPId?&[7b!sRHlu8!d˻O0J!_?~mE;Zy>wm6:d1RFo9iO' !ss#ȶ 'ٖ{>XNEO&"}Ef$kzVH|kEeÆ:iKDa _쇀!m˯Pdw&\:*rc-/q 3nƐwgAiEC#:ms: KO) wϦ7'"VYgcYlxrelzЁCFʀvgm Ð Tߒ4ѵv-zePT2>սOk1wA,\QY+w@u[r:eQP zn-d6$v`d{P>"!|31PQA`Jx V_"53f-W:a喫C}UrP'`a(Pp{1 <YE2yele6@;n#Z}Ёod?U.Z4Y6KW k\)54y/%|? 2_߻2]io2z_ֺS g,H3+8M^G}uDٿjnQYW1+x\Ji#} zBtM+K>) iqnN.R'[}Q^~Sh6CH/&kn$cFK7בzz\<%wݔ5g `M7}UL4O$: !siffn %mѶ]ޗyy7eIQ0`bȐ!Fn{XTzfˏPO۪-7pAy襛R檎["zLgcȎ=mGd仺o2I'iszp,9mP~}@h;PBb ȊT7l$3L#<߱} oި^ &m8%COr A53iQ(Vǵ?i+֖/L `gOǸxت\5+ҭ@L*m|w0X~aRFt nxaUf$N c)K-Vt kH~* "(RI`gdj]4ބy'Gd]aq82Μ%6^@ehSrQ扻Po_L,Vw/摲O=&N5f0^n#SĴys~cptA(=oW"D}osyc_ obn00䯟le=v2pL},>Dž*;M{\{sxs*wɧ ;*oKCCC|1HySyNj31.DﻔGpc˯M ϙs7{3 "L9!pi2C_os %3:FgsºL%7JX9:Q&a̓ o$XI90qŗ-g9pC5HygVإ m# *]1_ A};8t=TC#~wvd`Bn?sX;L1?(*oE;^ÀWqTE'~@q)MVg.?|A!}ʶZcz Zҹ?' (z{t&t)Tlr3)w6)^!儿5&d _CEZH_-;3sET6=V:ʚΘ3rab_QLp".q*?:R5Ě 1l}(gٶp?Z}ؾ}|t^`mhk-&q9ӰW@cx: (O_yzdHu҄ŽA%ؘ 96F01E<_͐Zy~MSx~O۾~GEe"q}:iuO k[Y$2MuFwÉ!g1# *:ވ5/| c.'Hտ~g{5mjYEkrBAa(j]p8Wlc]Nϝ'ћS~Ok~xkU뀎I-'2վAN3+<;P~Pح۪ٛ!zĀ:x6kZ&]q٘51yݬL,5:?_ˊXS e=TH s*diXlρǦuj߇~g*xGڞȜzHR~6u'4eD> s<`'cpN׏KqJFO@^7GT(u]uYٔ(pdx$X'"Sg-p!寸eG 7Pi7nAhO@\ "0I73ڔ^xolBTfSZW #'s&EC9$@iٝN k<>&X5!,ԛv7oVZCJvP.lmW0-ҬYoq' gsdOZ~\c't={G!*_>"%rfEV/Xk 2sS:$ 9|9"ӽn]vه>CsPMuFT]=( QvV]qyJ{> ;{uNmFdztd^Qc"ճ(o}58z' Ka^I @ߒ:ZY6Ą6.go2e-_X驣/)؃es`2`ME4fFWDr}HEacT!2%sePCyD\x^sV=%}327?lq6X)XS}tTQHXnGD\3|hd{ӎɑ>\!}RԖ/P흌(:Te{ 1r1K?@y{si=@nMk:A9f|C"ڎ5]u%}]ENhTZסot Rd4yGy8%PT?شkv,+*; C;>xU Ȓ[n,7}NFF/w&BGEςLPmXd[_@pq=/ 4Pd;78,n?{Nnz|L݈T/(AŚS_jCzbE|CpDQXv;ѥA7%s(#4} ?=2 dA;Jб]쒾֥-myu6~NFy. <(ݜ_AhP4+d:T,,h)|{a2<94 5h7zzP|peoٝP|͐j׻2 ߷ulާ7!Ah4#22;Lȑ˗<a9;AՅMyza!Qm))w(FG[iub/da7lX&?>z ac>*7Jj7Bo }CdedoEFӑ<\TT>Xkw{#ϣX"ѩ2f8׋@kG !YnA7Rfj 4)6 qx~UV$7ik`!ГcVrqZk1Ԝ=TuP,H͋YF9#|t6B,'{cdbYI.{w*AlqM\=:CV)c|dwϑ@4g&ThUuT}/^'*8;o z$ vK 6A/'B*:=&9H,zp*J:^G"M=>m>3__9vyH9Ç鸳P:Jfuwbh+}~Pd]_~0=;LNT\y:7s8uлPT#HO UĐVdC|fKhTu[ #$Kss7D,9LA&ûVmoK';qLS1xxXK*ϕ7DCmbàǺͫ5 ռz)OfюC~؇ wG\] "EYU RH\ϝ|h|9{GM9J*u(?{gHpdn+3aC6DU+sɡ YuA)o(z\ z%$Rb9Oy#¿N-5n4Bߧcw 97 @MձYL guD`B550=u~vå\u<>ȓ=:Gc޶x;!KUm0M`Fma)6*1x"3*} Ǹ5B<5jH:Kz|25ri}?A`Q3etuc?m@&[XH3Y0†-bI8A y 8AI}Ao J#;.sOm0Pr[kPu`]t 0m<vw^F)}2on 2~xr.ܾ'D[{&l k;a/rlj^/ZA۩<72>ug@K.9\U~nT+,|q "/7 vQyȿԬy ViKt:4ݽ' e|# m#3` Ľ{s}Hs9op(Ґ=DArݠ-AUÝ'Q[r!'&{}E&_P_o ߊmLY=b΅X$P$p G%/,8Lu*N]8is.mܹQ4+N ~.E%%qq~OaU@>eX!_=@u|?B/UBق~@|j&AB XԪ}qxi}7:o=wR A5Q2q(iw l?_$j< odgoЃQtTa >\ME۟85;)xUJ -iӞ"Cc,tӼysr- ׁeZSN_ʼRRʆk`Fc83׾ i@x ڣ*Pve:Q8._G0d&,{á[5fvå%Y6GClr>n5R ǂ) |9U .1+{Xک:Թǝ|geq#}[ !8F kMaTY'x+ku4C=Svr?_;DVr-X|K}9t:F{O =poӝPc,< (}STjms u+ˎ*K57nVSXIrGR c m?x%d sW7)x? TS/H*Ogۢw;?CZ_gIzE Eխ8 |Mzty#FN9~~oia+kQ1^P]2NB Xn9#U^j3G"W_2 ]ȻB<^ߨHsZwc=CT@:o J ߷}a;)7~+Oo6OE3#Gk;˥AŗC@=} qn@[KP(%}FʓBQy @oN\L +j`1U 0z 9@}i^QYUJ볎? Ц: K n ƣJɠjCVBDsj\\I=D=r + >,ƒ> ? /'Cm"1ܛ=-r\LR1E门Ocl \Sv"`Iٺ0\<Yų-Ra>ybfBps)l˿VaVG3+O&qA7wsul-N!uHEnȬ<߻BUx]:= U4OACgjkuAco_HcP!'E3'` sFg-x9@o2J\yU7Cbk=xbѻ@ E\~;=+>Hy;T\\<Tl<3&龠H U<*ޑh'˳g ^dJp(^~S1 fYQ$\p5ktz<:bЃ:WNcClQuV՟@-;.+)*g/f!s3fr-s5tŽsb{f,16څS |y45db* |%m|\2=j e Iۤ,9_1I39W[lݾg? Tvy71Cy]8|PE<U?Zb?BYptNBb]碽 gfq*0sWkXi1V=ÿz#>UA0L2< 'l޻~4ȸ_U7Fyg7L7Qn!Ed#~Bg.PZcro,&Tk:W!TdV"0ҽ1YDymzݭsMT=lVi]/@kJ-̐5Ro]_IYׇr'|TqJ1?TG*^4X^nm nnH|;_v] 0d]>@=ssfn,nm)A(n%$ TrId]w=A GnF ¶^PeΫIQ?ḐbN[`}1vCN;/ ; A:(淝CNY-5\(UDbYqcq> 'Z|oS}OCArzG:i\f2S*c5UB v=#OOArJPcr휃%?F8~2V5UcUS%ySLmQԌX9zs~|}Em .vujkʺpx8Ls5')TIT:2X0OpfsR] *zA^ÏwnN\6 {l+LXq[E\Q8hF۲e0*K#MX{#KU9Qyެt?v&g*8-߇F:$.]TswYזQX!W̗վq|0#nB t8UF&}٘Kݬ@M~16`B>'L+ק]eAbeY4nI#ƵPM1,rz9D"xz|Y<31 , z:_&XGtTtԸA ᅓjC7QV*BtF&Gʎ>QC1,kl}<$ P yW-2r6s四%ڹ ZE|@/ܳE5=[Mdk@Hxy0Pmܽkc 06ç.|.2AU}7>j/pPӪOUJ;0~Wc E㲈 <:;Ds 2"CϨHQӃHAd/o^dlb͛Ys?oq~e\ᎮOz@Q(ȹP5:gv5#@--w- f\hrׄ*rlZLPIf$~`{ s)x#+P7 $%oM8IBv1iĐ \GxiLr/| C?.Ã'>E;1*3rALP%qTiP\=o5->b[AG3bU1Ƽǒ+eNbN??(iFo?bG*TH<@͐V\@y7:7%*?3PTޛ_dfAOn]O[Lr#􊏘ۃ/d1DM!2<e3 ^$|{i.(x=rU=\]]oz AEh:]Oaot{g<\1Q1uF <1Zl\.0KrxV.qhvV_PmoZ3xN{?q~kc7$$*zZ ., 0;+tMߋXFX4~$6iEu%@Q=Q!v/\=YEaQ/(_v N xAgi  <΅vlAL :vď~ѧ j~m(Pb=cqP|"^ x1ɾ~".7 %D\L:(h;!!V^h1 R6-yǚ}|Pa}T.zQ:WoۘYǼF^v@ųE^ ˶Bow{Qn4y'Ps;_A.U`>F[YA-@Qs,`6{g>[5Bk6A;Bn!u`1lbcT raVOJ Q97dE +QØj5VS$qCUGؑvԪQ?%G.X> oNeA0οW,vծ!_--AfyF>R$oP|%R#("4,'-$T~+cл\*8ݣ5uu/E=:67Bx9a䦢EEnrrAXEXXg-[1m伉ZdųiH6fE5#>PYydn ;5ӿH>D41i-@=̂zŇF=إOݷٙ#lq/PzӿKGHqcӱf1Ј >:a%:I[ e5œ6ٱӎA>?^m˗syou +[3 |%'gM }eQ=0#Ea Ĭ_2#ǚ}-~ ߥ6*n\0" P Ei~٠ˢb&O :a ݖr@?ABC,.w Dlꀫ0Ƽ 9X{[#/6B%aUzB*]ڥaU#6?d~~?tܽ F籚ہ|YFl/_7DpupA3 69*Լo%eu!Y\z07 yfi}DP5.ZлB"NJ2gFVu7uA/mU< 6܄/d5tTJJ嫐ԨzQ=@)5iqxN+*Tا.O:1[H0p/q&@`@M |*4~jt!R w [uEy7Q=oQHڵ jeolµWHTHwer鉉2Q§3XWg=mNEXܓ @AD𓇲]OW, O^Ǧ=uɮF\auM"2Jkڡo?3 ՗|P%+20GW5yAT>@"ǪX,1lIEj&&$K|;-T-wLy[/rBzq]Zרtu5;{ܹ&' ehpǬ8("3`?z/j/~12ȓ(Q3Q #dXdUĵnTODQ}oTL}mȭH=%QQg~y9 Po&.iwFx?@ 2e v]!OAVb0 A> a9qÚNcg'F%6A6X4j1C5.Ձz[=DzT }P;7ա]6r~kYUt~qQivmt 'liJ)iȀZFI40ildir!5@}c~3C_т)2l+̷!$\ @yAיx 9w'f-yńVD:(_6֩#&v#׫D^p÷N후jq.Ѣ*s,ST-/B/~VmXDǮ`"sE{f͆t_;$d wPv8Qhf*Sv_c' {c=WJ˾ۉ@ W`yvN-`5^5WIXwzܘ ^d*]21Un|@T/A>'?kC֡*̽e6+FòMS 3'yL'y$$>vxۢPI̽=@ۋtꃰ';0r3}uBuL @@VU~\4Ⱦ/D>,OdÑ>q{~!8% Jt+A2COJ9`/|x=o)9&2c(bw~'? F=>™Oog0ۏ% @4CdAϷ~'xfGCu1/@uHtЭPDbd[5=-n-Pʯكg5bwbB OؐCv"0 5&Gǀ B;Cij?L͠&9S_(x*T0h.hʹU2zI+s6۠lVt)T"L"vb՟یټm$3PW7^M^?սIJNMw1BvrȮ?P(M˱r!V",d10i_!hm Ej8%(mbvv|*NwƧڳm&ls3A5T2|vR-Y6wAm5LK!]^{g?'cRHȥWқRU:_5Cچ"˯h1:O6?RSl ˁ9xeEӃ'a>m1nܞ7\h ^|Û͋l "RΏWqxBP;=lU+cFpxoeA2zQq\ MigS} eO5?}d"!0qwpFUTE~ +25BߘZ$P*<"7o, -ft/Bs=ş4]Б p,@ڤ}6Jz[qemv^tCgy7x}{5#[8դ7m)uCITנ+D4X=ɦϋCK?=q|9E~p*f+M#u/ҕEi- 486Ũg;`FFw(Ao2"ٓZO̓|@K×דȅy9E?z eSyR:OP=pM5PJ+ӓeU_,$Ӆ0Voם +~bFݔʗP#j1 AE@AMcf@}{ʐM7(t;͗zZ@ ,}^ NGB3o"XކXMTN߶[x&PwR'𴡙NXM-Xʡ=Fl,'գDػڶ S6=4A?$O/kә-GχWρ~_ 3 gjV|*RZ5?WQ p[S?,43Jw>`[PAɍF dtP|-&Α@7]ny]P-:}DHЬ%-\\J1ttVhKz݇͛rS]N̐ʖWL+1 zu~, ~ro/oJAe\@F ό+I`a94مW=c'+|ћl{P]g^u1#|l+TSMіE#1FcA{ٜ̿ dPD|-pW|{rݷgEWV_2,pCsg:Rp|@Bȇ,B䘂#8yf-z[xt{kҽpd=(@r"p[>W{!y~wl:3mȢ2` gpQ-uls)PKx|̝\|0:P'BԑTk\ Ir"Ɛ@ w~:yRHzZKEVJ,G<랆J!!ceEQ#9am}Nu~xKȼi#=>P~b*m{go! O-, !ׂҋ:_*;Ac8kXwe\Vztik`_* V3rD׷+u0R܈ƫ>A;Lil]"Vb1RFm5:xƨ||at\oxzhdJAg_ .=ag8D6^v00(1bUQÎzaFs4w/vo . o#p4~:iBkG Y-*A!.b\wHXUg΄<^6]ɅX:߾Tϖ^G, m5 ޸bP'}bJjq?9I$1a|ZJ~x/d\x9*FjuF'OG1,2)ɠLF )vq "'oA=DZί}ibqOx`@4 1\;U/ZI@OO%W==,<|FfEUqUPԼ!]m? +rŸ/x^t ;Xܜtq 1p?uybAqŃw淢]#Q~/ FK>횞+Py+YĆq';ݞaNnX 7]w/ Ȩo~.v0uqP/ E<4mFh*A߷ۗQ@ };-S5 !s>qຎOSXfxFTqiդHt BNSjxV_^Z"oo.ѪVB쎏əd"vSھs6%n&([` X@%h*CׄW5ߌ-} vF :ePJj+ 0p _jx-7Dr h~9.L߆oϢjtÉ-*QӍ)mQSwͨ!ȒDZ )O&DXLOjWt;)kYU)GX{OQY1.Pv}_^~uIe힃RGnj@_U!/Mc:gJ+P2ԔPy_Lv|-Q=I_i,j?=TwEÑ~b-\aXY𕌱nTxB-䋈P%Tάk&~b@"h Ўi4^=?4߃퇦tbt(md-&'?/z>]y_hQ7`ux9N>e3KXZp8]]j[چ5/4C)o¦ݘNl}{2̎^y1-t]~}׷5Y)=znmZbjFvp0gzQgf /+5uhO.={1ue;c ;# #N*NYaǻͯ7棖fF\#-"ĥt +{j̵}O@y2 TGzfj8Z`g/(0WV׷sE>h|#? *a_0aP8˙ x[̎+ytxf0Z nJ_Xh0i&b5}Pʑ7%9rLP-Je"sr??;RcUO+@7/ k\ I,\~t:P!u5ɠްKJ(gO8>.o s3PO3n (7 &6^PXnQhk) â1ޣ C%i?)AF{zoF[P#T0XdjaL2Y<(b6,׭s>(ڊ `2W_Ӭ 4zPA{~1ܯ:Z7&UE(<t~P7Bŷw:cэY5'P\/? Q w Y}{<qD}OHm)?o9Sok]B,:a\ }5L{ŝӼqH:P?:p`umA۱}ut:fz +(=5(k4A ?&W0:yd'OQ#?7ReL^@dZ׳-MŨ!AKT9P  y? +f;5q u;o}AuaX P. x;&WASh~,=Hts\Z1̮ _~D;r+3zbnaYcWFACJcsUv;/8'*PlI+FͩQBYqi{؄2~Lз.iv,|)Ao+- O\s#.F/ ^C@) A3/m@e i8jHXȌ2;r^O)9d=ʹr!#3qBG{v uջ v) r~O5&""JT%++ q$]T+AW/o$.c|Ni&:?]m*={Ag!4&TmI]P&|Pݾ?y(lK Ķ 1+o!}5}Au :ijr5y|&;+"[rVERnĬ+:eg6}q^,׸Z5mG@M?AJcx.m 4=z-Yj>P&!otm>MF1Wube>}AFO^9xV> ֪oQŨ۲LLX<—61|gò3 K"{|Pɔlɷ1W5X hϊ$ dUh da.6^01,ml37} FMZɶ'P qTEŸ{nԳX3X]&Ln /8H?|Ai} &`x"ƹeǁv!\\]sP&6=ۀ)6rq FjTUt2xs=X67)B 韇*FsdgiZ'D%XQk6?GztGz]Rރ1Jʝ"P6(BL{F{>vk5' %]+ 7+q "D8L;d/NمӰi钃P:|\ĨeNŜip~Ud@OK\Rё`9S- CS7 =O؅J]SDPVmPE9MZҞj ?h]t$5`av(z<-3lWTƟy<<^'.#-]ce=RHjaN%;}_ѯ^ٸM+6J:L춹-MxjT8!~ZӑkzBm''ovhDb 2^9u4ބ|1 ]|q*~yI1_[ov1_edK"*E`;x6$,zFfhۡ_N)c1)o]sL{~+Ԏh mh_ crlAuO"Ox$,1Ƌ7ĒK:F.bkfd.t3y5X.ao;֚Q(qPFQEE<DC~Qe?4 ؗg? :yFuú2Nˁ=J_ t VT4.Rٞ f>/+ ZȜE: "4j"TXsdpQ-&9|Z3LڜCgGOJ?*;n.\Mei/HSɉ'T&5ZLݧt~{QAmˎݽ0v+>AmKFؓl&peAҚ=n_tybe=R6}m%Z5 kvl˗~!Z|* 7n.2j]TDbϸ VPډ_,5Sx@tKϪ܈5jV^jjvA)t5o tc=!`5aBa/Ay}Q5ohal~1+tZ96U ?:iR[e;xA#x5gC}KmAr55jB6vݱ+:<euP+1Z$ ԣh:6{3SjNHXC~6h ⢷n%I|~BR:5le/[kօg:՟V3H/Ҵ}ʖ=uj=O{{ S\zf9qQ]A4HPԌW ka jpˏWUqOςzng!r߀ԵyP)vx|bԥ ,-%/ Wt'} |.j2yAw>WjT㐖@et{ILJ,~ [ɐJ4|Hn1fASKlW@'^{YNq82AMֆKH+}PƯ 5 p).YpS[WB ra_1anU-ntG>UwB_k-pt}*aMK~Ř.Đ-A)gA=/JໂV?Rx?W;A;܍\P;"P# ۈX֭5|0iJ]h}jV!M]7# hOߝQ$-ZgP#qg缯2$Ƿ*+?R` :$Zј |#+Ht[rcnχ:ڽ}6mK6UrTZk7=n37C OȢܙؘ_&Kl=9Uj]O'4V먌ʩ/!;߸q X[yBңf5Tm$#×7Qί'?o|1eJ3y _=4n1@ s@Pӣjh#b`<n/z-^:44T)g`dF (,!;'H*G]P{GtW=rp<k ߏVKE~5H|%:O!fr>8RW ><:H`9ޞdoC9 =P_K'; @s7OXib:+IeT;2di )Xhfoz3(X͐J]pclYc0 (pvLpAp:AY iͿ-Df9-ٺy+DcYE'mAXuAGufC nBn{`#de4F-D.=/h*0['3eN$UNZr.\psKK04a-T8E|y%Ҏ:b-Gyer Ǎa )P"sCaFBƢ݋kwa iR8Xx7yH! >C7U 1~[Q!80<ן,P&  3D'JRNd1 ]74\%v,aeѠy/Td|8u(2W}q}(`beXi1;csqB+d񯯔:7hJn@fj?:5n?L[n 1g* LK!Gk6] 6:ibu)Uaq{`mڌFd;.b鎩>G9p;Ȭ17Ƀ۹PhG&Xy\1t~H3rz"1p >_x /VC?A7aH2T yyk[(zJ<Ru 1nG[f`{\PS5jul]SȐ)dGbJ/QD61`YyKipwkOAyGd_4ёePJb-k!f<Ȃ FQL(Q.02-\}J2꓅ k );2(:NLml)r?ˆ} .&/!DAPQ'2|1nT ;S@T 7롤ňM ~ۇaےk//)KwHⷁڕsQWwU%2[u *84ߒA97wDI#x, åј>yt myDpb AŸ l Lߦ?4ɁR.g3]~`K8BWblg~* 2>!t[Ls<W 3ΉA@ !'#pI]ֱ`$k}l@$~ ST|^FP)#(-@ư[P}Pӷg,}E1/Vo#~+d}Wr 0(`"n >L1lhь HA:92 /gTӃWOmrAAl?-* 眒 6/D{x~CfE0pakY5Pl\4AfoussP@)d94h *eFN2Ye.Pك4D)PE_(Ĭ̒(=|[[9m)JHEOrP)d$b7@ Qϱ+'pyu\ʕVYB@ӳd[L}X(k}.ǥ&PF* t!4'd(xKeC{UsG9*!)]ZBNPϝj!ddk(,lhd K9—*ȥ hR{y4 TNFw"ZP[ 4  2Try`[J?k:0`@0đB6].|IKyܴ?)='IHTqϱTedL6T艥ÔM^CBV\bJBhɩ^.oTΔc *C¹dt,*-n2Ul@iY_'iM4\Pq/*JTј:I Eo*l r.5, hdԭlA)q3LOu3A}`LIMA"Cp#U ,S?h|~bG3P(=2I_ZTC1e7+7JS  {9P_ ]ԦJJb "^/~s;PqryAeH ) ˖U sfh]ݐɘPP7~J85S:ۗѝQU> Xk6l~|r>u}_H=y. W@4,l<(lTVKzV1QW.<h@哸|(Klk{RLȝLe{h*_]jUBS#hݾe%(I*:VL?̶p3ʿkՏ{OY|ջU.pKH O!'%S &1`Qx18|=>}unkvW8n2[G-=9]̕ci" u n W3Bs7`FɁ_Oe`y1ND$%1C&;ܣz'W(- e3mzK%C,B9l "(| 1 2VxcfT#AA]@4wB#2l0\⽗]:C22+Xgkઘ=œ@"ֵ YAAl=}LdAtBtS x{WJ<뾽~CKF;5`TPɮl~h ۪=WbW7`lid-LA "_٠_z!؁z'@P\M޹Y8> CfgGX咣!*T!_h2 5$U+C +hwSg JAa__s'体ff Pr:žǖHF_[ %n^\ h FD7L Ģ5Qn5(>Kyl U5mBM_iޥn}`Ӫs+S0'BoG"ita %[zܻ \ F,&nvQҌ" 5-qnKڐY6󮹡ptf82,| 9ƱZ\Da-%!zBx+ +f[-*' p\|wOz4*B s@MM#Evދ˙qkPJeGr/$l|4< MT=ajY}hxV JȜX;yϔ|'iD7ȫ r1W«y)֖FճQ_GbxŅslzlI&Q;ljM *QnXJmy$fyH,x_#uC@ho.d(H|uo|H^;[Ϫt Lb֒ ".PCS$#Q)+ms]u Դr2.Š8}Qư7GA'T?zc_h :6t ʜ.A\B>H([0$h=rgo&jiZR[{ƛ[ڈ;/ ڣDHT8LAғ|NG;Y LOJxn6!D-&`i(e@w.!J-|{2S!j@$l?բ@Jនn6CYV SZq8Ý[JB]k?q5\gvr6*} c,}ٸ9^50$3R^QY}hu z~^'l'U#&u {|Dk ms/G]_@9qNPHcvb#P=F:V LaK@kD@7߯ZOd*~(2Hv?*i -L1Ff ss(y@@ݔ{ѡ/8Eiʈ+c<Hڼit(`x_֑Ags=a@k2$"u\v =40M^_EIsdP *mWxmv v2)Y{?kvlⱫT I+lvRPe<;4&Ų9i )tx,#~ߝEPگA6v$nDm̟NHQ]y ( fjѱHxIdePr5M@>G@ibSۧmSՂOݬ A9^XBz(R̥ϓ>[cQŷՉ]ndO%CP}BV'b~ns*ttltxC%N?(? ¢MZ7C-σU޿8euBOu8{g_X<& =o*"tl>]ZxPn(f2c!mL\G^9/I[|m0I[2d S Z֏ n}*I'v7(y],=|xQvGVlKNv1{ٹPD 3c (lb1ShN{wn*.'#21Dr~Im#ZT[֢+X[ a$,#KK.2iBANe@;\U k tT䋏ĀƑυx˗mj%( r=v VuX~5f )D]1 B͌^fNF&~6 [S@tpnM$zp<M*Tj`$HrgdW7>Oف3޷ڷu7)KFnGY!qb~M[EBh) XQ  A(nCJٷ \͝dA/yo)~r5ΉˁןtYhe-ǿFW[Pmaj+_4 85|ޓr<)0Tc$#T%&@n];3{>@;w"mOqQۓQHzn:۠>PkI (gwq2$d<@lpQjB % zqU]t=׿fe$ N".|hVe]OuEO&kǞb喝?}}: ilz z1$ܩq6ygn:[*<C@wkCt;k[ei9 PE\ /П6p1l%d=AS`tO˭=kh ?=wȥM+ڴ=qC/ʇm~3\@K.vHAeX$pa 7Yḳ]QV 0B(qL=uSb6 LAs:e{?6r,fd\&',>rhۛgPm?'eVϦ+9a/2(&J(% d{0jH[4I(DIgxs*t:qy5hQ:AklBiE@x&H| S&q/@qЪPBq]1 DGYw_ԛL* 58Նݮ"Chj0{ m!g^b=R ˈuoɦE<hO/v<Σd8C3 w90Wڭ~[P/f҉}>cDQ׮-CeS7nM뷁3A-M+e!i(O{]cXۊ#\EMXsK>lp "j| L# 5\5{N ? "9p QR?;>.KXXWRFYL| y>^qژ[+鷍=U@\`&wڱd}7kORP#.:&rXP0 Hf}j4'jg%Fx&vޠMjJЁ;fn^ukmWkIuD||@5!Rژ5׎ݒc6:quΜMC( Za]#ؠ:ru>֍Pd񜌺BZ_Z%:/f;́<o Q"<"k\{$8yp&b‡}*Vib_ۯ\u jo%1D2ƚU4Ov4ڸ'D27jZg@(3,B;ׅ}?%/BM)w)6hTگu %7]AU >3Vِ ZcS%Orz OZ|8*x@$7-Ww /N<^ ">BzV >,5Kg Y,5̜^}FQu?*ex7bC{cP107!DEhP:ttZ>0YJz~ꎃɁ? ö׹C"āT? ?9T'-90{S\Ä+cÒ/L!ԈUXbx n}>M??:a1 *#<º?EGWj|. /m%lSx:_GAޭ|oqIh1=P^`]4ގ ׽8cv! J{R`?*nN|1vP*$=Qq;;$X3 -;ǿzJGhӋvb"cmUp`|ü:4kL|v`h4xfP[zo"Q/}յv6"cӡX.0nUp+[C9BPFjsٕAiϬ_7>81fK> (%מ?i4J87, l552K[SX%лK,ZkĒO"fXO~-.~|X4/rupUFC#&cᑑ?=ُ,޷|>uxcީKk w~rg`\ݮo⍕wEM_O4}D||E}pstvF>ሳC1k 9v;[0UU0lW^gTA]ɸ̔YD盽~ԪcC 6}Xyccd:4'n+\Z47t}/GH{m {jglxWpsn[}8Oב8$ػpЖ+z& ړ1lڤ*[I:ٶSa7ߏ7Q]{Ao#r01'lJ;wͳ5{ yzڣ5+K ?={54Wg^p3CőKkJrOmV?$}ԩQ15b}1Ăf{ٯ<߸:nҏ8؝q8/ys\h2;`昌7.yAurox.?7R;؋_Q:e#֯˨#ϬQ~۷[4oGϏ1N7!Cfd|kӯ+zpnC'Rwҍҍ^NEo*YfT9Rט+g_5}ӆKzp}n\f]F}ߝ dԟJg0yb}OeXwnuY'1Yy$}dF/q`7yTh:)TjTubPfF֥JU*Yf`Fuy#U/>ZF l9e>˖B[Ncm9H}}N~I}~ή֝UW*}uZ}O~s?~E]n$/SOWL%9n$3sKMI~kdJ}󞺮/i^_[}Euiv6uVg}&gyv?0Ofg}1&}'~1=:=rDw8u둲|!Y _Y Y Y Z _Z Z Z [ _[ zMA:Cxx:>ύyr9\׍uW4UzgYիS@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@w  #+3;CKS[cks{T⠴g֯ EYOnvO@kpR# EA. lhns2'WE{:Ba |qeՐ9n[w|Iظɷld8Rwave/data/signal_W_tilda.4.rda0000644000176200001440000000315012377701075016031 0ustar liggesusers}LUB H+40ܞ/LsX3 Mk!,̬"5Ř]_rڭbN|:P ~۽H>ps) _ iկ[o4_ lfB̟=mv}s onܬAZڷ;:r' %clY0gCQ\}WsEQa(=.sV81;IQh'l5M 쐣8y/f8lፘ-fSV|%T ̏ĤI{;gv[$8q|aoalw/L\kFUlOcY/gW߳,(8y=yژ~f;z%hP3ߗ^CV%.>^pViC ԌF?uea&}`"҃'e7/ĞI)hBSzv|w-ϸ)<9"Kn|"U{ĖQ?u~z:67et.~2p3Oyf˰￶1J~1YaLʸ;{q!bB}8^Mu:NZqc7zҬ;;o㉉*ZHV́K댳nG͟u\_N\~˜N6zg7Y|h]H׫R=cJ9/qŜ_9O ԋhN?͗>ish4u?0"E;_bZz)8yLϯ/&ϟBVUQ\O&/Uo>?N> Z/EeݜRY冼/atyߩyΆҺṇJ>r2y?yu#ۖ;-ZzZKw~ht[w #lv瓰k=sGעG ;]~ v$:BP( &5D"H$D"H$D"H$D"H$D"H$D"H$D"H$ BP(t b;?}F¶#Ʉ&e\9k}l'Zɛ$Kޮ{[m=w[|H:?K?'w 9}>_&{K^Z<&3Ƀ|L*WW=L!~8y<E,u,>(Zϗ}f_0CLf;M^g$3>'VwZy\?;{ɛ jy@n /򆓷 |v_Gp?yāj%O9\yk9G#yU;yґ{y؁@v o;yy@xUOȫ}@z /=[y;)pH] b6eWB39BX} ;IQhU!>NpWEU6EKJز@ e5Giu?Rwave/data/C4.rda0000644000176200001440000001121012377701075013211 0ustar liggesusers=Yye,ev%-BRBNZTBi RiQRUT;>swf,ww&QI9?,w{s~3;:viӶg[Ĝ.֟]Ocx; Qc: }>̛cgq<3=ۮgb2r^=q2x_.v_{]F%wm}_.YZGh 5]ZnFi-V~Ǩ׺]eosZ{|)c~x~W^Js)߁vߊyqnYJ+nq5[];?:гnr5uǤS.nc?ZU?S)[M!'O^rʲrكo]-:8'ݱrƣ?'lDKP&~tLZ1wVKS/E/o1F㪦Ξk(Մ>'Э7sWTc =ؿʐ 7첿 uB^mǕ۩-PG\wKQt,徽.3n & 6_e-X*;O늏([筁۠#) Vi~FYfi%6X`WFt΂gLَco<ȾcSF9B_kwJ IV3w!X2ݷRs3cw8UZC5%4ԘhO:o\ uA\H>@#;%WLg*.C(·͖R L7@`h?b:[hO }/rfQ6 yogw68& ?K$ʺ)DE<7nF+ݎÕGʳ6U]Vs{ͥ|E"}+z\񥺞е;=vxBJ[PMv-@1 ?vO]vU4+qȗըqa;%N*Axg@y_-0xoXX (\Clq2۞q`5אQQev kbsş?d}r#7AV(lcV{ьPfV::'~0Lr7J Z)`d7P*OE+W#nuy(,P(O9*ACzזFFy0+|mI_/>F^*3qIT<ͪ#*U_,𲶘 V!%L2 ˖Vر4eB%2?քCQALoq,d-fNW47"87~.pJeGy,!Gx|'vy*R !E-x$r\q$ RS?21&쾓dY1>G~5W10)b! /rJ4l5xWoj*Jn,'Z]L](CuR 20jLYa,fc|Jdkxz6lJN&JQr `C360W-Gul(u+/37sPJ* N֪)Ω%;0>Z(sJKU?un3((Ԫ^W}LAn+&AC(~y1Kpuo%Gqۡz8WtttLʎЃr xͽSR# m̈́Rd#`oi6(+ Iag[|? CL3ec)"Tş"KU]In*zu^KT_4H_I;+֩i>V  ל/K}[W?ڂUWq,_:^(bѻ($5p/r1F8[ zU}BKC&3Lu$;[5߉NqZd5"jY܁\sYʏ%T <O`hFco*ӣ<~W^nj=)n*FJ$?F)Eq8rLiiSivaO`FtJL.*:A&بzy~8َ [umD_?r#qԬs,>GkaA]@"q,s:R._U)ɨwAb`#66j^sGc2M'7Tn JPseip*X\)eE6zdUk?u?u:'!<VBAnׁp~ZTS^Q:أ?Gu|2­x]lRռLuqDrlZz+]s>pk?$,e^&|D&yȖ}B\b9ߠ4_ܽ O溔}%zYVGeʫNsJM<u4!zYNA8 J7U2ʑ'$EPsZihd? Y&k^\zr4(12'ͅm3Qd8'8jQ}DBT!ܒSQȼ!Otr$%Ջ8eNqMYztTs,ɹ(+sɦ&ˬ[͠(S:4O}B,>:'F~o'@=h4 .=JQS&إFy\0)귂|rQ9#:1ǺRT"B3al?t`3ǚfd9M5Q^K|X4,C{oDDKԨR(l56T h~U| ާP#˻ YοCZ*AXQZkx}G4 e`847yJhd*[s]T9K)viޓy|s5}V*9SkΖچªߎۧRrL@/%&A}u= i_F}#հ\lʟ^!増`㿣EZ2Y/*ѩv38hj<FN գsjqZR87r'\')mS!Z}\vyST{L*2l›D<1 Rwave/data/signal_W_tilda.1.rda0000644000176200001440000000175512377701075016037 0ustar liggesuserskHSaOE.@0"B弅!R̲% L+Š/R2 yWh!Dw(y",˰! = a9{?;_^Ĕg$ |C|/^HӤR抲]M=eE}ޖX滭և\:r8f;Cye|lͳUEZO_??+QӮGkxF=b}jv5>L{s}a~]L>OU{gvM), 0 0 0 w^`aa2;/x:S5@{Ǣ;gѧzshz|ZEg2uN8uevkqa|yybD;.:5WsP\,SG][uԉz3333kxċ>SW^SwSSS^|::,a1Og1~JsFnt_P8[WZy9)NfG^[`pYVSc}e+Xͼyf;CYMXC_Kup֍ ?Rwave/data/sig_W_tilda.4.txt.gz0000644000176200001440000000117312377701075016031 0ustar liggesusers;n1 @>{IX4/دF@#Q$5%Hھ}ߥElvnl4?\j1Ͼ!}yvMOZ?ZĽ ~b=])h|kYSD~ZCc6">S:rPOgs-z>'JDn:CY+xȜ}k1$&W5J DoT F<Ȯ5]PZ2S*QzFZJ3jV$LWXbd_emݕ2S-y~yGje*-f] L彚4[~Eξ|B *ZO_Rruuuuuuuuuuuuuϡ_wϠ|;w0BRRrrrrh4q)申ٹSXTTɹOc҉<}ƌOS*QRr~H8hfx&uϜA* uɐ ,$_h3eQNgux=plh9nHlJ}FR=f0҆{푥Y{)aJ,a,Ky.a'/&Rwave/data/W_tilda.4.txt.gz0000644000176200001440000000203612377701075015166 0ustar liggesusersے }v$ H0I׍s1ٌo"E['  -IE(Ss"*s*D޷\quA0xKsek ^\{: mZ8z%F6jF&I+ޮIeosFOu^bMEA:@z%(+W,a?I-'dYmմXݗd$뛭5Sߺ]UZ}ڮ5Y_"X]D{5eͮ&iw *ȢT>0NYa qH!&C.gLn2nuַՈڞ2(>VYe% gQmξ4Ee $Fԁ;uϊI=&k7wQYz )һkFZwkGhs B1u͟ڳt܅OvzMc *}}@?U7AAs[>z {< IGI'I\yW(*%x^ʈU(VgO;~4AgNk^O\wEGb-tuz\8!*%f}Yc.[ޑ%ɥIց.^DIRwave/data/YN.rda0000644000176200001440000000660412377701075013304 0ustar liggesusersEWy\M]nJAJī 4S}"E!IQIE FPIB)ms{n"$iΐ|s>{ZYk>s}EDDD8*AH5ҕ~` /}gXOEMd0i`|~#P#ptBP|5n9?Q >e+K,Qw(Rpꮛ,{za#TIMՔbb*0Xi(iԺ%Ҩif̻4l!%kg(0WsWh}5 s'@l`n,y"qah~*[DAhN%t-Ax `և&Al|;+CAT="`$7+H~5U*uL~_9~B;, l5%l_OhI֘TGn_^fҧ Tbo+V`d} io7s4Sg]߷O_YKkry91Fq꤄\@z5Y^̞>jϪG&`zp?zhxv5=Ḅa3Ck+B"҇^LԤv\Ɂ .P O;\cTy~-1AUrҁW{Quθ ^I0o~ \FД>`r6(DM9Ǩfǎ=wLAK0ăq埅ap~WwTZ4E+e`зz QXȔ? a>c90ؗJ`,0<0Ef=cyexs*va^_T ։*.* wn0GOc^~iwEOŚ*Q;;ӪzlSiBFQr끿yQF#jߦhARSP˕_uN*~ČD^jn͇ƩOAI_+?,5grA\s] ĬSn 'mQ,%q!-u:X_ge8AĽ]@p&K W6=[[d :_PaMۥpaBۧom==6x5ׄ'-a^\yJ~p QU8N˲,:D԰yCk[yھ/bRj~Tag{փmR xG7B?:},P1XC`7uXk;Q Hlo`2HW{| ҄U6Hu=6:`7u֫)o e7ԞccvElKDU+8<䕀7`@t5p#XDkHTbR8dmL"(׃7?H4}OiG7Yය=۹[炷A.&c,KzWg{YɝBaoqm\&JOZW xIhvOdz1kvk*p\BT&e5 p.|)EH|8J^&Ԃ*.8"/'tI+{..p^[o{R9T{,8r?O4p*ɰ'sш \qhU5q)Y28mr- s5@&3ο1l`ۮB)Ԕ!nnvZYCOC.\l \?\oȊ40 XjAp{,^uK~ق ND&% $/ =f 3g S5x?9; 2O:|քh3nhf4OA&E*,_bD4Z]sOg_YtrwOkjv햬cnݞmtZ$,mS:twt9s()S(vo8NIGi_u Hr12q+qiV mi4C'ͣ7oxws4KZDƂI?n`.[nzLj;@*iyss% OO Kuim5o%gfF,wNx;m qۂUżU7.)j:Ln8_u枚Н(=YT9y 6k>1`gBǫO<;/#gRwave/data/W_tilda.2.rda0000644000176200001440000000222412377701075014473 0ustar liggesusersoHUgǏ^ clHU:7ݼJ98O`WvGz[-(v0#ך& DEš^(s5VjEKHݹ]߁8$sѯ"zZDe%kCɩahmP O|5]2MݴsחQVc=#k*Fz$Z<М:_kݴZ~լrTڍO/5:|~%1OUgj(-1~<Ӈ~~)cĝ_ixsUDzO2/_gHy8wut]|[sWܚS\qĝst.ut.=r[ziWmWqWuWyW}W܁W܅W܉.gنMf9j3+<n)' z5kӹUw|y.yN"z(5O-N}Lk&OL2ec{>cX_֭"z84}]/ -|>d^,Mu#1hTmm_C)c|.M@[%W%Kd~{ 0wM/۹N _smbYh&%Zmg$_lJ")\uS OO@I'/q{f_;4L@OG;#_SUdk~6S-䷟@a M yM [ sgU KPG Gh9![2/B*ʇ?t5r+EdưHkr̥m7c#wxI/@#~K]͈V7xbÛXhY97{uCP3CHi@n ^MzƎy}ຩE|\OW0EU0%ٌ@2 y,71zν+ҾNᦇ;BS0#,U9fĝvcδ4"7 :xEFx2$~Cܛ_2`Fܷ`;؏wklpAH|Ĉ WO;@ĮPI.y%hT[ Yer' T@Y)wP[fvG NՈqgXg?d[fCؔӸNϟWCo78ڱJH::9Vh,>s)f+td.H|MNظwϙ3& mT404[T V,)"L,C/g!Gi綱; . akΔR@ZL?sXr+dAۢg dkm,onö] Z{Ms K]K؍&JS(zԘ*J]o*wױwlf[q lVͱb`}Lq(tnLJ,G;v4Y/T+0$U;1o50>j>1Z\q`Z%%Ўp:)$YGND1C:gS2&GdwAgӺ0><ږ =0L,QW^e_&@+ڠ\hP:_( <:w\w jn4hj>t4Ҫ٫BwKe_yxh=F-}(;)P2<$Y3-49:o4oO2wpZ|>Bu*.r}/ >'.-J7j&PN1b =Tr1s^i<%{A[i_ȃpbh:K4U_oGmT`OU̺)GFS'Wޙ@N]?"ǚjSaf{.NBa]R|&X'LQ67S@]7ij!çTZkN2el4V]~h'jcpRۧj TC3 H>I5?nX@>n<1kМE?ƽ /vd!ֱN(4]go z4kIe'!iqO!9$)2UOpѧB::bF]B!(n71,% MAb]ѝmYގ^xK o]dQ+]{:aƷ.xדfDu^&Q᯳6)?MiY o1x&zu<Tv{l<iXeF'NNifZAKa q*9(Cl[#;pԸv2es%Ùe!!ozS->n% WؾAޗR_4Pi,* iAmԾ>1kAٗWƠj% KB7Ե?┊ф6v2jR?Vnu}P-nlFHOqÄ'yWp@*6 m&O4R^C%ۗI@|?(4=xLjЬ7vN.0cFy ic\H{aܼ+i!.]npAˎ:b'.L^5j3MA[\/Lэ=>0(3/lTc9ׇSLnXԍI>K$jH Vx>tE BCCwwS> w_L'#7D뮽~"qxW̴i@Lnj&d+Jg>H,`~LLԁC&xd6oB[CPO|Ox!:^~+k0=E˾߸4 ӯp ,^ɿ~_6$DӶ BDRa: HTOMg:Sb J -0ϞޏI[j2φakoe9{6]k|C}?`X%8ܠ΃ПJwm|5nLR eЇ\2xu]hE=O$V:gAqER~RD^?.t>3䘧[&(~ڳjN&dd8~~N,< q,u+=Wg>\=;ߢo]xaUڡs1& 3BxނKzYi疎c+W&h(s9h Z`QZ^ϋn #Xa;=L Vn~3qLI1"~`uq>5Texs&}?Z7HZ/A|NC~/` 5(;GL vW)Hlvv? (rЉ5,$aѿĂj<x]_^b@HRCD_l wLL9!qWJ`o<8Kn;;b߻<1y;L3vBX 06q"ݴNa[Kg~WU,6qŃC)ЕsfW)\li'/ҵ5 O8 #a$rs?>L^Ef?]/I4>.0(?b*Y6tq޹|iZB.dBއxRYa 4='M ~cݑllo~1WۗeNbŐدTWd]5 p$ DߢW”Ep_|-Zm BiB p {{w*C3PBL+ ['!To%D -?J/ta>Xch_ZA|W1CA>?!mGF .zv ?<xZC=rO@{`_Nh: n,@Ql0= :zgŊ$=~5l+,ώTbF(acXZt}LMsxZnc\Wo_q-"a/s\8Őݙ7$:HEM(|l|~g\# Lcr(\WLzl5t?ۑD͗?ZXt16v;덕!EY&i6U0lc`\v:IH@ނ˶ 3s>L v7xd=68H@ޜAȟj;5rY)}nm\/]`)q@ǬF"&.#cMփt3ߎu:>uٱI,S>aj~@4l~ |r0s[H7-/|WTjDz}Y!7o1õW^8a] {s K+jҺy# 훷ׇ=5J0lɝxZLẔ.H:}9q4;ѽ<yNډ!JZ_62dhnCg`Ly4mGL1Okb,I7R#S$oup*۶QE151)f 3ONcd^'.Y/ JPic}[ {P{Jy_Z2%3PH |>Kȹ`\3$7g*jۆLDWimܳw/  m{˗0ՎkPTD­92`]?=`VsW=&lBX¥WW󰒔}1U{X&ݮUx=YiO;;*o50Fz慣ţV=ޥ鼂xӛ/ ~\2!mO'?)=ђ}9PBj{{cZo?>770u0!iLvnaQzZS, [=}c C*.c?0k9}^#>>=E,Û'wsǵ+oBqڭj;f''"}OZBi瘴osv<}ʐ%'3RqJ隦!,7f,dh!vAz4ʩ/TNPB N]a z\U^R ?u]4 7v1JO))=|'_j7c HP6s0#S/&<:;1Fir,`#n Kj/v[[?jghAj3$H|#dwՂMWu!37qY|bkmP7s9zI(To#ݏL9 {Mҹ0o(0 m8NS~^s2 ۡhlߞ G#+AML((X\S-pν;0kxS&ֈ bCKK051aRA[r]`Қg`FK̠_ihZEr_G~ ;{F,dtB>b!uNx _k_i]l &bѱ2D^r毋XcP&a?u>vt׋ k1>xj#Vڮhbn19J\gz.< Dv7tSCvlhJw M#:oAaX(S uGT nA+}NʀKz!av /D_-y`|fnMUC@d3$l4Bcp,tٱ%4Ⱥ_dznRh;}4ojgAt;\BTOⱉ39 8~;1{̩c$1]",S5g~W@[ikf"ls*h]h?;_t:u^. yvb {yυhԱmߔ6q R ;/>a )V =ۨ4G*cJDL+,SI,H3k.9W֝8 z7A9{`'>?]*PSJg4N+Bͪ{BLmLd_Ŋ8Cr;lXI0Jsyi|@>vH4, G\ªS[K\ٷPߜ0ٜ.$]Wr*j\Pn!xVʼnѪ&3;Ϣ|vs\;*bړ!8`n H-ACZd*JyUaWnTvcA[tj.0 z,)#U[2㷖\XZEٛzb9*`_|wmG\>آx0Gqvz(LTꏢg_@KV`;"PU- ?)A#Vl`3,6^w;D~;O?~S9ÛO `7q_O xvQ6NPÂb1܌}g\M̆<'N[r>iP}[nl!(q| EXA {ۧ1!|32mf".XtNG sW= E[ S|_#} v:ӆ.sxsq5sµd Wx05&!b-0r2JV~2l(:m[Ðu$Z6j^FЩE:|0 <T:x۠O7yb4hx?è\TGJ~K; 'Q>RVM*N|Z>.Ų) ڦPw8x1 E8e+5+{ïT?tC WujNHQ:zﰗ|O~.{DԒY8=(0mzeMNܭ8$0DT3fo!7Ku^H$!BB8׸@1ҖzJ} `/ X.gK,ɋ{jr[BwDoE]xQPw]!E+g1 EU~am˂d2Gb0b7*SRV5G/6@k}ޅ6r璧IJ: Xi ú,oAoU^3PFֵ{twҠN+kWqj -_&>k_^~4U)=&f|Fvb4ff1„>gFagEC#wMUqv'q\< d+N+rt$}V†J ݣ:RUhXx8Z7>V<A뾖0FO)gl%&qaI:9=+"X>vB|wԗOx=U4CZ!7Ey1ƓW0*aG3̚,Xzc1S> sC-CF 4g7wrCⳒRq\INu#vG`V/&Sh/uOT`"q|ޒDRgmUNIլ}w1NŇЬ5VZj)Q?a*CUO*ڞv4WİSvAk8~s-:cw.Ūuž,LbTiyqmX 7^.*K|.R^΀pvFGƯz4Ww4/={$ZX'g½1CX:,AʫXNf).iLz`PfrB cڨ繡*OHfM:ayNaĪc=ߪ0q'*@>WmAm*" }`Ue7,[ `5úϋ7򭦠e0mq1:bp;ARuWv}iNr_8i SY ע;6'@XO(D^9L*(_0f P!tYج 3B a$^~SXg?֣O˺u!CZV4P)_v7J?/Hl'<\vh+仠,r :#bHaxIB W U'B_ƀn{|y8"ު)%뺥;F-9 1v;(WE`z%[WޖH~3"r}ЫRcR69_i p9Kf Sop j_ê%`Tӡ?Xlw7 J!72$>?AZ5"Se X|\﷊~T $SHmu܉Bo9;h&)O6_s2^KS0dN.D c? #oCÆԫ;Ь-9ԝ19 j3o) 蕳>0bS#SDp+Az$|gZ?d R O:adľŻ$WK7Q]%(J8{U!_TB,1}ܰxWɜʳQn",W#?C<[ tkb%(xS*rs mJCۻ#`Wl>`f56zű%϶ҜQz9P>hŎU0j8]60bjܥy.k(d(tOmwؔ1)?/`y/}]VclO,sP` MUP5$#8gM9cQ+= 5d| cBa hd+ׅ~~.,컎sǔ&qp⊵Z"xNslje5\fFc55XdO縲SnTׇoBv^ ,j0%©4L8u>Jlo'=-c {1#e,:S#CkB6< ؚ]+ ^6^o]ںUkPs`|hjn,csC¯͔f}:A>GHEC(]6Ghy8Y59iw\!֤sKu8|pDUv l  ɾUNw6>,~PͅZrJrk*:uAwO|L0D2Wߏ>K%M1uGzvq>G \7Lt{3X2] "kx=a!ó#;FSD2 Cu8j(.l1t\O|E8&? ,`eͤ2_r49MGևkfQi󠏘ks `uo,k߀?wk 4D)CC[T_;"pQc|^ō[ŞN{N3t1xSC݈k&&? U#ƲQk'?bhU !N:xFڨ;Ad)H$3Suǫk,zPvuV{`ꩭDL1[C2XGҪBͽA"o;'1\rWwDy.@wZW#tK?`泇AחrS0JS {(`Qs^4pDUX&iNpyz$')28Cs0ϱ`, Z?{I ؊-p}6q4N4K2{&>~p<#(`[jhJ`Ⱦ`S*'8ފiNy!Ȅq OLA'YsbBTx _]]CsﲷuXؓ{FkŒӦ"RAf\bs/,X \ O256;kESBR D@7ײ7$k3TͷzI^=OI%*>,]oN}Qo'4]0Vr= |0Y~RX^ܐ>I,(ҫi¾?H񙽩wc ܻ%?_-@/#jLN $.8-[V?ϪBF^2}#?5XrVb.s߬`f;ש}Q`O9}52]wBPE@ ]?hBͩ;> !c{,ck _& 蛳AKQH^*Lb[O҉ܡ"SC7qq+ku7g}P!956^Mu*Ddp}J~ޑO+02KT/-2' xp&<.vfX3 ȉ/x 3'L;2KƗ}04>#̂Ʊf?1뺃T#XBXR 3=U~R>C_03$h(]-)4jyAXI$-!QĴ\B-g3̡z产(3F?؂mVU>o1}\4v(;!%c̋ P<Wՙk0ȓR~_{!)oL(.9f=␫ $VG܆~ڂ0ǙPx]$TW ґwUnBM@W #V9e>W@QXV覻2ԬNv ''f(,סx}ٖNt{Twp?Ws;";wL_fؤqz7._>S%'ݠ騕,0rL RgvfXdʱ pXk}26DBNY}Bt(M[t"liؾu|nGu(8J?9@jؽ(*^2}^Rߺ,ܾcoDؚP2}J={f vz-$Owh:t zNAnGRUAY]j9%ݶ?M4j&x}KNTdAtB 4fꟼՇiWigk,_yfKvj/#M7°)봰qH%A/)K HfGWR?C㒏:ןB}؛POIKZסvfg_Uĵ6_F긠$ips\:?q1J8bK4u$Np{Ñ}_V@ cc:]) CXU{zK~5[V6 ^BZ6Y8?ԆkqizׁNv +[ N݂u>V蜛b6N9P-U ÞUHE5ѿheި')+m6'cD67졪Vc^aHa;4Z7t+faP~󘗥EÂ5s:m97iBz nJ?rK+T `?Y`je',x49ĺLϞNg n W[1uv`sҩ&qG쩥\%®SE~ gm C&ДzYTb.{٨c]2>2Y?d;YjEL\`{UFZ|-H OD6=#a]>g[Ɖa#smk28kv4hpT @[ge!y Zd +5ByFWUT%IC{+_BuҕвxjѣRg>~/WsgmеHvJh}Oߍév'p 딸֓]`]#01\y: T:Yx@K`sǢ= i,f}PjQ7H'!07"@U%fVgtzrH{ퟟ]T׹;l/`,OMsJ24ڝZ؃͉.Mx'yl+O;cD%n)V`" p7=/ذ0.0C5:: ˠ8Hg: 7WJ8t&.hs{`ؔkL$6< n^#u8IZg3-mp YAYkP%pgگ,XvxB1Vh%ΙրCqkw ១U3׽ hp‚UV5+rJ@0(]uU6 %35PZe]|_^(#_ah8+AR̃u鸧!%.MޣW?nμ|w~h&tk+ i?M杽%we,-Ϋu%XDG䰯J5XW+Pqu1 , F{w5m10AFVh|J[-3{SpZ^GYq:+t%7I>7uN6@UTҨ_J#'CR`r/Dk: f8DZe^ˊJ3tʁن U*ݸ#AލAɇ;*/KO Ɏì7> J_/F!u\؄]Hm 5vl |%8uTN3+708,,lяUK.*pS|mC1nߏ ?9 L5 'Ѵ+xjdqDZN+9xTBE&Qg¨8ê`2:!iަ/25nb%hg67jK]FB{ gH1q0E]Oj/Jcխ{s"^`esd-X(Dϑ"MTc%6Exa>U9 |{rv1BO=ȕUS]81Q;8]ޟ9D!KtAI9;JBBbT+qPjwy10^VYen-=r5G)"laċЕߡ+=ε\pӅ #1~$|-?c>A[ھ}X: +B;ra [6pp>:;w(h>v#ovd[=Db*+ B*{Ί1Hn@xv8*nECeM;$(oޘW܃wѢM70-W2œ k?nO;zP0Zϊ?>:hYc7ׅwuD`2t~J&޸c I_Vt/Aաc-PMf~po.B/.xn)yZ]s!MY*q]Pŋ|f49Ϳ@m&g X&Y6厽lfa;R `D7^xAPU*re-W,U&rCοeYZvw_^X7X'G]B4{?/>3EXmhf("dd3j2Q\L%x%|9ݮaQ= USH?K9s;waj !4kòcƘMA[@ZAب+=Ŝщ['0=#D,VmPvzԼp;5b]ig F ICm䐄 0 ƙPC;%P`QKxB YϜ`GLbAvIGWGṗg`|3;=Q{j0a&|J+beue0/|y}44uGY,[JXmʧ"qEeĦ6( .^5i7nz1X*rJ)~RnޚAo0~{6/87K>!i,!lR_cB )QlAŚ[oLjE%M,ױ#ʕ2n12$9?'*wVř%n RWkF·aZBR(TPCҐ iu^~qKy^C}ӈ PL0"!R_5Pl|y_-]"-i1-<>I' `O"GX6Ɓ96|@ec7%n~* ~AzyGiW .}͖9\IL#-+@֋cLzqgvIj.&ꯉO֞0FkUZa}ɛQHuHK(l>M cűBͭ?庡h}'@8f(}J|Cg3옔@Ey5oϯiƯ80F7ĐzMy)耆f^ssh̢K 1V ʑ,)P:wP*mgZ^4d~_ G~A'µ pjbfoa}0"-LH@%.D̥={Ծ_}N=~1aEDZw*`e{V]\j_P\ʱQ kr|O@ytnY*j̡ /^ǧU ?UPU#[B~V&_ [)Y޿\N1`OiY (X],:{&y߲Y$ɡ]' 6{̠@U{$W _G|s9G-PT byμt[bx œ!ex{.`E>†+ c{XB>+6bȚ6WbD#w_a<& s̑Tԛ1{d36 0(~Г/]JTOtSbwp'Ds-mHgߛw0< @U|1q: ?T7{R騵r fk&DRm0[GP5/TDtߧܺD ̂'Gʕfghcn `S)ӯ+}ZB"^{zr"lx0&fw*^ǎnȳQk6j^;THxgwͧS'+ D3#s(}g=X}ܯҞԆ/Ez+rf _ SPL{XƭG?RY^N ƹВp%>D}z llǚcW_Rp>ƚ3Zě\/ 7Ul̉QyNƒ }Y+uYz9eTY@!r nww+)+!߮E{~0)/EB[4B)Cʂ@)>W\0"7O5H0B~ ]{HT?+C5T玱RFi%DRA )4zE-FG@]y&K>a0>IG.h6aC&1Uyh&I .{x15`]|S^Lߴ,Zd'u5lS萹਍MCzv` =q#W# z!LƇ&K;F^ȆGDhW Wl\{e*xfzTc`m̯l!Ě(8sX}XV' 5Jpڅ!h>ps욓+7@ BوdUg!1;y&[JFu{9{[5B I$%#5ZNbx:kߩ5ca &) IA~%9Ӂ"^[NtBnnmo't`xԔ[A[E_hsn'j?PC=Eӯc V&_1Cw%ོq]=vʓ  ?:v[ hia~EQMar_,f֟_Zx p(200y~\g 9cP~T:,Oc m;q)U2ߊfp=$Ń.k6X&,9H(M{S1BOϷ d!^6pX | W],D?<M{tSs%gq/ A01A%dªdIΣ5էc;O*a3!J>C\@8-=PI<9swLIB*rhP5Ya >RPFrҧ=W2[CdQj`BF/iĠ0$<78Y_πYARM.$۔n{[ć?p{A3PvHJ(Wo,? č@#8VgBia3H-g+y3c}-EA \m~ kbE; k>Z0cˢDiܞ l{P k*LcՇ7i1AـEIO;oaRM!M_HPni8ilf!c(p~ izDhv]%?=w 4¼O&(rRB`:XyeogĜ~5Eą.32ߒTKتBP" >u12mo ~cXI Ē{YH=Ug@d&&` 9s#/vU},Kꄷޟ5(/KlBḣl;P?H0ips J+faR֋ z;i17޴`w̼)p'm~0 4݅;~G])b)X|s,9,Ʊ {؝ü+6Π,Hf8$owr퀟,8<"Hy~(;q"'4,dj4~\n"; Q]){pgbvX]EއK6Б!,BdwoR/[=*h .*26~$5| ^'濽*u _>$~Eb$} Tvd3 |lЮJ{X8:-uyFY2TiZ&IHla ej,,SL}?\\^ g)[CROh_0+\3)Cw!KS7w)_G@G!3~jUs22+O1H tsH:rJOl/4H7{,&7;}h9aB0M҆ g S_~u 18bq뾏YĔ6՘,cBtuYB櫂JIT8}j6v|ǚPCgpAj!χOsG_qKNBi7᩺4i@A/v B?a}!siXέ:6& %2[A^.CtS(,^ 5S*]VyWdA2u A~ZT2`%i)|4rRmOYs}ߢk""^}g^[Laﱪb.BQ"D,cql!ſb<*e6{J_T9ODT耠^APki@y@cbaL~ wq8(d025/%zZg?lGL/"~&*Xp8/3q#"ڱs$|uIJμF_4w3B*oYCt^}bS<>ws~d@VB[cGPpLٞ=yx &P+Uzcc!.A7gWPND=GTs].M׈^v=vt]l#5H/(4Gg`_-wf|%LX-&kUS(<@jț!}c} bĂQܑ/A{-23 3 w!*k(^8ӾtosaޑbNPuNQxAZ=Os~Kl>:*Xqm-H4s/^7BOaEhRپWRKbaQoU+ ' Oqﻁm zy_ޣ~Z)l!jzS~In>5 CejsBq>:tmPۯ.}.3u™A]m/H= * ?SŦ,}OFjiط~_:*Wy~2̆s/fP{P\n1dN40CzJw_: $W~raIH"f+ GN.f|#2a~h3z…X0SF'jO6$@+Zc/oGyBOLu!Ӻ,Fr_dlB܏[mP*%aȾnA^h+EF` Ƿ0Sf߽ǰOl#a1. d\dxa00ļ+¼͆MkĆ#+ :CI1q_ 热w [~om׍(kዛJk$d>cYsk͌hB֫k|z }vχ0>ڢcɠӁ&`ѱ)p#N`]\wb6+@8'h!!h԰Uj%9@[o;Dt+F0./uхmP =+F/uGe "R W&C,*C֋ %3ok|۴1tf ӝa n/-)@i9[}~pvJJ74}jgר66 }_FĞ磇.`eo2X2[J ڱʟ1]<&sz,ncwM 1mސI$%;(3^NP'E! 1Zl֫BMzI"/\}/xE<ߖaCO|bs(7х/md8}3lq2eNqUS X|_͡?n 58cI:z0]W|48J,2mOCt>[)cc֑ޗTB!;uS8Ry +_pl_op`)`6뗰mX>6(O(RbF@rڱ~ԌL>b dH}qn^qwR"'ZAګK:+}% cNA)닃A)nMAޱ1RɐjUQaW_0ۛǼg1ۛ]],m^ڷ_\F`S┱\ڝv7gWi,zU60w 0$*m}+]Sj'w~XbSCN,Zb_گs^]ȭK3Ҕ]q6S'N i@2 _e(yh`vcy.Ӳ>RGScKSݓXyzXS<Ϸ19Ue5ctCSpf3&zKwga߻uZr rC˲K  pH |hO1lAMex#E5A6ւ0aJ<;K;>S{&Fnbޟ[˜ 07Uti8޺,^w s/M ndGk=&G"o Ue;TjdAO2NXh|sD< }<X)5~;P-o۰wE cfg7XF_Qsƒۭ:=xNp3 )]oF̹Ttn.1T␭@I4?RMq=ㄜET۷![]S`~Jpr'vrGِimm[1Ld-y}` m<]dss9XIjI+j^`}YlU$fs&Nךy%9A|2NW? o #Ŵ-D-c겧}HWcs1&)C;lw+1A.'MJT0GtyXPoE Rcu{M.{Lak^ߚ;L {[9={+ rՐuhxc+ ][ T+~ L(TN<>T5\*PSJL jAЗ_tMP~s$& x $#-&]澈EAáVtX`~9֚t Y$yTXm÷ٌU<%0|H}Ω$c;Ehb~y& R*7_D A‚q}ܪ~ 2بHk!*R|Vh 1v9o?~rj/ׇ [+w cDZ0{d<3 f+) Nէ0;_KS#-<F+rp|J'DN A`pW=P2O)f6b$0‡FG`Ff:HL,[i&bfGMmL(ցAksa{Bh(~ ms!(6N$п|~.r(!{cۼ{eBEtu_&fg#ȁШgv$ on “&PMןv4o-/b )iR55PfTnWX&=ucLE,1~UmyWLIb!)q<C'͂ALx E>$^&Ks_e9.KmlAuyk v9uL/F tBS,k ;sbZoLi,k`b_dCuSQuT6S|>& Ó 7L*fm`hEX|+F_}QN˫ `[gI20\} c3f%V41]s>L,['0g)|fn+B5.{o;.q]o eig Cq(j("=)4Ż"4oP݆u˔Mx&!<+- 3%R%:Q(iֿKHOC7fVJ!M2M0۶ZGБU^K 6Uo]l?e= 6Tx"I*X}kss }7#!a5ߥmч.>́qREṉvSC#ucf/Z!R6' 9{0MC;+bBё'SjmL:[Ș+@-܈9Bb{јv}.N2& %< s^ M .nj,էSw(3K׬AGehDU`',$LqCgc4~>NJ)iZ0:Ҳ#;MnBĭ ]5(@b{{QuXx'RH) )RQ$ eDqm![ۖTdI|G<=:(rIE Yoy#VF~z-*9 >6и%-{f۹G (hdC X֞v>a3]9U:T֐3KnնƜ/wrc!ߩ,2fHw>Ď.$u1Cwu~3Zv67 xA{N@GHV H*X~Auyz&L'ճsoa},3/kjbN)Ԁn;ފimvY$2Š畟mBjw"u Qtyx|:ŠF͏޴ąsf34݉?cvN@u9n3!yKLMK[SHRxEh Na[l?4 fj葜uH'-_ḣ M;{O~k7T*u:SzAOAP#?I_Ul]*4pXOA9PВ7j?Buݓ%%L60ZtQ蘵@ቾXrl2$d-2ao}J,8qV =Q gT.b Gkbٸ޻ 0BzIq+!~.*ezBc }QxkG?Wj&}6,  $cC 5}/>BձR]*2嗛\dêfiq 'ƥXV$iŻL#čäĆĆv_6Li?Z|KnaTMvFU/f<9ܢu٩`ٽ-_hIߊsxs*e1#+2w*8,Ώ8v 0Cg =uϡLvg ЀW!eAPkzJXԄ5PE\Qsp'|/B:mkF˲\j*'^Px(GT*KXICzf^4(Vˣ{|`;1tODUJKpR*#l'M.>nK W76aЧp:LXj܅9;LJ63<'&R̿:0ZX CG*/Gv W_҂у Z^@؈3ս iSriS[~4dz^wճ /AߡB~SPciG /;vFCW;Nq,Զ>yj2G6|mr95CURւcr|X^8>rP8j(2[ӷVh0ډva Y7Ì<\8Ƀ s^L6)3ע`IK'G^=l{[!C®<»NKabd=<%Vἶ#=T !BIsIhK˄qcD^!(0EۘJ K{^(ms`s1F, g"E-2"^2Cɣ;n?"&s׾_fNeHJ~mWOQk5h9sEQrK #У[.b]UXH+TjlHHvY5h l ~ώRVz龐B ɂd>:8!XOPIٿ*LKʅP1_t"?zٱCIа&+>VNP2-w)T:~;juNBjV9 s()[G>r1մ۝t;4V{6HbUT_p5"^ŲG1f P)d}쁓uڃ005y҃?quzHf<$+e}4VpYWyR!2j̢>ecRi>CSn#~s1cI&zݟsڻ+BtΏ"n*Xq/2w+g﹇IaS߲p* ޣyڪ3{/ . ́>ʼnn&b;~Jt)Z[jahE]Z1e& V`3g1)GQxl91K[MILK5dߪ7{`JR*N҅X/"HU>D^w|s{>&Jδ)(Xm^jqʃuPQtFh5 bukP q$TPm&rA͇m┉C~L4ںAS %|(h B_וcfjriȶyVsRNS1R* q,nh+ Cr 0N8ե˔Gw"fEC%h.4.[يl$>0Г6Z+Ȍ1WkMx[ax0/- cųDVedʞ3Q. ${m"Z=9u9bgz3!XrsǓ (6mx@g9pEk<͠v/9_ށJӮ[ۜK 4wL)({.h(lAZKmS@JY\QZ3guW.bd$C Sx^/緺 NQb Ka9!$ϥ//HbAam~p{$WM~{jm/({^}81Hp5ӊvFW5,+Fè! 0s49Ϟ<ב_Dxzm:w*`ə[jw]+?H8&eU'- _N'V/7]ݹ}{] ilﹼGsA7d u*HebvWqV,8$8nvc73wpcge Hɪ^'_@Z- +uHZn8ANgGsczgZ3 !m,d !ReYӁDj;~e@:ScËnP{rܘJ.*]Bo N.D \[(Òzؽ 8:zs.{>"]^G_B!eԋ ,2׸j;c~3aaقG,h@'/ij4(hdKsvgH902K,Gw0c8Ϭ7:]E!?0ndw3]#ȧWr1'rAQmmύyx_ił!.rW*f^,v]|O$|>.r%0:?M0zm@}De'nCi%7ٽм^9[?%0X5%W +:0vdUlM}󖌱bಫC8lȏo 3=C({*Ľ WH39󥜯6 2] S%R19埔?^XᒰCFRE8<ش/TjP4"}o;,>CxF (:@I" [}[{HHkf/4BC ;qC|n[daon33ʝ/e';God fݖ"c67`AkaPTLY#i%J3&yL[`(;y(=>^[nI1K:pzܨ, 'S>i+^fA/cĨP1#9{+37MN2uaAޘE)$o^Cfv.!0:X |mS>G,~LhKZ윻Tt/7+9RM@wX q |Dla*p{>_N|օŚ"ѻ6@Hb y 1k 4ŕ.P@{؞Bf1+ @; E'톜G;/ w>`q%$?B7:[ S;6dd#]n&Iݧy|D?.Iu <9<;APNc &^w v.cr1#$֏"ḳXį!8?:(bF0np70Ǥ`/ٚKGI΃lX?nPS/w71[_*Wzd3M32jE #тsֲfonQš602s[/m1>q$j2#)GN9(MM H|N@S-lĔm@\G:9|d(fO\,Bn`wDz_4'c[>5(>x~#.f?7!n,ڽiHaRpRGXTѡ`HKk[:JtV:uHW< ;8+BsoCLbZr2v^~w2~h񁬓MY݁0 ٻJwmrk F2ͻ6 5Anf*.r,l&-&3l c97!jBx8 ag00wsuK ֍_d1%NR~e':Vӭi )19_޻9{V<+GC;{o1 Z<\0tⲔ>$_\~{u7:^yFI_P݊ɼPW۾7hDZ,~e„<+Nt_C̒בEc[$u3U3AN~?x4cjfSzk%0qj]Ę;` ֶOH^;Z >'{:'_W!LZ))[.`X<\@uk/A<ŭЫ/ΫZh?f;{t6*D\լx#z@CQr72+SHKJr7!<4 69[0Br[D.?~5|iMNB(0o Zy"a:BҖ^ lM+?@pf#X+Sx̸NO\N2CMپ}Bx@ rOڞ{Hi^i:mɘge0><# &\wVӤNmth=J}2ӉqJWB_ut\cKLHѢu٫gerBHeT 5.6[Hdt@7&yMt[1ey (:ީt-#@.q]#b"h,nݍy@Ĉ='G`5-t~3o7 o+OexHo $L_W s ?~U z0АW^)p}/@+|<?8GKwUt>Ap ,<,ɰ&DqάR 2,@u&]db"헁BĪ^xZs Ҝ)xý64!"tq]:1^wBu}m k5$0qiu/ƛMl ц q&QH@b_!)$2yY6cTؕLPE7;ߋnd!!h7T0+R0NM㨇9`w!GPF8w0.pu#. g姙 sn4k a4g0.Ha-ߡюCFUG%9dh~Aߟ%ˤ24ƀn]8)9ϏB vQvPI $D 6JBePcH8Hnޓɔ$iA鏟&K@TgrkD֫<+Tt2 9 q~\Յ˼+5M^;;z&ɡ3Ȣ^CsfYqۦ+:ԑ0=~ciP9=Û& *ib8l}3czdZdB-.z|4C璅;nU(S9*t.Ijv`6-lt \L {vl*haF?UQipCNq ƚc`ߒ jC龍PK$\ds'V9tխ|FOg!8\^KRwB:_@,Y_6I;Xve6h#!-?Hz=:(< >jRЩyMmN%- tD.s5xAS&v_K_Ok&0Rwave/data/backscatter.1.000.txt.gz0000644000176200001440000002302112377701075016361 0ustar liggesusers͝MvJ罊zGEƚՃk|a B&]F#[2~2Pjcْo[㿳ܶ?iyh-^y)據rUɰ ^Qҏg]V4Do|5::m<agD>>4A17L"蠀 nAQ.tr \ԀEG/aT3a}:lYը>-{󐭃߆E|Mx04lo)\,f"$0~E?tXΖ̍sB/0k8R\\ͿK?_XH3LTX)V+f*4F1:;0!YHfPS0\&e抻P gx[4V-znI3頚bL,~\q!\+LF\:HF)gn|ԧ;(RÍQ"Ez}6:mQjK&*XB^fTB>7?ͅFTT`؈:{0J&OU> ;93ҟˉ Q~x28ܵN.(v3R?W>ws!<;8Ĉ(ʌ!!h?!:;-r;*tj.d ;꨹̵j,"J ꅓE}Xs ٌ`ƽrsԝ2\$wBȮ+27Xd.+#ÃC v1h\_;k:8wa:Lt%v.T!.tPꟲё ~|b;W.LEنg;ӉpkcE-0io/&ܪ`n!y©孶z k2ܟڨB1P ن׺Y-R35Ys ԭŪq;t.gUH3]AgΰAFֻK>y3CxF3QR[dk$rca;"i|[šѿ-fuk C6ط&v-NU]؎5:y%akvʣTMCe*m|KSo! Oi6v.] مo_\i?4_ڟwӻVM?q%[RFj ej.?{[\1y)j|Z}cwuau/-$ƫNӾFaYn8iٗo{:=~ގ"<GXWoK Iu2Ϩ{x=u¯_m[ƞA?[h~j VBq_?a7?G\wxk}ZEv\'F.Չk’l=}}-0M򁒏ios*{Sؖ0 cƐ|z:k0Љ@;vAo?ߣFCqclZl{L~8El9-4%C0AP8svGݟ!V2~[\%e_;ӅX. !V1re;S߾ÌaA Srka薰N[Te:jUC~-Υ{:$ Xd$LaKlm'r$($R$6'Wi,so Ƣ38iȤnf'Ts)T &!h׹611 #j4 ¡i1vg~_1?ms0Qqjk6RH,h5KU%}3pw%V;*eK1;Y:Ybne+Xa NǍPJ~*Y C6 mK[Z*8 JIl yMKs`{,{8X)Y kc<T~J(4!\b=P"Φָ>=348XmG3FJli?z9Y/#$H1Ql:Cr{4"oֈG:&}EhƠDP0$7RVje,i}p2KDGH"#i5FjYZ> 1~ ^PDk  Tku0fE#۵=-$-`Z!p0KE p(>1#pDvD0h'0hR #Cs!C1D[^) vo # rJ6H|0DP$ E2yđ^"zSq/HpAK[kT%&( M[U슧QǿL# 0dMHcj%<$뿆F`Gk}1Wj![ j*XZ9`^ QDQ+|E9kBĭ줂!, \K=cQA ̄0V49;xS qn8bԖ$/@Q(>&f H X RJ6kRsccFЯg?PeN$"HgAݠc3b=FNėGmMd$ރ[nf8;UyHC{_I/?g\4+A9ԁ&GFHgiޅ8Q~AC"1I#eg:ȅg9IT(ЇYmF @Ҏ=b >^F16&Dv?*ae 3z(zlM8DB&K|tȻdp'|Ǻ`|tPiǁ𕬸 '#P$Ըjdh@a샱2+"(GI*\^!WiyT `_\uLѸܓj[&" -P& VHa=kLbGENSΐeƖ,%ϪQ F |TlPƽc[$*I'a(3+8#qO!m.P2 G0kK.$ ±*b2o X4lTp8Fg A/y>:WbHB~_r2ӳY YħO`2#3FynfPČ{CX .|ÝyPZ3̍d1(ݙ;h*G}C:x^vP EMI(zFCV|YMӔuH'D!P*n R2^%Ie)1iR^gq1"X(& s2ˁÕNf/+m93 1et2a@C,zz'ZDHY 3 aB ѲiIA 7Lc(H·Ζ$ ,e=mY&3RWHeNLPf&5 ^ €J^eơmX^}2%"H[y%7HQAt3XL8%q I*)Q s <$H d3eq'"zbk.]8T:`Ao%YK۞p_ٸ8#BRe _ۅ#a.!ZNw>6Djuۑ+{E9hZa_I\fP 6 Ȱ%qSb6~ L*Lj7}#麣(b'd^&ap*[ǁO ΂#?+- GЦX0#W1鑃}BD $Ƅ9-H]-xQ2 hc؋̹HΕd&h!u%WJy{b  qcE-Jۦ-a`̢E-}3eXhi`2SzSaGY`zJJkRbR TcI R֩YO!()c*B!P#i,' fhb$5)C$ #6SpQĶwx[CSbI^҇oSހrǚKGҎ<ܱX9>z%}B (wTؒ~O^/(ӖP$%͚4;D|L#0P]ݾl̒qoq'&,)_j }Gc)A0FCަ쩶feZ8 "o,BQh7h+PVh/}'WAƖ% ? t|)4L. F=P^_Yo0IP IV*` D3j)(c,,#Y #"7 \Th%*:.zhI.Brks- v,XdC,˶I4T!+#X"d@l}~$(rTi`njUŠFV#YHyϠ,@'[lT gp(Ka [R ҾD1FF9H:EV8ARsNi9i.5#yASNOA8 bB%KsJD?GZ( G(0OY«r0= $58,5x NZĥU{/Aw m #1 fHPZj {;-^֜ݗMbCՀ$Hqqx^ױ) _,{ |ek`1x"M *" O'V>ňm b0HKiX0-_jù!f0 DF,[Y>q8؜;ߑk+a*,)ZEw+NY!'"?&o h^[\]x@K.=Ƈ+\|E&4R9;n;DE D23DV^Xc0Ui+zAqQoi. ko ctz F whuhᜲ%{Ɓ|d(pǟ\49w biT"Xl`;40|{ 7~%wʄ;:r-6RuA")N5})7 SGȭZas_x>!DB9ލ"nv7QD8|Z,=UWc<8҉JL>[sp < NIP?f/xOxN;'^RZdj@Rhz"=־Kr\QU=(}VMӟ܇asqən8<6͞GPGw):k{S9=fʭOObSvqz=8ԟ̙y2;5tʙɩuw cR kZށP;OVx.<rUT@Y9!wX KEڀ}'jk1qD;tC{vèNgyDIPvkR&$,{..rIZ٩X1$X,  ł=>!8ȀW NLK⑴K &U%eobZ}ٵ5ySI1rP)r1>:cPRѣ`p1#(].*@XDAy$\r4B=ӽx0kwQ;1+oPSg6k͒-f"U5 cW1==j$#MDْvtCɏ`pO#:!&'tO+IEd h뾿j[^J 6_0ѣ*;BKG"}[xMk~@ pb+PsZs#قʍWq8ΆǐUuŪNp2lb}E'j-ꤲek?\x-N#gnQZ0Obzzb!!$0|N rˤ̴H+dBa}[6gH^=g$۞1s g>d,N~-_mgB3;FetR-))\}{xIĊqsrX (URwave/data/signal_W_tilda.7.rda0000644000176200001440000000540312377701075016037 0ustar liggesusersyPTgGD˳MFU<8<#("%"(&}lVn?ĿOmNzw93*;As|"aMcvL("L(9l{>&v wuh9L<RZ?cj[B%EM ӨyaY7u#[w9[rC]J_6ٸtҹm.-(rOJC萣sKǼ.ouOngUW.p`oQQ#Pg[s<Z^sdjwZڤZΞ"m*&>[]~uʼnxL YB5&ڍ1b630a@85;Z[Y ok8m{a'gOmS>ϕBθ{b7bڎ3ܧyEAg]zM֓zKG^ZevK^={nM1_;?Xls_\g)Ϻ2ۢp18[`GGk꧹+oFZOT]=#&@.m=ЌM.D?9.tN|8of{9yw>Up~+x.{o8x?o== w w / Oxyd3^T6PD~=zç~+<:ylyJ_S1b_pN':ދ}A_ /$uC.}UW_7|ERJJ?QJkRy'BZl>bpD6ru@1p\߸4U\\5rhT|Hyd*ByxU[wo oP~x cWˋT,~O`+#`;FFׇٌoU,X` ,X` ,X` ,X`-b##kG^#K!}-#} !`|Ť $ya$?ioCڋڑ2Fg2Ҟ;5i`6whGI{'&TLڳS6iobҞR٤=I{Ve&퉕K=$io|r%I+\I'=$il^iV&ŖOnb~oMcn<=Fnzr{&>Fg FҼ&*#JQi=4Pi%*bOLF{Ϸol H^zr.%$OJ_}N)$8W޹?,X_uW o-9G0/+;yQjT:ךjV<ʝ[P9RjCRC?U{:/V_u@` o0G+ y@b o1k 9y@d o2GOf:ȳ ]0y<@f 3 }@y<@h 4W3 Py<@j 5s `y<@l 6Wȳ py<@n 7 y<@p 8W3yɁ<@r 9s=yArE@u :gȻayځ@w>ԱJS yy@x op tmHRώ6Jfܞw&=@!yY{ʪ-yFNR{TV fOw<dGt:IYUZ$J]4ӋUSr)R*UgE)/5gl5!U;0F.zyyZYuԎUo+WUWXTYT*E"f=*+wnxo! OItҥK.]tҥK]p… .\p¿`0$A8pE m^!TV *uJFōŭjl1?9::mt LvM,@88@;+p #w @+ ,lI+ko=_;[qSp'0:״+VN^JX"RXdQz*}E%`Èh=1;#i,43lNruvv'`&D'`9;Іm1#0y|YSL` :'0U` `,0¼7yj&Rwave/data/signal_W_tilda.6.rda0000644000176200001440000000442212377701075016036 0ustar liggesusers{PU(%(G3hequ!f,i&PTle"FE&EHV:j)yn'4t:P k\SHދaviZ9{Zovf}$dX-=;cώ,~Z3?{ޜyK3揎x~xȌN(wF`zdtľ /,la3|w7q9B+W`UAӧ]%կBGԖعcQƩYXܺxڰ$1X꫟zK>|#aISRQSñς~ K-ĒKXYa?`qیC&cQO 慯*}W<8b2X0H_~vv\˖y7杼p74gF^ %? =6.PyG١\tm"|ycְ#w'4bᰏGX8;v`gGaڙYmﮂ:vすI07{[G_n*־c8u׻[xy(NR[: x)cK8?%Gl=߱536~w+ؗ8|;9[?VJ 8$;q{+z&R 1dڤc.›I:΍b8܇7P]{oò01+dJ۱w9{ yzܣ5x]@k/ZtN7Cfd꺢|kӮO+zpnC'Rwҍҍ^Eo*YFT9RWǧ_5wazp}Nn\fMz}=c=4H?롕:a::dڵ]'eE gyS yKOA>\QQ]PNSՉNUOL֛Y*Ud;tGǞYT묷xuwGO)=չ;OWJwtnMw7պ},t|4{}=9fOfgf"3Ez*򾽫>?ݝZ'?WU5w> \(aBwh BPx"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!M( BaC(1 HO }FWH}߮yRnOkmH}H}֦n{7>W^jyk^n}0~[ [WB2$|TSB=3ԐfLMO$7ϩqEɟa:W^T=XFaz?Qou]}x?g~ϼoWs ~dva~G͍OÍ.M}NyW/jNXG_) -/y|=_/_?ǩh\ǜ?+:qݸ\zEy\կ~U::q8YoNQ~fp  #+3;CKS[cks{_`u{@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@@>@PLu-HynPq&gLm;8:'d|= zN^eʟ>B,y ȝ>!r,ݸ-dƄUCm!W';c:$3s E?Rwave/data/W_tilda.4.rda0000644000176200001440000000314112377701075014474 0ustar liggesusers}LUܸ,A3 M- % \:|BirZ.R9e*.Z\qu5qe$=q>v/0=s~pUbI O>0K[__v, t 0Fpe8ȝkۙԀC˨a [lS8bk:Tb-> NF?ueQf}`"Z3Bl2_|b{@1~?ZA }fsDX?*D-c~9<sl^|>]<r؃^<pޝdjМ̛7;/su;j|Uߧ1vҪ?N+2WgʹL ׇug5y<@^m 6w Vpvy@o'8W\w<)G+o8y͑dULUVU:kelxհz QFA`nsku#UYHӰκ CqN-,a3ʔcܷ`h51+9ߟXQ Sh퀠spW"82r@DxOñWYĎ^|pT` DmU-agiv؁9REB&孂 :ɀ9!-H_&sKԼU^iR bzxAgUofh!H9B,^9<U2o-j= *0Hпp",H b-oX.3W^A bi([88S' pXScV-m|=Lu>.Y9C*8WH lS3(&A) yCkxF> =Hs4r/kI]I$\P|R|_zv^]uxx^;uu8b~uy=qrc%OMtIt ,d']fl^ ,AWW'wRz8}?'㭕 02bQMTϚb,JaF3&5Щ "Qap]r~H;g ,kYN|4!YviT’?崎<<&)Far~ g [0i?xs'I>j䑦'Ҩ z!3t= q:A`-_k0~~ۥs_wRwave/data/W_tilda.1.txt.gz0000644000176200001440000000111212377701075015155 0ustar liggesusersr0 }%gt1&X II;,dYVE6.vJ5NzTmH."{W%ޮ,Ճ{21ͧxe{iF L-P=o*9>!e9)JD-Gӈ>"F:^z,r6^2EHS~r7 ZմeMyO9فtwz;[+|rs8\׳a@Cv1u\GFGt2YHDB!BRdzO#Ix*'+o:G􏍩OUTqTщ-;ּt S[hdVߡ>XoXwvAk檮SrdOq:3dq'%PciF$nF ,f-;Z;hTjt>f-b}DF_r)TeyR]9L-V}?).YRwave/data/signal_W_tilda.1.txt.gz0000644000176200001440000000111212377701075016512 0ustar liggesusersr0 }%gt1&X II;,dYVE6.vJ5NzTmH."{W%ޮ,Ճ{21ͧxe{iF L-P=o*9>!e9)JD-Gӈ>"F:^z,r6^2EHS~r7 ZմeMyO9فtwz;[+|rs8\׳a@Cv1u\GFGt2YHDB!BRdzO#Ix*'+o:G􏍩OUTqTщ-;ּt S[hdVߡ>XoXwvAk檮SrdOq:3dq'%PciF$nF ,f-;Z;hTjt>f-b}DF_r)TeyR]9L-V}?).YRwave/data/C4.txt.gz0000644000176200001440000000540312377701075013710 0ustar liggesusersUY[9 ]Kt-'ٟqyփ@mVUmeraW۵߫ߝ5y,=x_>&wOf^~{5rv~i[f+=x*v߽۟x&+f 8a5~p>^v1xgX .3 O[ ;=ߑOM2`{;V wvE˾TLWb_{ō`"BZ%]o~98|R+rc$6y r|ulIX>kEh^>|;I[ 6αBv{ bF32\[HD B]y9N'RvIk,0 b)| |wdiײ(g^299r]^Ma[m#o"voy8榢7!_j$e4`'DrZLd`tgX)IS{J2,K +9`ʹTIg-7tK-2.݈ rw;˸u?-B(W;~prpԷ ǔs4T&rx #r6D"2[t y#]r]l%QVܸ\TAEش-}-A1=6,A 5aJ|*ߥNdb.DrRoMVJ S9ğ]%璒^OgRlIA!HY;!7R&2NdjWX$HWB*AL6Jvy/>MN4|/OCQdX\KA冕եngEa7ua{wXaܾ]W8ٗ+1k /a);@SRAT.RfoɩRq/EumLJ3J?఻l uU9S92\n.wDеJwj5r5Zњ $t5`S'؇_Эt XjJ$A ,~4[8jI6H2vB0ӅIKC8Ug^TIMJ AK$sk$_!V)cu7|r$5ufq4a8zbR* R\<͔?(*OWnt\FVٸ)/fP Fk+c1{9f)rnc2VKLbW\\fPM>̵ ,#u$d`Bm;izTJM5zfjma Ä7?pHnvL ᗵ|IKQ3?NZ2F~/ ^~^"E 6-ND/unMƱLkP#zuhDs]AT&1%_$b6 .d*P#"8?LECSK#{䴘-_jk.eoc=Tn foɼMq8Qc1DKѾFyO*|H/ՏќC!u"~ ~ K4qDNhvrnj0p+,>~q (kMp@F/0fuhu6]4~_6N37Kk֢8 ŭRwave/data/W_tilda.2.txt.gz0000644000176200001440000000133312377701075015163 0ustar liggesusersKn0 }H=}M[tnfO>ȔEQd'V%¹JߕɒDVI,˻BΡKk]*)Z3wH*K\ZP_4X!ibq$ƮZ =.N%15U䪮-]1ydo=5I>QZ Y'Je{[tJJs\z 6or$3ry LV吇խ|OxMv6,Z|4l';@t8Q(\kV}j\Iˇ^ż9t۟gkǿsBz!z!B:~\uK_vOs?osᦧ9݂%a'q׼f^wmG%WDm:Iuu_(G$R_|힬-R ZR.3.E/xYկFoNF˚dW>'xK6W K9Ŵ>Y%Է)6&l]M^.*,秥K}3IU2KeD#nm-E*u9eŒRk[_[/wERwave/data/A4.txt.gz0000644000176200001440000000541512377701075013711 0ustar liggesusersMYIr#I _k.0=+$r!Aڿڿ:7?6{U]^coz+\kkɝ˯scc }z[v~-e<b>.w{g.bP/`ܯź1 EB7ik,ncw9޳q:K1>oAo]֞ČUaxVM%񰉜8vFJ FjOc32wpƯ##!uaJsNE%mc\K0V&D'ҼY_m33Qh2kwsd_^La[F Q.$E pMH RC`!^:&DXDV*PoF>pR){vd*>ZVրm]̬<BQ q:%~nD˸!BnUʋ9M $>FH$2[t y_Nc /DB3?.]h$@&Azb$J_`fB&rv٤K Q"d]+%)(a)M A]'VU f2)лm@0Ӿh7;EFmc""XGd-5R{9*˛O"s_hKRc2ڞW/Y;4yZz*B8 x!GFUT,j)h `C*}k66 zr`_}q}p -,Fƪ`pmEwTҔ uq.6 =/O1}xb O r&˿hSr\CYow7.c%/5UCBEN An:$M$2/r4exp:/%ZGsedHJϘ.^^ iM8vK_؀aU4|xhf}=[>! :#n:,PezL,#A:B/@}!N[O!T}``<.b4VDUl7u^u&? 1d+o}7&s*ZZ@~E }r*RN-&!7Z ۹?0 +8<$SPMUo[3 H83/pv4=/+G=M -lOu3kd-'AWԏ 4Ɠ'ҩ4+4.͘篡(sk7؂sAȶzJȶ4l݂a7v~鼚, I<Vūk2z%54(oκ=iV-I/&n/ٖvhq7UfUŦ~1N08X%gp$C ׏W9R6$D7KevOBI9ہToi06)!Gүe\?j@>\vqf1 wdb3cl*vpmF5]XCؘ⿍Rwave/data/YNdiff.rda0000644000176200001440000000662712377701075014142 0ustar liggesusersMWyWEEK,8B C> h\G%bsyk V F ߦf3" OY|tr.D_WI_ )}V &`43BM n'з XrtZ8jN8Â. n8k5a lHO$ԺL{BB] 9Ӥj/=WX[!uinѕ 8\XO |NU籹*е'-ND[ўOSYª*Cp刌Y, 9cCu}y,òJ24)h(G7f#[ =Y~ [uq cTp7q<2ȧp. NtZK[n >VA@Umrwb|egW_s~XD"䭹 s׮t!а7˾1<|\[r$ Ƿl~{nJj||R_U#F"sl#=L@i#M/ġe8c6-ݰ) 8 2Fb)]Ͻԁ~j#b*MqȞTQKޏw"R$n3ᄺ

/h]bo#36XI`EųẐ 6MWfD>%zsק,>O٭'ߙi5d#r.")݇'7!*Ż @sZ!YOvCi4a Пk  fM;Chp|dhfHFV:0I=BIhxlxum5m3`wRgHB}߯+c'0dد6ֲN> elƌa+2|ӽجKźti 84Zݒ#P!;:gR'7WӲeO+HQasE臒|7\ n@ww'#ϯurCɏ8o2 ͛u\\"N@_!w@߬˄F/k'AޖnM0) ΍1w-Ws%]}l݂}[Sd\*)&E3eZ%jsRoY'#iXL,3 {j j= QU[314&'s@x|}#Pz3G^1"4:9CsB!qhfS]qMU@h҅%4V~M7g/YQ1Y/?xtėUu^K|J-]pb'+\]>!ϯ7?1Nk~ρ;0S3ɮ: ,*&)cԄyvk~gW5bnWM*(:Y `gYg,M8=t$K5( 1y}TsS❲J? c .Wc=Iڥh2fS>Y/7F]~fZ}3SO^7AW}~ꙷxsV}Dݭ~Q=S_^|#Z[ޯYߧ]?uuխUVyVo~ͼc߷7}sҿfo<[+们|wqd՛<.znåo m ~ru>3[mz?xUmWnVXm` ^^\u_X/=,6e^}XuGjCw.Ʃs\ֻڄ^q|Ww⺕s nw}z޻n"iʺTj=V=~V瞯>w^ڿ}xsYZV|طO6zeC oQ vx7F eQ]ֹimYku?/VȖ[>!Qnk|Z#+_.mƝU շ>E/MWşrSTWڻO.]wg;{<+Ba J߱ f{'m5Xu5ǹw?ZZyݤEuv⬗+)S<>]밙WoM{1M͋}ȍZQg~WyL!ꎲ ޕZs$x[W PP.-Ԛ5x ;[EZF#8ր8^'6E=Af:7*b!qrr/W?x u|s.ϭ3Ljǣ ܺz~FE_NUg[Ywi"uͫQ}.M=Tݾ*[0\aU@PkupTuh^?Ju2<+}{b1L]ks-2o"Ͽ>g?[wy5ԥĢt^\_zP\ow|u_FOBT[~Q@US?&z HQ)d:F2~/YdEViխIS [3v/ju=iUY_T̞`Ꭿ+}v8VnWRR o:rL.}~['{Kع̓#%dwaMss+9못ۍ:뒲ja:Rέҗ $%בG6ZoVYY/NAu5nT0FWA:H=o*ֽT/{"gcJ 'hd>}wS P*0=s\䄚**N{3%KP&pP:L]To6ZrԸu _n'[gQ50Vê@nɀV7ڡ-!:Wtikx8FXEW𽁻_oJ=ܨW}rkb~-rѡ>_?%J޸qߣuݶ^Hmmd D)גThB *TlOٴH,v]Y[#7UD>4[(_Ni-]8/-Vg]MPXVf^Q `K79I!D3l@r`jgjǼr;WC+){58wVb=s(D3=I0%Veq~A'b湯UMÌHL@*aZjtuاkAaSW(&LfGbm\; gmVY?IdWwpͯP%JϽdO|{OW9-=z3\8}P0+zjw7zT_ڽ#g`ʼny[9# ymw[N^R ɱ6m%:KM"vo]O~8Nrx:YuaLɦm8w*gǐaA]#H- *8,C_QzϸwbD nk`Rb4*$>6\`”%Af[@gvuV@RBU(:43?[_-lidm XP3ђvT61~rH{䡒X?Jiw8sG>)#봓d۞0d=2 ?7ŝytԟl-^Wv޻/[cjSX.t#7Iurhmñk1p=g$M[yU'$_ȺV 3#t2J qgS WqHwi>vؤ9cek]f>u렡EX׃hW4lUFIhPU]"oZ[AǬޙ"pR,U;BTh;Sݶ{t@~E?u> Ƥ2D ]fJzug}m{-r|z<k̩ҏZd*XM|Q!Vk IzHg9:, ON>΁V{ *7oQ|s=uU8uiR<鏢FT'U/r=(3JvPw3ڌO!f2/cv,\ o 5V9\˸grLHMX$ZW˰:O%լZZ7ϧGOVή#:znҩ;m&խ)C3V's&}҇fV0012.NR T}v)Uf/8ru.JJ MQ?3UjZgr+0i:}50B$u'Vofu.jq&1(Gf4;u{pH<{McÍ~j;ȚnDe.gݲnG'XC}nbse𦒩s*V'h]!sb&Wuzt\l2nHPZ)?Yy&6ww3AQIy&$ߍ#cc֟9@媞:e' J$6hͿsO7?|cVRW;uHC㊼eNU^,9ZZx;tZ~+jpJ^qT'Q`Ba3  @Еܜt0},#ⷻKC](h`RS)s2ץ_&~:1mxuTSOףᣅ;͠ +uQ&k}P;Cp[1>g-$;rnc\# >İ3j@2襠z*OVe_jY?E)7f'P餡ʬ6P"Ȭ~HNźtг%({=1Ey:emQ8eI>cVM%8ɔmZVW]{휼 |qzS^|w617T84Z~F{oZ(-:p Aĥ07=6ZK]daug)\H:؛gQL)9_?6,-@z9=Ŕc0'៘|^^ 'b9Q$'QOnkS3 hA6&̈́}x~>lFl @f@ˣi$+V[ꁍ)cȕ+bah+qr*^X (!nm&sx #sLA*$Q܁O ͺtX_~xeP%x1 _uvDPX-U-|"'0M=iw1ufp>?Hg4*P>APK-J qyȈ""+D3ک#W8n^gb b \u[KdVPZ9j ضV,%߅tD֚{JL ܜi3ٺm]zvz~CG҃%;/X/$.!23jR7H:HyFeU02yW*JpѭV thu Q4IkKa Hv-rr+Y$=i-ߐL鱖IoXPj]=[Y33o~˳ i chUH<ɑO3b,9ê~O@4?[?kIZ4,:rhSkڡu$Sl. Y"l g3kO˜r<,7 `}dN{ʵj< (ǝL[;pX5i] mKK+Shyi)xBdjt)=OI0t+Z~~Q^v.ʢ'S)`RII0/)𺑹7x[ N̆+ _+Y|ݿ}3}sg@^q(-}"@G?B$UʊI7;%u\>;ùHsty:B}%z hgp֕|{` /W@ ̷6G^%N [ [~u2S3=t7DdG>Z7_ V |}4/s!Kd6c_Bjۺx&K<Ź‘D@G 4uGηNK|/d ʬw{yډt#@!bʹgpom)!Hq3^9"&6;З(\/~&()d0-hv}'b - ~O妛I6 Eq ks | ˮ^gȬSn_p7OPq}\Y[D)?t_'[qоlcʴ9; Я6WZ7)Q"+=> `ŏrc'r,D6Ӏ($Unjs@60}p@[SĘoI&|a> i tMS@orǗpf8?ǖ/ :M`%;T>驸<+j4-2 ~s%8{\2ACUn4"y1ڑ*E!Cvʮ׆AR ŮiZT3f5Rs#DHšϓT:%iw?"O}@@4M "@V2XaKu HrUc~L@ي3EcMj{}0g;<[ǿ5t`|AȜHy-Vd|둢kA{O7):2 fIwggR2d~[LY~1Đ۾-އhsIYr[ތf]Nn9[-ߍWmXΝz f_Ia[6>&&m4/ S }KĔvٚʁxsGy9'Y6oA 1{nh,Ƒ/Sj+ Vx6}T :B6SD h+*-{xֿ]xq{WRϿ=༑hMޯYb8:W1!6lr.<+hIp/jp9X0!} EM }e H6]l@`7'w5zJ1\يcբ-=+LZ*:S˘. AƓ|Eo x#GԛWuRy#}ʼn)oǷK#FMr.S#{Jw4|EyDΈ (7}ϼ8*S>dƓoXdI IJX3S$)MJ4厒z:Rx`LgVWdEyw|nDV8 +0yr7^~0-cD4v2N 9VYTjuQ3i T n#r\1~j8KQgٗeyhjaq:LZt.<YJl.%m ߩY@=Z~Ud#5W:' &gׯH/oW +x"}&4Po!X9. ǩ 0 >pXh6ɐ[~ۃ|Ĕh ."3PY%unE(xt @]5W-m .;R'*)Fx@y2°.*)Qh2vߴf^3Ct*zQxͲvz=Jo $nRd vwL,YoPĹX}P򏟵3եQ (QpT;PELǖ>+:!.e; EMDJϻD<a10:\R?2 ocPD BV43b@~&uEy]06)h1ʒMv Ro^cSOM3wBoPC%BHO{%dhA{+3nEJ |02[SO{{Dp 2%Z`8#u?NS" P$ZOfw7X9RbP$Re}$mgI4Bآ-)ETb\)]Ps Jxeˆ zhrތ<4=WYge^Aؠm5GDdX ;}?ynr5?]ܡAG<-̒vkJ0E9Jጷ.|_C4 b;zI@KRw  %?ATJɝYl ZNowk;ZTf]Խ(#:3 CEұ ik2~A*^gDƠY:@WappM/{iRDLt~Wz6:Iz#㵺=A ͝i_$4^+}kA@^K'ыM' 3r3E+s rxx5߆!h$*}0E袡l:WR:{JI h4HH'*\02"Nμ} (|z?7[_7is<黣?bA QiVe]z/0VgSYۙTN%$ҝ_2/ ^D:0Cј` 3%u^tIu׈nԳrYx0K$:{>Q)kɳe2OF, wN5lS.`S yd_P kUl^DOE6p`j毶buy,M$TmiK6pz3a$Aщ3%HFFm!̩S{3|o -9+9h[N:1WU|&ml VoC9e7Gl>;!pR@[db=Kl9UWܒ]s;i'ΰGf3{]BM==!$t5bȡ@{p3\*/c*T~g{SǾAnoG %=ީD-%kYMg!Дw7ÛmnZE d nj?zO`bPu3 }`T6iPM/IEp2/RDV/4ר,|S-T#ܷΉʀ.  v3'g"Gq:$7{|# ;s`JxM4@<}ЗIA^`J#͎8\रgrW>Dt :~ث.G|*⥂(2u;CH&ߟ Yx06vT_xԝbz&CANVI&ZX"*ragٖz!}Y$ݼ콼z _G MQL蟀?JȪb-)/K ‹=+|;t[}b#W+c[Trv`w3yE/J[{ B.p#㢺bl/2S'+y ;Lat1kϠ6B_d{캽3=Noڅ.Yk}]oYA}łK"&&j-_(3Cee4ƶyLEA"p}}=ag̨_T`/6$+܁]ieg ҃xijyEV:4Ht=3@`ݚBiF1Jn6"U'Қ YŞ 6u.l^!_jʼv%.G| 1w&} 1x5MIQmNӟ a*1RMgAJmZ:FN!U쫃XSZS$کLh=K Mg9$N + 6~f&+,dg!œ.ӆliWaGCKŚ>Ң#\|Z|3'NE z(S4vCm,WO=.DLJ[Ȋӑb3 yΣ*' Eŀf.ӟ:dVfӠٝ]ښ*`YO/yWgZ3Pzxh%xQ'ᤶ$w_A}g\nϥ;:phoU,ԭs<`Ȕ.\4 ?JvLx h)O]#v;z`X CHDFHy"Zg#M VŨ坵4BF8c:p((R8X4޺U Qӑʰ|*ďՏx>7/x.}$\QHhPPF9[4%mC@ [ߙbO_v&AUդ)LhlQpR ?KF<ͬ:+14"`-6y1HǢWI salď>0)bKX7:wd1 a a0L9f$9캡 5x =iޙ1@e"NiCV zN!,Gp6sr_*51]KrIy>PI%әđmFt;sSzugv !27O rޥa3b%/b/˔FD(?4`g`Rpx[KgȠL8Eݠ%r Bs0_Z]|Ȇ7R!}0Ml @yk#ƏѴiHD*gYmb/ddh 2{ 9Y08Χ5"Y^iC kz t 9{Q@˟1lS * i_&S&97CjƒL@ s5e#039(9K:u׿@vg)kP(̠K u-| #妷a5hZ.6E9E 7[o~ŘT8isٌO|t2mP W5r7he}i#vU&徊V~.7Uj[oFSyDyM&rbSPKVoe_ws?[iN#d8;aH򆏛ʰ|^>#*jcPCk'80G\u6jM!IZoQ-Hߜ hlyL/T4Wʏf;nMHMKc{~ 8*gt梷 PcB5s`$7Cݘ`aaDͤz#h2r39GFԎfC6G~߬ˉYϠC'C+6]:P0ۗCWk\WE3\|3@?]9E5qc;M9ٙqol^kz!uW 1 GL|'>F:CoVHؔ8 ]^^y\ 'eQ)QOq^7s>!412880rNxNoB\R|g27j`|*0B~"IIkJXwg/'GhN7k\Y'H'թ8+g!-;a8Q{#BF]߸D;N:APnO[)'EܵN&<; { Ώj_L.JY~Os\W,pNx8+3l 8m;CU]œ^DjYR61!6SJJ;0eݘJFi̭\\*{e 82BЎѦe(#.h5`%' ݙ:F/=~MXS쁊~MⒾ*{E"~rm<|= TV=Ӕ~/ZA,l!(,Bwt4KѴVI/IҬ~ޑN%u wȇdTzhMsϸvaJt5B*m}+ ˓/$s$׾X~v%DnE~qjse=_ﲴZA1E}.pI59{d;)ֈ .NOۡeJH1[~^aP"8y7nGjRf,o3ZJwȜ{;)k}8Rokflܮ8c'( ]2|f ''wVdvb_@/tJ`TkDCh$ewٯ h޼Wldj- {=a6%)ж##E1KTخ5) ܺI73Nr^xU|UDy!]n09hx{/ k^ylQK eK)A%ƜO#C ߑnjV ;L3>/-p?d=_I[(sSuŔwJQcg!SEma aAsSw sիyњzT2V1yNgOuLaF8:$OOz 'ϵ";h'6u떳17L@#c' 0&Šqn='+p6:* 519m=\7}W w|IS=B,xSYuyƾcCk罙E8P]i%۬6D(P54f@]'UmTo|Ri3Tl=Y&OT{:  C7|#^?"+g6CYe@W#*+[0Xl링p,+cҏv ȲZf)ug?n&JKTj-RM8WDʫDb:/8 ƍDF lDާQs 򡷈r  w\ nӭss]^nCo\<(?Ūi{5̡5(<'`b6;t~ @@n'a3inŶ! V9_{.-WޛVzv#ir1Q8R- coIK*X)0Ul!wE5n. 62Vc"{ĕ֐>QrF]k^p_0XJpM71x%㿗kS%p s1؁ۀmpdlr\Q4N,lf' ejC /ޮ0Cq0m:Jpn8`L L.ԍչ#Gnjy' (yϜCiF6)+`d3[ <Tg(5t4׿6lH/\/?z1⽭qX$F7" o:3ZT4E&*n\N-XY;s[UcǬL+ |ew:y\VJo:_VF'X#P}z8h}<7촨vUU_fvE5Uf/lKEw1*QJqe-x ^E_9Х Ċ`\'"sп@"eR/b&/p[Ѧy:SEhϴx> 41-wA~{aψ`fHq޴XEZ|{)Ŭ)srZ/N՞tT7~pz2lwq/j8zWJʗo]ZeWJ8YWB-B)1'i],'2c,C(Y/R_=z|@2[G9c%ߦZm!v͍Z$ 0Sf~N pUYa]ʛrZ$*zcwIȨةCkTMpt> 013w;6rW1\V2PV£TN%dhİ8A'jcec:q$r 40GE}!iPY-]s5:J)(d**sZ̕v4J]rq;m^:-.Fܭ*TxGMbϥ9q]SQ Gbt?/.ݓ֮-lA-tJjμ3^J?.8ZwB쁝b{z}fTggFn^;9&qщc,th^?- o* إ 9FŖ)X@(B]9m9V*qk@6ͧqF-&cf]ETD2̐J'ۑ:hG|·#wW7?0PfG6[iPČ;-lPUrz+=}^}mY]> H[ E:x ї7-TW[$SG-i xd(jrWdGh"Q^MԆIeʤyҭfcg5MҨEO:46-AXCZ`gbOÆZքXѤdn3RTI"jFT^bsIuÓ_ w"~b# zOӢ SШH}wTy裗0queoG3pDebZAS%) Ym4|:+gN03GHF1zq-R9m}f ;&"waa(up^Y[A]Ș5%%h8R3:d"7Z\.uuPMfSh.u,x{jk5xAE2x0zҌoM7!OR@no} "9ix)[Wqq V^Tl9Qgt\X X-=7ɶƎ48pNU8}F7chb–]} o!85ÎSٱƸ0a>/3g`~i4&J< C>AqN Lc? ܡ[~ot +Tg־CHjRG@>;=USO;9uȵ۫i.͜4Ij$tŜF|r!t\4QExXlUV ? GsWf ORQm4vD~]V5߸nZV ĵ[IQYmW1POףd*9q_Կ ;SRƴ.πynI74ݐfjی" 캤zLR?c$چHUb>4{`n`Esg$WנFw\;\B+yW,s(%F,x߃4g3&!9 m.yDeteCL(H$gDŽ3)^%-Q>ƩOw?m$I\&8b> z\ A$)KV'QF=1v+>/}9CkɡSґ_` ~'fmtɡ]y}O@1(I%10ᬼw  dݑz& Vx3`DeÜOO\;`dmRg"'%'xvRHX"}2h҇\Pq&iJ㍣ u~lZ)0p.PbC8i>y {)pf5;蘏5 C0B~v-ᒱF@)B"\|+mqXPaTx"3#?[jO,F >rrc?e=3U&}׏~TPx㎨ C.gWBm@e']FEq迬wf/XoՄEE[k3{0}:Fv8RJ!Чh=}ZD-d-9nD(;KھwcP՟*FZRO&ZLi8d!]7X %"t̑'J_HAu3~Λg4C;eӐyމjN9ryOOjt˪Flphl/^T3sMf-hO4A\/A[Ovn <}絓zmf gk!vdOjH+OڟFaK [mKvJ뵾| WNfUVt7M`*OÕ.ŏqRM%RP&(LSYfTDhGdMf!i)byغ}4 v*ә-i @ >&6W= Ǜ=:>_Xw\& ~$mퟖ[ƼGRsZK]C>΍PǢ)ԌJf{TPÏeaz2xP:f'"M;fpd?ѳ.{72/‚g/,!O@~BB0@KAeb 48","XXH2GsKAOߗFDz]dՆlrB35!R C΢R #uB1LtaeX*4nj')YwDIPT|WҨDqYۢ߅Z3K'^uWp l6>+Zۣv?-͞0D;D](=/: ?/2];ay0Ӹhd3ڳ]4M#說ʹ&r4aq 3BfRl -9"鍒A_)BTE)CneܐBVt80lpqnzA |Fb{WMXC@UxKTƿ:g7Yg?Z!XfMmZ>U#0$>b7xEvZmMU>cFX;ڙlU!Χ9z{V'.j9  DՃK\W$=ރWO *Up56¯ &Wh;?Bc;3o]\*Ubz<-$VS/'jFbw(ǡ>дf*kω[Zh`K{oޟ̾a'5)v;ߍ`ڕ׉Gɫ͠AǏn(KI ,Io{.`\"O^B(k!;1R[Miϳ.Iۛ}H']FxT}W໿rtn{JN~#>渝s]N@Yӆt\7w+ߏ%W"MFa>|vFZv"\iy:Y3rR,`[OjQa$'S's\|#ARXWR joB$=q^ E}(qE# ,J9#FKt5rI\Exq;oCUKDW[g_D^~#,<-v>~j ?Qڜv>G-Эz8 5t# ‘Nal93W#{•kC @qmz)0y6O@npTw2<1Y;u,b*b&τsjr_IH\PwߧVfWZԒ"olbʤr,Xu|w^Q/I3NO*|ȋ>29&̎2 Vl'~9)2n[t<. 2(t |6D0?A[&gi8tрCԮXKX?tN7g֣~1_S޲[;Exɻ+B՘ ;>?-N3CBEf=2Tx(rE^,:S m>C%nߓmCD(ԕy/Øb{"y9j7"ޭ=hON DGA Xu%w$,J!Qj<+Bsi(!n~*4 WڱxOڷ[g}i8T&/Fby%n4@UitdN$x,}yh1F+ a|@=_[3/ <}+ wxF?,=1.Yy3ÎbKB`F9i >6z sOHkT-7^lH|x;"!>c2mcfZ7a },@cfL/A2]ZVaoRx;qt>Axy; &9%FsM@KmT`D85C(\MV/~v+\pp=dXu癱7*,puAh*cpU7ySWyFI]?{ҳ4) :u#gΜO@(FIg9bȠ9Jۅc ι4g0ΡK#U`>T=5 u"q~RCX=糳VNPᙏS_PAhQ' H4|ilcgQMi)@Sk>"2"IZ9lPZJйڨ A!`"Ű"#}Pfyjɣż%]6m&=3JD,2#h#R|F8K6}M7W_Bc](! d ZsC_> iK ˿ O{_ThgڰF&}_ 8d{c`FI[ϞlxF{~<"5CZ7#<Җ; = X>\Ģ _iXr6?녙!{JG+EXՉsdl#vq)ZCu15y; !㬜R K{?T J'KڽixҬ*F1L+/. y#2Ϻ~5c^V{_rWKqǰ>iuyuEtfyjLƤhtTnbhZBW9=\iY+Rt !i \dD֟L($zz5NZ_ʈj)ɋ6/[Lz!B_C'7.[3ۗI!j';ב #"ƈ}ڎ ˘vlT!'Mj]7"|db<^_ATs?fIX L{Q0<6I9+9+G94|\f*!X%vҡcMl4NljO"3*VUħp0SmUL%nKm]ȯv`KPd}Ƌkm_"u2I.\fF%VhWj} ?S) UGXLzp0ЎP"%%X_oaSǍR'ߢ{:w:YTJw3;y/gx8s?P_mA{I3w )G|"chZcz=I{;UwP&S'eObܔH.Yf+҆,7Χ!\1w<{-XGL TW@:PVjުlP]izy֤=8aQ@T-L#3Gr6h@ R aŃl9ba6}O 2D+Jf@tu~yϧCĨ.rēK PrqCjiu:9~?=_*9ַ m'ηUqC\Xc(=UHeP(^ lOpt2xBN7сC]gfz J`ENy_*HWّJڑbؤ*lU@]2#f[1N0xO*TNtt޽ pM{VrWb|4#jOtE(RFV5sT T>#ÁGGEBFB#c cKo+Ӂ:ucfRF4rob'=3ޔHICr0<ivEkL<܌oG˥.i&PُdRYީ7~l R0RG<%v4K̭M|b~þ*h#SF\ \, QUF @O?rIEʫsotmq{R3;Dz(߹J7Oi=Vj5ȑ !CIu~qQ`cTr%#ĢSIJ*uEE8س]څ,RY}yXdu@/aR_hӐ;34 t?0Uv9IT\^~cDk8 XmPntִ,GZF8R7"BP5zCqia\Qb#{ٯ0p@Xz|Btg9\*;X JuN&S=Y@BKi9]JޖN3Z}&[}Ŏ盵AW8!] !6ڹfCÇ"w.$?9W&ĝ"'Xθ)~!" RLO;QPkgZgy}RX1IR)oO@:ȃT]:ԩB"0zzݜ>$M(C*j *^ 4#8@ۅX5ͫ0dHʼnX̾)\u3+q Wԏ Z@O:p30oz4 ۑ!5 mu(&I.f3).E{BxUpOdF1deʘ|=}6-aV7iD|j51$9@9?a.U(u*eψKC·Έ!3)"C܍'imؼ_޿]"iԈA|'+$A t| q$xkַe_gʤzR\JhLYGDNzC> t_MUd m@..)"W?]7´;(U _A㬀G幙 h0Ƥ}|l&E?EwMdQLSgszu7[c" E9ugߍÔQDן4E4:u0f]ߑWIk\>9H%I‚JL7fuP Dِ؛!s̚ӫ ⥏Ƽ ۹058q͒=3#"msF{߾l)Ж b=vk8!G>M"<+lK_bvY>A eMCĮiՈZ^ز p̖}7,m؂ޗ* YmS vj>80 TB㉎6PytDuȧe;E?ؤGnisGdQ׆J?}&~~6$mʊJY\K <)U EJǙ &>7gVtlR8/}|*+`pa5'1Z)s.94sMYvN}L8WDx-658/r Q QJr\7sGY@c7RiNW,.ZZK2i.r7V.t!/ɏz@B= 辰_bU$VX!;V準㟻ggDp"*PN;](Mp-xޗ8tа4hj:CcU1<M:= ~㯟"4Q) j LưasC -^LĩdBK:zڨ@I} m,E>_~4;|}@p7l˜Ѱ#+|tA'4dklkV9Ƃ:?c{7YJ}G%OMlU50:z bp{B@la#u`I{CѮ}bv$ϟ\)-e"H;(?nK- jl2$CrNv<|#"OwߒNi%#*C1:W7L(ל8+r3JߊgTi~-UhO_ eɁ ~~sg ,Ȯx4WB/tZu)2{4`3zчƣσO酢$:b"'JKN"ׁݣ񁉦R&Ba#-P~{R+ yB`춘/i\7=S}DS T[_aޮUpżrNG K~\F7cŋ}3"?Il48w0xӧd=GiMX-;`ĴF\ q̬E0;p<."C;'jb]HcVi!~.zG]r5ܒyUCQb{lŒurگf4V-D4%ԍ㥷\ݲv Z B2BTirЎŒt˭S**j&RԈ`ݑCX3pO ? 0q>* }1Ew]$ $X [H];7ev\+f䝕xo5Dr,Dam 8PVwUkށ|ʷz1KZNwZ8s2Ѹw*tSWz CϫfU0p=0FFOV4Ji?m˹_'{T3VEuUaܘCiuIf TRvfl0pIhPv֌K^"/SU"a~$|_kq{!amSFZa0@ 25<Ɔ!P9k#x}ts5>zoA[F0c'Saӥ5dTK黦-ߏ}Dt =X7F O,5ߠ8,lDW7BѩX2Go=M "/ib;e׵HkX٤f #M $v}O@:g"b. `$tGOD Gr{!`NG8=tz+\PG.$AյߎGƝc_.2>IN y [/24_2-_G\_˴:>Wex2vGbx5]: Q4O 1-3-k0quE5rDaMeۥOS[̀3hk\b+6fX*:_c<%mOWK<=VR,V8EsjL]{;E7-'TnW# 1\$k+\F.-ɍ˜+)<.}+ɬV<` Gd C 6D#OT0kד:*XEUO_kG''ɠJ,VŎ5[b݁ (.}M:]MbLc|2|Ζ_ep ;Uf?WyXx.?PgSGfZVnoƼ2 #}5/ށx)&_s|ΐh6|ɊYa׹t=+vw{#_ͧ3z;{ņ3`c3佮 sEUˏLgSe-=6iG GZ˚Rw>Ey]QreKA{ÊfyGCLb{+ޏgsHa%F#jh0DwH>ȘUp\ҩ;eQvյyz"/ XoE@+f,Q1A\Hպ} 6ϸ(d?%i0-W|(P1óˇ >3$nkWEM3-j?@0d7;r(ȸus2 ]N(sh"jiIwfqxsBT &&xp’7SÑ{lJ0 82)gטd3z Gsn Q,9NOWilL7/:ފ3M;3=% X00Bk {`Ѣ'PWs{ 䠲ǞE Rl[oU@}c΀u徭e5 /%6:8Ur(5p-؉Z:֙D;ᓟ{:ӀjQ̈́*|M2(Ezb{t۷-39lP<D^aQO$1G';͐pgΙU,8U' zϩ4[=#E(98+z= !yG:xHxNmQe8OGusP-K h⊯WW-}H|4ÖZda?PN}A r%FUO|p#ax+X_wTY8 l2ok/uH+Ô>`) i i`{e~\9::# 9x?7E#t"a[(#b%sJ45D%YW#HqftT9)o<1wԆ4hD̲~1-g;{ ą-C$vy/Dq87<ז@!G7>C/*ɿIJր.YOic[ @wn`o^0߰SJFI cD?=J[-`ZXg'ncofMAvZEӼ5Η## [7:Z@2Rwave/data/A0.rda0000644000176200001440000000377012377701075013217 0ustar liggesusersiTTG+.A4F $. z"^(5 (ET\ bApm0:0:mnntWCno_~lO髭ŪU#vpO鳙tb,f1t%#>o:~9cè6ϾJY$wN4tsҡ"c1w;*~4}8hFס>u!(>="aa(vJ?k\+ A=Jx܉G*V_&Sx "MKbSdo8pAdbt";dynDh_'#4h/fy**!΢u"u.5”iK Kż+ׄumzIg/,9Nd:. }M=tͽEƆ\n/+3oPQQ8JIH& *n2ivP"y1 vmbmxRؽA y|yn̟^w!d>2v8۽i/}s w_n< lwμZd]7RɌ N+M 7WzݯQWsfm7LEAO5,Zp5u I6:+.L|{dlo퇐5J8BL^psT~B#N8{5bQbfTD{B9foakQ]!%|+R- pӨ2ՕcBE+ʆk{םrYтgؐi+`W9u\s֩L(]m }(NQkU~ z1O M]^P?r`0Gր($*\w4;ODؙV&Ik=O6u9K#Hix9^̋bӺ,1+\'+\il"7#Sk2r_zko6QL-tSK  {epQ4>rnj9P ^ZRsH"(A oҟ2*ϓPѵA=/VG=;.pxS b-WfdJ>W>< ɰdYrp]B7),Lnց 41U6RB&KSo W$鰵j.g9TuЈ1\1+)ˑ+扼Ke"r}-WqM)ƂDUlĈ<\k \'ߘk+Vi3^2N︡2lal8i(a44Nw=w Z>4Y҄(`w#D%J;߈ W{~i)HW9B1GpKTT*c_Hh>Sj߳>̱Wr{$yۤROFd Env`@'^.샖dhĸb&%ODz Wq,5.RζPwGX'jz1b+>:\ź}ks- Lr="VLq[ Α2O8FLkQeCzlf<ŮNlhmRytZ/YM`m:ޜp}NoL"[*\GOɜq hKחƿ<ϫ7lYb,f1翋%1 Rwave/data/W_tilda.8.txt.gz0000644000176200001440000000256212377701075015176 0ustar liggesusersI#7 EgbNx?[jvi$8DO4k-rTԞeC]m]m j13jsѻjVfTh ]MbyB%:jBVZY&mh l:$16:Bve[Zc}NYmMmA+fZ8l9'Q6 X- q[phRKAtf. e!QD%גE JU{]m]dzu*M?D~jD)ڸ5DS׮-xu3m7~mYxeծn2hYWv[^2Dl#lUS<=3C^6WIo̝wE$qvEXEL["WE(X7 _Ḑ͘`B6q|F&Y)k"zrk93Syfrib/@CWZ 9epGiP~.ٮveɮu;1;5 qG%+(+_jʽ:UHοRՉ,O$OߙYdMHIk|)Ir,9y %kآ4.ǔDtjMmUdkMhܲf!\NUlWNd}KZ.%%X7?4lM_o%Rj/v*5ovs v '^|_lП0oGxaSB-4`H`LfLWaT7j,t Lf^ F QՁW'15_vzg:LHm؁CXbK;0~v go܏5*ۯ1UzRߡDŽ߁$eBK%v}a5`]p@j9캇kMeL0u/ r_B+s 93:Cٰ̫7f)C9!bC)i9I—C(BcFrJmN y*yauw`X):rCX):X}jCxʩi:ʧC۩:Ľ*CੵNE!6᧧i JC+&4Ǝ% ?{~}r똹8}yW\k'=k5Ÿ?s11K;cݻsfc?Ƒ.=}$׹6ggY+ bswCW??n_W:@쩏klE)#i=ECw:$D(]tYIWn9HT>:GP&r\nNp(VS G:T6@^a6}'YT(>wqV;tkOޝ,-skD 's[K6e#yIsY G\՚g b%i.tSy[  V~,Mnl RIARr-s־~uM> JbxBNZۂW*=nNDTh 2e;?*[6mQ{7IP\1kJQ@IHBvnx[@.Wϙl)܏Wz&0:x=ekg`ؿku5R$ߣ$[H1Ȩ|- y:if_ׯjV렪#2:UUq6U3͵x<[+ |4j. ^W{XSƃ^}E8<>5g'6إmÔr;*EGu@4x38=d]?0Ii#Do@@%  Ҥ߷@I)#9*tV,M{OU5 50.3"@:A= /NSLcc#mC uVo_1R,:jcZ EBJaHd;f~5S_ԃqC2Uc ]Z~,8$wЖă+^vC\B,hV:.UGvBI.`8^a3?/޼ FY:. ;6\S$s}=mQ\]u܆5mX~z p lY"wO ID&)^at-lG<ů#.+dU.46@neERPSu)NUyE{5~KdvPX#uuUmt{<0VIg r4rl,Ϋl7fr0B(Aʢd[Cn&I,}c̀ڑP{FsSA^äJ(ڌIY"KyprUJ KEMi8?+:':ILY墍ph.:vs+h4 zix~OGAL,+͍6B*('urJ)nR(v%\YMYz Nh 'RuU17AJS[9vkV,6/u~9?amӯst_~n {\5_>k/; IĘu;r5 s$6ԋ*۔a8.좳O%򥎥jiۭZ!j{|H4|i=tS$]LDkfYUnńg'N_% IS!'57y­¶A]|+U)5Ze>pGeEhTJCl*=P,A?[3j _>nj"Ǖ|T;i 1s.LsXz2[ee{۠eW%6Ķ_tyR2&=ņXiecTU N[2ݠ–ib3mݼGt0 Bqi ;c,*T>] do qfvQ6C6ٮ -:b|p- ֞Ƌy3Gw=AqFtg9V*cgv߰ @Tp+젋^u3Ks&szLkM5kNi}*ZxuYcbւҳC}}{ޏgFTxt7n.T01ٴ;r('EuɌ7bAv2 IԀTy fs_ ;`.]ImilFdo€ E-,>+w;k2ҭe9Z巗b0RՖve`8k)O#cg+_#b0So P2,yG^`z ~ו#Z.Q1.9\+QTzOBɡYK_s6!$X6қxc]сǠ6gD_l1mB~}3,TnIsj^ofs)i*P.x/g7zb?L |ϐLKيM60+X:>w'2^Ǚ e( Rwave/data/pure.dat.txt.gz0000644000176200001440000007134412377701075015173 0ustar liggesusersIKoGK@+UeFo}Z_|cΫO}}t>MͿ7mӌuo9Ӟ߼{7yɧu7=V;71m=~?^3mۛ=_~mkko5}y_~x?skO߳][Y?yFӯdď{}03K|31NX-䜟ގxǖo|^؏ōe>:䒮[cg_}7ث_nsx3٘oX|~7_rƊv|\8>Or!?^ɍ襏XlG;qcۼ1}mOvIOz/ZnqO^/ kui t t Y?}SUh߾܎qٗ<2 \#7o ks[3Fo(-iZ>](ьo8յ}k5ٍ0|aռWع׶n|o*ϻq糵Z8[ھ=nm~\4]a"S6w!tυ] @SB;8aI[s/y\_#ri k8`޹c& 5V\\8r:#.(>X|ۯՆ-TK<7vębnZkZlb } Ή[nyڜAǰ&Dy·.i^02f42;% LC1>[;Oʿ[8{7}O)挴ikfe e^~|v5,FmG'nNlnnFqxAxK;pǮqok7UБNx;+VX0ʋ3´g  p'e|aT S9h |%%[u;t@!VݎUĻwlᴁzl g8VN콼&q4MquK|u3RD#柄mxv};"q&]xw3Np-3#dOsv8%#^ou㫟O_P݋쿲!Lk<7 nL0\y'>nI@{O^)#""mE1J[[=iFXt3NQ.uXFҜmUwۻ__=\:ͷxJf0;6y/v<èxi\ c? 6gHjyF雄VgVgs)a@1MĈc8ջB+=ۨ՟3:Ӎ#׆M{/.Eȶ* e SI]FɁva |Mް~O3ǭ0ZFzT+L.}`r 7r65#FSé:6.iMDo7gm ŃlQc뾌rx(%vgw9ә~rMUp6}1;\8itkX2gG~OLmBB1QF-}\pUyA->}V*8JXގm]Farq0qgT8ibK[DtNyͦDs"y0slt(-,;-?sl&*|RHks@8EU?vS_OEբ|p>5ZU[#7ߎJ}Ê̱ sDQIXyoqw\(²i^uuBMR +onΟOKK rR=#h.i\ZM'/~΋s*I_Mykzj(z O{F|`6\%r0769 USL암K$*z +-veÕam!WfcWRXˋw]Gi82+ɿH %aH}.,wa:ST%盾&}y]%yJ]tr- d)OeڮbUv70w0"ޤ֯FmFvdmP#8ja;}"2J^ƙbtM'}aQ.*z?9oDz&!%nw#VGEۡ9^aLgְZ좿y,=]Mf$BIEH2VDp5PݠZ F nBĵeVܐeVw Zh>*񻾟#Iȴ ǯ:{ [X%Rڕ{raK3_Gg1ZesufaVߨY@F*'ʙ5Fބ/.C<,e :sCXǏaVǓN@#\F,=Qm&׉:[.V.wїO/Cd#MY"*= oܾ zN&|}ިvtRva|66)`lM%j~oTBꉾRSp#ظ %׳iujGw0'(e(Cbs >7Oz*o~zSsA0͑o˛7 h!2$ᴎSN/kvÆ.yᴆ+ 1͘`lFܑ)SwSvAqfyjcrӧ*o+@u+ֶL-75 0C /T1[t]e Nݙ)-\vsu6!lDMxvJ#%rF Y;Ztb8eȖϭ"V.J)"sx;AQD,ZIu%&H wmɌbW߽,/Ԝ&F8mT'᯼/Tb#׳;U/Q۵:%HTϙ'7Ϳ h8gr 7p|Db8ca4ɜE 5zel^K~p*v{t5 Sm.E~ÑfV49ZmuE)^ۢN=8?{h^d)J05U4}Ѯ5xg\257uHhWߋ Mg}؅Eo)ܫʶRZ|2TABf_|p$[Z\hJI5J!}gL[l8\Sp/a~']ѧ.s6䎅mϡ#c'̌!^cB0m>q8SU`?UxcZq{% Uc@5&{pO4բ-\! 7%WlS Ed`z(̳P"I\atNb;򹏏`ԑ}t'T  w7LVw8COWܻ:$pl`JzU* Ո|{T򾽮§@]vbG A C^|d{59Շ>\0'=ݩ/ϸ}:.ԟga0u]\Epxv:Ul$XKnc@j']G=DX-P,knOaMuJ|yAs%c0gZN P};g!yGH:/Jw6[.BE9|9;tM@)잏jt| U !8 kuŠ]*| ?ijR^>+P v%'`;##Cyqݽ Ռ:ȌtqjIYh˵hwoƹv)KgNZ+nSlNS"D%~Vt5p^F+7(dKPV%W?)E/ciD:GOS˖ςY箘PFyPN'EJAf9{r≯ŵҦm_cUH{7/7*d$aM549)w"~5ls&?Sk+W~Ba0lYj7~PUSG6S赏30e~g˹s^wq 1d>ʙݵ1\l㳵w>Dm﷛KuUd;nQ+8H 'U9ok^\ |-ؐMawlko}&@{4ؿXܲ7\=&,p{Y`(4mFDOU"v=@Z8Ǽms"_$YOmv/wфjСsPHih娉+4!6 H!.Ͱe ,fzjIo"7BR[ $Ľ[E)38 s)Ak?O2z.`ǸYY+eu}l֝H x]mS|=,%Ӊ ё|#5l=Շ[Vb[%"f)#-f!Nrc/hDv>W]TIS#L4`}aǦ&v o0-ʒέ>f܄"6]\(!s2+qQYT~+^-u(_0_ N:<*x9Jx8&a3~G? ȾTFc.%^5c3"%aԌB Kějr1~`ƌ([V{*6d u B#}RnZ _*tpw3meihFET?)M;lZ3Z%G5tfT>eb\Uww\UKcɇ!#˧|N8ad޵Sw yuDqvCMX2J\ LYI OضDu{W[2E`\&ӈo5aJ]ߕ1)iGng=9"%ث,P?P8Y&w씎D$#<^,؛KvFGۇW-BQ2N֕J Q`/.^0eȠ4 {5.aKl?_mMӫa $:B OULyXGno8ϥۇa^Vq ;q8ǔ4ѹwydKѝ"po#Ȝ)fjeF+s?/Z,y+7z H#o+@zc!pJRvL]@e21y\REpա kg'(|[F=ZL5f{Ē9ϥ+QMHXXMBp DBD>xrpS1LdWZ@6IJ+Qgrc՞QjT++~= 4%O\f +x^{لC;PK. 1iXPaXt G޷:B,]2D,Y4J[Q%Wk5 xH'"*&P(ZM H7|#b<ʽ#b[)r"f߅Ɖ} \=?;M>إT>dH<:n93aEDFShKJePI6c B3v)rYm6ͷQ#nV޼MpoéU}6 Iq}\Í5yW-k[`|ӌ~І '_ZB\pgM/O!USW P߫l¸A w!5W6gj=^x(pHJ.gjpA,q2(;3mΦ8F"< IAJP3N6|&<{ʇ]t]>' ,k/횝RpbFT0. |s}\UAʩ6D֘R%i*b٨%EZ)}X:nok@^lޫN#]Bd_+cTiR#4,d1㯚Ӫ&ϡɲF8M}Y00o{WvC DQ]jH @I foK!p;KFy^St4jÐ:%m@yF6tgKH7@d0? WڔWNWa~x]. wM=& X@FRsU,īBK4~ԞѮFu%L  *Zl&$8ai ?"=?=r 溈P!ŀ]ef[t)|`>@/q/N3k)O>u{#nK~yx^HXHG$=DaC6"\,Hvu.pMk0}уU"6\L"4~m*Z.&ԜmO"NFYU;t a}%l8j_44"SS5=#A3`ELZ]M~bJi: #*;d@_|9`/1`i: ܉}xƿĩ<>㻙{dѨ^=왻{ /բ%\U Qmrә)"bޠD~(]"ai[[evn@]_Xᗩc~I5~M툘dZlD<*QAj1컦k2s%T9 Bgn,O ) \짯j ! 9^h}zHmUNz-40%:Z#es5Ș( .|ĉ65Ba%Qt(hiUaM'f`q ~y{ t D#k9[+[T^ōRدV=,FA'n<1NFԕz,!]ɏ޵ QafhЂz Y·/g5V"ϥ 㘌.s[=3&H; 0bOR$~χTۏ{}?U N.`Ф6qEչJF0lM3x.[ͫF֐l$O3.uDlh--5f8bmyw¼!lWRnPPha͒%CpԾTJ\ޅy.p1 }З(Vվx?"=zdumtݯP97㜌`M;"LmIB^*viw uTO'-4uJx/xS J!PKU//|OaDA;XIVmzFBpx9wsHKJ 8k!զ\JaQZǠ(6@{! 20?8bTEoR$+Q(]8K-Ex}/f)z7:C@R7m co80d|K\\L^ЇE6BN S ggI\H>#:MpwP^~֦+Fk_ ֔E]t]}z2A&Hh.(<(28r:}GVORt]`E|f ms12[!bQ:%)h26M|K7MQtnw[D "{>EÔIc;nw@x09oZ6VE΅sA"#~_kJE^>7MtdSbN~;JwP9Z :Nٍs ;tPYN;\ Kޯ@~h&x}%k UFE(7g-)Ǧz<5ƮAEE0 THwVi9uW"~ Eu횖5j"%}t!J^ԇzzKRR0ZrMBK-*Xt+$)$b -);5U $~)_J8jC7[ZPdI7+-r@6V-O.qXZ"_MMSɑC/%leu3B Zw`WIi[럔F BOyb${}'D ZÜQi|z$dC3GT},%$!XlK/FDG$֗XY1pg+~]6D{ y,[TpXĂoP.iӡ L[9J_dZ7APp7(אR6&OHr)+FFw+h31QˏXYg Ba:aD|o6 :ҧ\,a0$ѝ~S2H5Uїֶ!&_)vIȸWn w:k<*E JQ-Aͣy>m櫫0vH HhX<\FbgGa(2#O 妠vˎr[.v =R#9qD[:ah]ԇ$h żȣ :CU O@V_lMXR|, ߳XnPكkv_Q03RLi." Եe-[%XprO+c FmR eX率E|jrc}樮", Pafu35eh&E\}]Sg^= K~D"eZDޢ+kBӟ걀V>(.S:Kgu[^l/EuHQ-%׾(“.H]aPwei6nQ-.ϭBƼm3tDDn}EM"sy>h{QUJh=%AXUz ZrJ:"=wFA6O'lYմU0`ҥ6Dlgtb}a}X31n8t;@@s0Yi?G}}eoBxw%"vU?@26Y>-NmRQjxśn9KQ>JPR#ʢh-0^B F{y/ҋ{UQ֣z YOr\6kC7Y']ѫJiW#WyVߏQ75|_ +-Ҳ Ke4RUB;)ƽEK"š+\jF;!DA,{&]kpсK{,dp&y|j[ϵF% ]WrU'֝n@gHxz^cVߪsQ8R4'l{UC} ̪Ϊit]tuO zuQLD?[ )Ž3bBSs-Ag+ih/YU4Y5/bKp&5Ir ,)Czű+=6LMA(қZ )MHY21 RHO g0+DyKjʮD"u>Zwi%EQK$,}`#l1޾KɈOW&LSڒj_Nݔ#/VmޱR$۔ -9@Ci[A$EeX->iÝr'cmEgXE_~[X\G!b`@_r/xUUn+Ŷw }7k\lPQ zlM&]j;(Qk@v֘x.H['jYWA+R!GQJlWdy% $Ld\BiF;ˢ"[dKrOe2w8c}!(8}s/22y;ϳK kf=oXIoVvTeZѿ1zWl Zq^_TOXjJl#qXix{K pT8 {N\VVigz(O3oYvl&z {6>Y:h7FJW`1n{ JCI ]Mu:jױzB<7><+x,C.nn2ζ%y O꾬:2q;^ɖ8: ,MT阻!9/A2KAc<$%VTbS9 .v "&IAFjlg5tO&E5T4V[_˛jC/>2nH\_ x akc7Riw# /%a\REQ6N# St;ĹW#ݧ3L4ײ`kB1Ure:Ɠ} z~x-7F_jTۏt 3@VOT+'[GX _EIs N2H\P "s [|PbP.SRQħ꼩 b/*Q #jS\5 PѵOR›/%xqYv]:,isiX{Ow,8% q_۰}!X5C 32ҙ%dE}S6:r yX`D&Cij-PO?3Dc!-|"* 5ckB^!} g';=An8ծqEk`]{ڷcByN+U-]D8pϟG[~b|40w\m~Q M;r>$hMmoS߇*x{K2ΪAq=Qr}@ihZizؖx=Ҝ) APF? vl(洕<)Fh+BRlOShyK~]n^6/Mɽ%5, %<մpIikÑZ1K?h$M;Z YXLH 8%2RMҿ՜w[MzbRktfs.iUNaB Oxާ9cN!GUkK<_iXgTFWi!zCZiͲD7pA ~:J&XKtu+9K ^bSU30ï J,WV>_*MYf/ӗVIZBSOӐTWpWSYIPGoZ{~>Ǚ4RM;,3HY Rc9:kVc:^pnRz~6}Os^Y''xʅbr{!%5}޴kzf̾\Nl# 6WvL k^>+et((N~69^ț2wNAWݯw]t.%(0ոhִX*XQv=FeRaH&?1<HtxeC.&nb6EX݃6*~d)j:@TZVO;v IBX{6F]ٟ am\UА3PKSϕ`'LPɺj*5T6(ï]0'ī}m<aJd@eOzJʵ'_;pfb~˛zd͑fG~R>Q$eC2ϭYs5,G:ly˶jFӯ9Tr\ >tW7jXR\jş A{-8@M)ĕ%XI b#@}Cc-q{>hG7fl0Iun'1ini}~|=]CL0 U+ϋ5rO!%5A,/a&~rh̭U|qM AᚻT:J@/2DPDJ76`)P>HhȊӇ! EH3!*0 pJ,Al*ib`u⒜0Iu_]7d݌hm[ǮPGJ;)^>^ sU>ߣ:5lF+W\f٦t_@ t¨4\ LV^A\aewitHߩ:nҖ.:TyBm[Q袪PȮt8I?/45vM\46KuHx41VUtr^K8hX)/pR e5Sk I>KYąt`*_{BH{Zr( ABbnǬ$u9d>rt=eL09?rGAhX̷fnKUpAc3?(>QATF]t6x9W 4M7Dv8kL0|'Tz)[?l[.6Ӝck2|S5-ku|)::T—j-ƪ惧mI!?!زgTG7>_#n&#t5ኅx5l9VkJB@:M i~FRz4V%ӹyN[3^A+2|HM` +˧Y.~wU uy TW잛(d}# _$ }4 8J雩Ed:RH4Q:+׷ˉw B+J\.3,O=yN)İm#6oK^]]_=?N^MR-&=˔˺ Tg"4}!!2IC:J0֨#8t"sj;*[QZTֳ*imA _Juh)(D%BA+tw Qţ%#0/lŲKR)JsB}̄:6bA5V&Y,雳tP>G\  ̃ 큽$'=L:p@J3𝜼&԰*@&7,^hEƝ&I?x&٠ʋ=C%Q#ߡeuHe5_24ŁB4(Dz,6!rj*`q*ާ$.(umV4]RZ=KcJ ?V@0̰ `yaŤ`MՎw~m=vʧ*lPRẜC~TpUe2(b}uGb$ "у"jUVyM}̀M؏9Չ8%t)RYͮ}+{&Ƈ'uhtպA/ǣ"qWuN.Ȍ/ΰw_>"t:)¦ l{#+y߇:p{aLPnjOjDT qKxC65BlBL"{UDv$i$5xhE!q $a6vD2M(Ok!lv#3wyxVW8:Lj$xMTqľ;P(u\m] :u\>d1.Q^J.rnIoaL,:gjwjg_ل$Qv Rm6C5xN8rq@UGSYsj_4V_Ilf_h͵%ٟ_` yt0 wV7`1j^~L)kv3j]l$W qy7!XΠ>4D=}xMt,Lat*ٳ֨{&Ph%Bb 35՜U:x( 5`"Qt~nWWXYWB-jj,f<&dsml.3=++55/`kc+,;$Bir ( l|O|)^?VG$=5:)]&5'- P'Ve426TӶV9"[96ZO,H&GRD`} 0s!Z. ;0HHbiUA{SV]ܪ7>0^ݷatJCܩĩlU\S"^$͇lN3J\ ?vpSb/C񎍱tVݞ[z-}BFIr UU "" ŸD+@a!e02!| Mt_};+T+K\ItntQR7kDZ܎[3͒m]mfEg=;x1} NL$5k|t".j]m6{ތqVjE5v5 $zVGuJ)`ﻁ]'0" 0Ai.{Żvb߫-t_-P t\8N#-ްYelV* vY:> ZWrDi58 Ij=n'Rj;4 F]wv*"K BTU#碘^.6h^>OvzHPt;^mmGzb$Ŕ07k(ƃꚳ1Keܨ5W#ݵijAIg S .Y_wT@it*~W#! N QO2YnDal߫i=a/GWm1ۦX`YonDXD|*+M;84j.OɟaUW]ø2>ծvJ`8xFR'I]ٺ#aEJ/?t4;Vpwrk[g-< S!gͳvL`$!\̲Av ̰qcۗ{gq=R(!1rI.S1҂tdRn ,?eY?_ϥ+$s$a ݨUqLӌ jQl >L9t7z%W08nA6[m7Ŏv. Msn"H/ RW$c,]4{y $* 1L Ǒ7eGQ [wJ4 s*>v6lq/#DaVF$|8X< J8_Iߡ󐗜5PxW+W[ԇ\ZMȋ<-k,prnTyȣ"W̳)?l (UuzEmO`HviЂcJatt+K4 {%<ȲJ&|:1F@ˊڇ+ݞN\ zH:IySf4oy*CeQ 'zb6D4޸\`kd)WDz)%wjWibaAW*_l%լ#+vh?C\T~·Y*"2npx;U4%.\FUMQ Čx` $WQj#*Qtч*xFv'cL% No_*H9ɳ̶g)vA1.w%2i.}4v[{Rxw4Uwc(P_ݢZMJQu4PZ7jŽHKY!(Nj:WEzLxRmy nOSZ)q(9>HnM]zӁnBc՜fgkEu6C#"P؎b\PG\_.(t))WÕFW"zKǦڵNg=);/Vj\;"߫H}R|2zNM[%JP!^۷kV줇4)D .A)O1(.Ks~:;S$ðenjn\ɬI5PM) 8 VC\dBЧaE>_>shͨ)h` Tl0YOoj~w ҫIq%CX?³mTܢ腫65^ĩ[56O_L \ ~x5ҴĮH,o'Ӊ< &YZdXOPҬWΐFѡk.$I=Kutt+X%pGW@ӣ4k ܼiߘ^D%?Ȯj 4T;LiԷ3e{9^;Q\M#?jҗj&Ľ#&pI@4ƗI 'tRR<[cR{p*կ܅N9߇̹ zk=BY&_hnEw#F],9<[qz6FC 6ў&^w?TM6ʎeeNvyusp]p(oWH􋽶 q@/6 #xYdur>+>'\a 4>PM vilDxv@[r}i C?lj2X1ƄH Xm!dnQ~!W>97&J 7puc=v9+f7'Ϳ)L/tOVIN{p jFO}R^n&;_$'JjL Q6yo='\*2zri|)DO TI\={R?(J8xtPFD4āVף+6{\OVaПC.c3\-oN7zt;L~B|]Z.L).X,AdRM%#zbBձ>y#9ԒWq}u:rpb'jBnV@{5fhq9߬])`kFRx99sLs ":+H=S?YW^(TܚNؘ4|BQl{.=MCQFpRe&ST5&Zp- x\Og" %g-a$L¼|]afFWc( =GٍQB}ī._PΨu =OLÜ~`x#$=&MI@R r=W_'uvr3yO˧J7a%X|69 ^R\s!AfY3J?r}1mnL ̖ͤJ2jq7{='KК|܉eXE@^"}J#KrQRp2UKIbkU.䁗C< P(Taӎ|yͭ?nCKLX]h_ PjglKSy9*P/wO|A?[_ gB[@-_rLugOhMG#~^FwOI,gp^0}bE?RN{?qێ#N~⢩:T$CX3vD݆!Ԛ R)UӮ"MB)4Ά^O*[{w{Ә 33$GF!i &WQ8>CK`ԗh) } kl2!r԰%$-iE8rB> % F{F9NS>3^5jzToo8=xn)lzxEn ~!{6w5?NN^#eUAD''N{x_MXBұdȜFbYilX4ϴ.&wAC9}1i햖1H71}QQL3ÌX%󙵳vRKXM_̯DƝB礬HORDA_>!jƭ 4iWT5,nb@ϼDKn#=|f _~Q8i5"W*H_GjwRTȉ+wQ%BZҴхǦ-z3p31 9VXNPrVzdhwt39?"!"}b &XKf:'GZ}L2.T×C{Bn*s6/HcF8wZ`p4 '5z5 #-֭&Q6%7+c E GdYhH>WøcQ ʥXKZ|?]rGzczH1{3Es/DBt`Kʃe]]0]PTťi[)(Ѻ,{_nT?ʣih}%hɜ@zvϴ O=:=452(!(Xq"7Cr$O¾nҸ᰺u.zD(wXn+ac>OF&?m5,fTc_sL^Ӹ Q)wn*wwJf\Osx]b\8gT94Aֵ_=$뫄+z5XnDNIH8A~P OVݢI%uՍ:5KVC>K5Xs 8Ԋ,a:Mi4[;;iDL%q&}v :%uv$dihf,EĠS3cKQKLKFh4 HV"fhYEG(.B͍\ͽ\A9%a]*QOI8Pך3qжaILzdNznd4ۯ۵@GV(LSXPfǫCW(3 SzwVyD(-+mW͞#2MUW>!+I2{ H87k 1T.U(kgiɖ,TVKфWP+K8s^`F:ֱD`Ə7xʅ%c`zG$4ȧp Y}"yv!(ݫ?WOsr%%*0&q:!4CW9y(|JN ]@lJ$Di]mҹd?%s97S/U{Mmr:ීU%=@@`NfCA3YCb}va/($ X&bM{2=,*AK gC5_QoFUi> 9^mU]L.)1c- ?z/4q=;]LiyY֗^ 8SQy/j+g9l ;k4'Nk"="[ŮF:˄Lh`˧/NH>:֌PP| 㶌[ʳƬY .CU}$YEͫ' !=K:5;Ekn}Do /fNZ)$3="=bhf0,7\|zsqh&:i%4,mQ[S9>䐬>J/9}y0,Dǂ)_sep9A,%$[N,V| )ai#UoFV !@DrΡSu?}CSr OOۣ.fH?$H3 KlU_Hpwfe?)0~I3MN~G%s.a_f|cjV~hܮ/eqWjf|jQ|HЈ%ܧ*0wjj&J| zr}G!cHI3~$ ÿ>ÿ>ÿ>ÿ>ÿ>꼿.Rwave/data/C0.rda0000644000176200001440000000302012377701075013205 0ustar liggesusersXkPUU`2JVB ^s Ґ!hX>PDAB>aQDPCfW9fI9MLkq=oۏ799 Vi01>_'A=C=C=49>| t-Jmn-pk*v8(L< 7n}/QI5k8'P?][U?uL^H;ق4>sB 2TF% mbb=Ǝ$Wy3 dztˡuMSԴOBTÞƥWΖ."r^G:^%L3aկJ uG@T6E:-~CNf! ӆzK@Nڂ Kz){-S8dJu0u,㉛f{K„=Sg>˫><#[Ve9[V<sONk 0?wn pf1;4^QqUgI/>2z߻"pw/tJUW> Se7GL2B;^)5Uc5cV`d|Mw:K$Ksyj> uмo$Zx}e J֏tu0Jubq7/2o$|,'d\mt9'A6ef|VGU`@/_ƯࢻoeMv$:fȰ8 b7%XF'J}Tj2f%$+Hvj nF4zZTrsMhs{.aMB'tN9 ˻д70jj mSHx7X(3J6V"9:D܍YTD#=8lK,xA0${UD-ltDYmDLS#W(o;uĴ:>WGzH_$7VY$K6/KM9 Imkgu8guvs$tІ7wz-ջ<0AWJʒ,%/l$gl6Tvp*xB^EVvZ ݬVմAϾݔo+Fzߧ ;Ewu}7{=9ljNjoR8$wlطH]m7BZt9[F#6kK}I Ѯ?K]D3Q뒘UBQ$:fu$f<a]Q7,h[">/E>n"IMM#IvT>X"wLk+I=b6GR7Λ{$;ճ qrᒔ#j$IgX$]QJ';D ęoڃ 暺;I eiĠL17] _j<*U KhѮ6kqbYmEb8gu_*1=ml1&֬WWck~4"k/7zseĨiZ+zWk:)wQW_1.>(1~z`;bŰ_8oڔ?qc$o~bz3e }^T }ylO14[(ܵN!FΗg 21 4p#..3L^.|}1vxo{]/Ag1|DLzVyU$WjWS-g#W9{>}u~{?|sVދl~ou^={SUݳwɫ菉y]wV]@BDFሸ2]>Œ;3.kx j\9Qss>_dy\MbolTznn MbvEkOeIlD6H컭2uz {~3ک'$&&VYy45/.Qsp{(.\. {~_EtWrCOӗڴYҧ˜u`- (mÿPcD7M%s߰RZۛRtemÑa,6qDܲ oeȯ',_f=={Qcg,+7N Ya_neQ4?h_OOLVS@|#Wvݬ6%#c$ymj'w^-?I;bt zY8*Z{Lq83%۴H]h3sә nۀWת9ϸO~/u96ONQw(ޢ$}}6wP|O_ӗÇgڊϧ~J:)>۟*>ĥ7ޓ {Шxsxs_xș}w"^{/ýWċœ|IzZ\L$=COqk N3=*ĝsO9eqwZ{ q#܈?7ύSM?Y-qs}lOq5ϿY緫=M{}uDour ^6U,W-..Qį=yVYI<ۧ{b9=[\#N\;!$'}$_OǿNynI?ZN?@]P7:uC@]P:5u@]$P7: Uu@]4P:uuA]DP7:ԕu'CA] TP:Եu/A] dP7:ՠu7A]tP:u?@_7>}C@_з>5}@_$7> U}@_4з>u}A_D7>}'CA_ Tз>}/A_ d7>ՠ}7A_tз>}?#3CScs À Ӏ 〹#3CScsÁӁべ !#d搖ӔSӔsZ{?|sV˔Z[݃uO={U]}SmN껙rkwUY}w #+Sn¡% j\9Qss:荋++{!'{#G{%g𱩇{){+ ϛz-2``/f+ !#"3#C$S%c&s'؃E'zSG{U.cjs^iq^yz=0 =1=2+=3;}{i{kQG&廔c/nϲG{ug{w{y{{{ VVVoƫ38 Rwave/data/click.asc.txt.gz0000644000176200001440000001302712377701075015275 0ustar liggesusers[zًl%XEEyrs"A\ 4;/u:?/LNyz,ۼ~o2-_9??Uc:?dz>2-?=/i Ͽ粮w_kzΫ|+-8?5-y'muًUŖ~2Ώ=$~,iݑw6OGDygam]X_dc:M/v{}G淊|9/N&S|vSBKtju[W=ƴ|]e<OTEІԣ+h݌i  I*MY-q/_{Q1S=z_oTw7[|= Ԕn4 5~^yvPL:=+w]^9Ӌݯ po!̭p!v 7%lKn7w׏Ž]5x[{I>5W}^ٍއ;j٘kܶutS~v\Wn:nPߤM/;{7 kz4r_SD_b^%i?~-JM[w>&W6?/i>?NLzob)}k;ލC>yYURmbB{z/_8^hH24rۇ2ý~p'mךG)9;xZ ^a"+ʩm>ީ= GVǡ"9I?̎]?UƧpM +.K!$q)Gb-0j=NRpFE`I wHQ],]ؗ64m,r)B{/40$בγ-qXP b#[e-o,RYAi &+S 􁥏εo ˯բ%6jG]I)f>x 0>I~Gh 8"<h ,V@X=o c[MNN"E;C,s@ṅ'S`9}}etCΪ飉BsC*Wd$ 6z:5`b&sxٷ.aPǏAæ yDm2@ـ90k/0LOmZ* E\}TD|_X.uS]"tkEM>8v9FHK9+ ("/fЙMrl+'Ӳ~Q2 : \(5esp.>r*6ˡY| +=C o_oPxfrr}oCnEk`DFu%q?I O|10V'>c^T) QeHjˈ]aC~%$g=)C`f@"$  _—4(y%,8 F*x,}Laґe}6 4j[ibE1zFpD)r3aN>(l]U抸5`ZBF~Kq4@moRfx `m$3vm],3*E/r/{R[ZMr*OHoY`mRX[W+'= %0v|[VXk;q`+d"^)hadK }/uo.>( #X]1|E/bpOTw-BShg#}QW hE p!k"P09Υ0| „X TQIqgHqȷ;]f>2p#X4Cd"sm Q/8$h8a拳,NTVڮO'GTH1&lsҷV*SR.əBږA <-~v׫o1pWpA4bҏj@HUAKCAgfKr|TH7AH)r^;cFj(k!2`r@Rh.U4%§_)鮇XJ-2.ZYrSJ)&uv&~bB5GjU-*Cؒ%^XDT`RiPc 4HKHLtQ&oeT.݄qt 7a!w$a; SqqFSSA0 qq\PV{3Aѽ+Yؗu*yfY앴DrLa" =ٞF>!#9r}*x&ɐb#6NNh6[VfJ u—B_@&pLya֖p㱉Zg^*sHy %G`c]=~Ϝ+ɘsdvz״QCo[G; ԴJU6:<9R GbħԬJI4FqD*@leb,BOsqPFA{;ӴgC aNEcI6藸e{c7@4~כF|sK#)3Q>LQ?K/D?q_GzVE|zFI6x"oɇI^X#Q]M3}#Hw/βq?{x=*]bC5ax|jE}52j,GhaZ7;YTq9y6}_9U#O:<>=yu~4zN(~8wY6?'Yu+A_6O{>Uʗg.cYʻ \yb[gr(^*U}El߬οtQ\"뿨qSжٸ',OԒ/E5chܿ/X[/b?3b}a!ߛiYq }"ʛx]KDhY>L 7}={PyM78g3#tI{.J-yOR)FԖĽ M=<$I̓w~*>Ɨ~jgw=CM}eʏV. jh7xCd^{UHN]}uߍ: 4:j/~*0!j]CrOb4;s} W2fo!Gd6ՏS^0bIzT\.H.:S7vG6ӏ<-C8ZG*-w17/F癕šj}㙬?SqvGsX~~1FyeG__Fn='Eyf5*#CGr/?'O7:c Fyz}.5[lz]j^X~uhp}LJ>{~Q\^LNڰ4=&8焟2qN7.9%|׹=Yfq]t?$kZ|uW_5YGwEy̷Wz.L|ڇT9Asl|>,O_5Łu,8=Oŭ>q>x)1n cmYe'.kT|K)S#ycS#Bu]uC$oC*"ؓuhqN3U.εTG _O:Vd箨rpǣ敹в}y7>-Gq-`qSjEC*5%O֙'۝=ɸS 򁪩Z,/&qL?s]ٜ59jH.+vd秲DɫxVI/.t36۔N^}N:ϰΤ?AGl%#j_J& gYu53,d}/;7|oX|^ мP [ǛƋFwd']:,n۩bOߴW_1D;S~\85ʓszBCc iɺ.^΋QDzkb=U}rVMꉾe{kFo>l<.Ǣ'cYE|F?H9"v!jE~kE.w {:n=/st^VoWՇ;h=P-b$T{ҿpsaI5w#E>Oa/Ժ?]-`~d.^nbuU-Ѿ]^[uyUjl]G-;ߗ+^շ-/YoOY΅K_/WOv;;K<@'t{?Uq>Ok~_}O;;)]s?zU?^1#t6T#XZTVGf uUA?ɬ{u^1*o~ͳx*shu+>Ioz9on>=s `}WP{WsGջSDk ԯ>I^w&q*|mjidTOl7WyT=ͣU]*>*OhŭT^Zj^陬=u\'*ﮓK'*/'YSjI|p6Mo{P-,Oc5۟hA8Rwave/data/B0.rda0000644000176200001440000000302312377701075013207 0ustar liggesusersW{TYG!Ȥ2!B%1)yUJQH4BO$VD5G$*]i<"9ckM Z̚?9ϽjD"QV"ɣ2y(KT Y&h&h&h&hMQwAyM}rcE+(5{~s\;  TDka/‡BzJeZqxۺYyd>e$<<7M!4>px ;'nIj^i?B_=cxn]lg^nP<mb};Axt>Px\ZH:xzY!ooN> 򰤷N 8>X;nq5S9Uu0<]*nθm)-~'s'O((mӧzAACR"-,"x]PӻJ{w%|(2jZсf(EC)v o|ifpɡ^U&xtȌW4-́kmg8I8d܁Fdv%w?&%X˞Vf'yd^C0ׅ㷌{w>ssLxJkTsY|C\bv(O(8V@em,F٥+=QF0[ 5WM,뚊Y׹w1SzP| Ʌ# D8t5 B:s44Gkpe_TO{BB\Ev~ZW 2Cv1Lh( ?7x-])H: OЇˆxPnnKk?l=o qE`app/W' 8(nzIi]6B]H }>,BP/иK 4/px܀B^<{ig^}8a2*KS):fѼ&^Mvt/2_*H ;.tS](nE'z:R\h=8 7SVp+cMyB Oy[<<"?CQ#mDi}.VBWx@3S^>ڷ<|K< n N xT}5Ö'a~&ha 1 Rwave/data/W_tilda.6.txt.gz0000644000176200001440000000266412377701075015177 0ustar liggesusers[: ˜7v2i9IgUmٖ !&BHq(^"$:*r$"*ZU.R_-YmB"rX'h MEYˢ^XRqo]zTr K#uzZRA.Ů#KbRs 3Wsb~mnd.F@dԲJf$ƼJ<`Gh5jc$H1DGlDc~W12bd 9Z$eueot1lE::^Ux2Ji<:nZ41i #?*{j78بGFViP(m*OT6UV=:L;ˈf4D;5ر&9R۩z)Tک~0?,zX߉t NLkq=BjWh.z.׹zZ8<]'snrw=!8ORK^"Eo=O|{SgU\O)~f\r>Jr\fr\.r^p8p8p8p8p8p8>t;p'FTl~p^Kp<9^:Ÿh?A=@/B G94AGpצKki\pSxd8*\@v#@ځe~ ƈqޘ&;6%6&&)Eoxl\^wxR$}G^xpGxk|j6m YƪbZH 2 6[5[&qt`.;cԐ뀎<:X# FCE=TP֫jz֛dA 2N~J2Xb]Nέxr[n/cd*%fBl鈕Rwave/data/W_tilda.9.txt.gz0000644000176200001440000000431012377701075015170 0ustar liggesusersY8.=}FRgA>27IR@ߺ [A9'P頺AԒZJB$ξe4\jMXP3ڐub}][%V5~9o׾KX{bmd c9txѱeyy,fid6"jX0h\ݠ˸"2Vu_)_oEm튾вPv*`Ǿ2[o* WD\H}D0_\U% E@Trd煰* ]=ZZ.L咪ߴdd,2/D52BM殖OdLzʲ\]ne7'TR f'̵O_DCy^H٪ޭfI[բkS_+? aިƯwW)/o /LD+"Q%aʰ:+|gYW_UQQQJV"*>@tCOtWZ?tpFwYFh:tU'KU'QɬKfkUvJ7r;_v8M{LgxS݊b`#[}KTb(1PhJȋl%+nd+qLKN--.mΦf}:e_t 5kS`FiL3~#x7ߪan &O)~=X%[7 }{fND/ows˸CM{T7gƨ'$kt y1Z~!oE!T¸5 %f}ݭ5cٌe͓7OH-6jU#]ꍪ7wjUZ/W̓j?$yIy$yX[oޭwvC=$ÅbCr$gqS"oV!.w _7[:E_wx?NXɢz0 iB(M ;UÛfqU.yB#KnVbcY9d׏ER=Qt!\vxfDv.ȯ./EeEv!5Cͦ e9YFk#-pQPߐ} 쿂K_A /о@/0 `ž|v_ltb-6[lnnnnn. ±,/+".-Uׂ-{;~a h=#;M,lqǍ;w>|(lLl*M![ )QȄB .D{=J xJtiR878hhƙ78%|Xq]uxⱛp,y[)zs odzpB jdM?z]#mmqƑ=2 $@*;sQQ\҄;sNz'ptAA/T@t}920~PԃX àZ ;ycORk&p<61ubϓF4Iw($ɤ^]Xpa"%-w`h^$‡^0lab6m\Z\Dy36)&37fd6eӍ={ Ft≮q*K, &KqvQOz^>t}'74>|=yy">_aYN"eC<R|fg\z@#xf,-6K$@943a3y>7$}zHF^~y?)\W+{*x6Ͽ@`|#Wx8ruѽpC`P 5pٔ$1mHZRlfjq$6R(d,"* -Fӂ-_Em?[!j)6ێtޫ}lq6= aVILgDMҡ+Q=xp]$ Ip!5qq\|6"Fdr2jkqX5p XY8s "NqM@&'Tm2&d2MQI}2ey$k!s8y+}>&~(Y JQ?!ޞozxxyIbt<} 5ǘ1Qq"H&Ӛ&'KLL՟4Dq"HJRB'w29ե3z^kZf;5iqΦiv:BПz욼CۜMmNjz&? ͫTN){O7 MgjW -  )Excq \EX\zX\fxDh?~2-? ٌE^t/srUW\= ÕdRӽX?:\,K~989wWG_?]ulveta5/f;dq|4Ϙg?S|}*}dY}q}E_^xI]o=zNcTcF>r}YNdӔzjUNnZB=vlܬZRvnECYI[ H,wHKҒZh2E_&); NHђZrq^DR+v o5&MGS_Rwave/data/signal_W_tilda.3.rda0000644000176200001440000000257612377701075016043 0ustar liggesusers}LUuǏ/@Js2fb<& å9P6PLcEMfh#;L(<:mw2_Q|asN4+yS;| ~=s ?&y"fNaFdDcdӨ'F#ʈSVdQ(*^ha_S7H2;[<53DP{'w8(OV >+*8wup6]߷i6xJ9r|yI;?lޤ+ gm^Ԅ:YOyK .<emRD>Y[;|*{jk)F~WPj#~Yk3۳]3cs|/r+qjQ8}WRͣW> v3v76Ns\zuӪZyDշ_M;.q,8jyE7oY皏l+)Z;^[M>8H))/K 'lA 9IсQ|XO1/1mojg9;\5Gǹ.<:'/pk]b1rr1.2s]7ޞgG:8\ݺaג~ǵd]6zINi'鶓tI$w;I O҉uq#]y7|d^k?1Qm W,.{Sɿ38aqA%x/y=?Rwave/data/signal_W_tilda.2.txt.gz0000644000176200001440000000133312377701075016520 0ustar liggesusersKn0 }H=}M[tnfO>ȔEQd'V%¹JߕɒDVI,˻BΡKk]*)Z3wH*K\ZP_4X!ibq$ƮZ =.N%15U䪮-]1ydo=5I>QZ Y'Je{[tJJs\z 6or$3ry LV吇խ|OxMv6,Z|4l';@t8Q(\kV}j\Iˇ^ż9t۟gkǿsBz!z!B:~\uK_vOs?osᦧ9݂%a'q׼f^wmG%WDm:Iuu_(G$R_|힬-R ZR.3.E/xYկFoNF˚dW>'xK6W K9Ŵ>Y%Է)6&l]M^.*,秥K}3IU2KeD#nm-E*u9eŒRk[_[/wERwave/data/sig_W_tilda.3.txt.gz0000644000176200001440000000110212377701075016020 0ustar liggesusersIRk1 ESxn"2SYFWEO)4+VM)OMY,ݤ4Юd ;9+5 H䓓EAFZ PhTE)A{S]|dF]Q Zt_2Yr'6gjAl2bOéыk5CŵL귥ϩgQ|J4ɵZw5's\=KNՉ]ksbey|^!#Ǫ9y] |B^='Ԟ=-o)!}q_A~ Ϡl^BiUiLiCU2'2'$$QÙÙ3 >jU2Wy t:QeE&e6ucsMdž|2m pE64QƓ v&OIJ`Z6S㖧Gf,35 w1 -vnpN-j5ed>0H ,KU.c>[\2I- J5a&,ÕlYSK0o ~.fWy&Rwave/data/sig_W_tilda.2.txt.gz0000644000176200001440000000101412377701075016021 0ustar liggesusers9n$1 wIؔJ߆6 :`PERn]>+{->-bKCDjsʑ^+:<Q(HؐayvV5jJb 1GGQGLV &'ȓIձ] gF;yq6uë[32qkfU_:K"fbթ娾6p[wj85y3OǃhuM1_㴚xφQ\ 'Gn骅{ƚZDzZ-<`/&Rwave/data/Ekg.rda0000644000176200001440000002171512377701075013464 0ustar liggesusers/lkkvݙjhU#R[MRAR#MaH%/~ɻzX`a`a``a`@QW=[:9޹}?k_zh/??F6?]b4f_gov3/~~_>okap]?}ᅵxϗs}u~K{{?>cҽ}^qoln8mnjY]6.1g=Ͻ]wƽ}^[U~o7<O׫?/՞;Ex'SgmW_ϫ~>7?on~WYt%yy}Ng}nm: ӳ.Z;X' -ދa|o}n-yþ8?ȇ׸ݿzo_]~m?qԽDھ?ݞƭ]>ڳ8uǟPڅ~0[?5γ.oa楾__e]~}w髩_ +O%^=пxήw:r v8Dza7;훲n]{࣮k=Z,;v;Fߕ7L#sּcɝMhmvǭ?=m)r7{~- zMf`+ 4p O;?7k{V?o$Z3]zf-Rwv7= 'V^_?*9=>~I~!P~/}=?jqKȍwEw>v/~8񒩗oN]PI˗3"?OwZW2~_xy}+q]a?{K[KrDCG]y*rڹx> _^z >3N}v|>qż>dz޿O8{_+vp3.|#x)WghzO~q/Kw ZˏyB\xH__YF?Arb#aCe?w+N< a"~?bywjV1wJvsKW~ G,B م{oW~K|#OѮ%ex{K쑭3Ӻ.{f~;?)=m: $>qu:rYx9/Lz㽴{hynxWZzvrqzo83 ?JvȐ^I}y'rgʵѯyD|XI8ƍ/C{g>,Ή;_|xu`/.8?w푺`i~N݀9޿ pr۸Ө+ȯ#6?y\<\`-џ}>jog|/}1ف7aV<ǛayCD)*0Spfԅя*|w#j=pA a΂20 u77-{9vAR\Xe-x_ }+;P|DioG} ~>^q\Z?0dogxDCrZq~ҟm?ɫ~{P]&?y1o/}C*|x['o"+^wq\_y+ ̣IoqL]9"@[ L^}o/'=%m7ga/q_ ho .C}S.v=|i?KڑsO_}{wÐulj]%>@Sϓ࿤ q`Q/Dfʫۋ~~AaD>l@ςx2)^ 2<'^<[O'x;RU$q{>7]xλ;祟F|6g]@=NU%?N'^ɺR͞n/xqɓ`M\|QP˟~]wA?%1K8YB;לzy3.q3]:x>ǡz5_gY y&?Iu<`}TzɝgQXc??{y:o(N_#N/ .J^)O_ȷgXko]9Nܒ+)D;ɳ|pRυgwޯWCy ⺓}H 8 (y{/a^_|}~)S}6:m9Oܸ>SFi㓴7"bq:8ѤBG)G؁;"zCd1?70^>/ƅwk/A=?J 7Ďn=&U'< ȗ?牟Gڱ\'7:1]J&xћx ?q TNwNq|`U!ˀ!S}% m9:82ۇm'C GKjٿ+y/.n>֏CKzځ_]}ܯ ֢.~+wxqhwR8௴%8؛qc={_HI#)QZL<.J{X>y8G_dI^| թ~i~WrK\AxYW5;Jy{uQv*? v@7eLS:qok;m{T[żр=m=&Aԇ+-xȉk ]: .yAI]S޷[kwɓOS> :SR_r|;I J71*W>'~Pq§n|`<'[hǒY q<leGr]U=n< 5S&1~Gݰ+q<8yۅr|f]#C`NyO΍r=;)>1DK]8O?%+NVix>I9ֳN뚧35J8腏OrSXGB#X\!sj59 |ە +Au쇜6r|Ny/⿜g| RuY:A`_σXwq\>r]Ћ0B?I=c^Zxauz" ϼ~Gdȳ9sסX{̿x O1ôWyyڋE{\y>^ϿK<2ԹJ8mᐌo)²V%87>:w-އ9ѳypE;r88z:%EK8oC%ʬ 8q9GcWnIzOKA|zq䄫߶n^1e܆빍o`gU85ΈK<15s? g\J;8Y2c)G Bܻ78߅x^O%eC'"<T88~=n9MUH:wh6`aF^K%PփMq𒄟>zwII=@S?Wy!/t]x;Jl=s]`Mugjž#'J},up*W8X[H<鴎C< w#8" /RQ_s>g\\,%u~K=0gT'Nn$3.3%WIFoBGvF-FGpɺ^:1ls/ (y-~ȯ%/>zK/\=Uf>ȩP>'~꯬)xqn}xC*VC~6zqx~!r \TW>"vˡt/}~hKYXO9I/y~H>q{ -S+ o; K /b/Xϩ}'^מuOSٞGa=a1Aޤ-iC0NvߍWgl<{߷Es~ <)G#kݝy^G{nu[uMxym\?ۮm3o'~}: ~B>rޙԇ=)㷔Sr y8 da,GRn y3ȃY/;^~߄_3>xAʭkxo1o{:}=3?%|b;G)6 <Գn+UvY'KG^NG}^vy'L?Π`JֵD{%O_Uyėyn/wϛaݽ.l¾95[/Nx}5º:z| 0෬z'@>Y\꬞{{#;0J}gߨvM|\v-{ɻGj?̺+e.CT_e}o7IΝ~q\_ׄw+x8g^ ԏI|F;qMWe'cx΂0?q1x_Go"i|!ZAI8Ev>*B!&˫篴q7ߎ:~Nw~Ǐnb|#wF|=2.pncźtzoXwi|އ:վp:^Ʃ'r{k_]G_g)4Hr`h'"yȰkOh1qXryvsSW`\DpK?Ohd}xv>3?| |:YLu~p8ϷkxQyx@3cG:Cxc?mcŻx~~+zUGoH#/D[^d)仗ɣ!Yxw ԛI9j! )hH}cx.=[z$ԭuyw Fз+oY~=Mu΃MG.K*~:U s]${΅_ s\/0Wڞ#`|GB'^$+\%ԟ]<.g)>S=tqVW<'L=h'nV;N>!{쫅rNI7FkGos7~A~0㨟B{Ouf[{U'0G/O=ijy5?"7c{f1-Q{}'u|$b֯f8NMG _S<BogyA@\}iqCw޿{d vgVzh3?NN7o7kv?_5ĕ)OUM:knڟxS'?u֚z|دC#ODko}y~U9C\]%aǷu Х4βb57DFv%msEE%cnN7jmbIeM]%٥֣>GQ(IQxR)}A l[po&N!ɒr~[#A6梞.qPG+ůR>T7gWeBxO uqHb ꋦXiDi*'%]c6G1 E<8=_y__ P ±u9q9j;-iȏ+J؟ݗ|4+JwCq1c1䳒L:ۛhCCd~s/) Jq,8{Ddִ_oh7i:OBֵ !/EPA~@!P9Hu ="w|@s8߃\ Cr-pq7¯p ^,ܫҺթ"B(_8 tbۀsVָj W_\5]yuwNY_ȝbSկeQ)RJ3;dJ,/*X^E/A0BEP [.VB))R<7 PÂU谿`+4s0kjSܟ]c/}W(0;Wj_BoP`[ $v"(;+(43v5(m l7 4(\-zFP ڹ8Pӏv 0j(QM&^ֆjն,Ǚa(m 8OhIX՛ruB)gKۀqxm)7wkpIÕMq ZV!5eZHhI5j^&D`p@X5DM^S$%Rwave/data/amber9.rda0000644000176200001440000001172012377701075014130 0ustar liggesusers=i'0;gx e Ng-%h Z%p_M0o?ԩSE~)/?__)?\~+l_w^߿>>ϵ}[|W7ֽ}=\xk~|_c}WO{TWb^W%>OjO/cﳊ}}\qu}h^*^1CwW 0}j~XSW%Z*~\hf>?n=KŐg*T~b}buq~bwA;-\QEs^k}xCs^'y-'ԣ{1w xP|\?6;ԋ!]s>G/pEqp# W§-*3 >cOoFů5z~=.ڷs׆8}[So7缗Luvc~p Z7CqKx8ҀPzzMs' D-K&;m_CݺE~Q_55]]A1ހ_dpʏ!>n襢(C)AΧEIUUcw~MT7 oofٿK2\s~NK~}}@{uo7#/;;߮_?uvqꄾA ㉟`؟c>" xpqst{uu2^6OD1G>`8lsƛ!~KŷAgS)_zר:9\r?NyP_˼zWuuo}ԃž3G׽T/yc1q_Uů"?*:bPϫ|ɢ!ͭwI3̛|%v7Eq#Gz/wwg:}~ׅa^BM~ Gx?$e*%/'y>_}!>=9ۏ'C)K{6B1_$!㼠_S|ޠS^W G=u!? u oq^79"ρeSWvBQ~7f%u+Z!?XOSԇ|oC}> Y;^5/;]^x/M"O<-7!?mBɧ﹎MԇOVt^`];_ևYߣ[쯣҇ |$lB'Qz $orP> :)萤 AC5x.|TR Y#uxwqA?@\\bl0/蛚Yۼ_6쏲s*\uJ|>gS]MH1ϋ(}~ s2:|g>|};~Gfm~RS};S.^>?z>c{K܍O&+W{6\:xD:0,|?Rz|'^C~^M: dtczCs]rlZ&o} |Y~ :$o}_9:#N8mI_ =`ӯߣ~KTfCFԇ^nI%Ѝ{z 8:Jg֭BH~&ͻtxm|%]U爦f糫<{1B}TYJW䋹z9'C}@`x_2|VqJC'Z'8'}o9z~RE^&H6y$:F1QGe% K!oW|4z3WfMo n﯀K9>"ˢBSM|xq7}gS"x1JO:>֏uW"ܷȦbyxWp`o|[2ܺq{CH}4|<߲[܊3ߢ$UġPݱ=.?^L9?Ypg?,ϓ - ]&k!3?U/~>x e z'E0 Q:=g_ 8P;N" =6w>x~kyC皤blxsWmxIFMo:y/wߏs:s2}WV?|9MqDzoSyK>A[.g Ƞs(U\2,:};w^.}gsNĽ LO*xw O9 y|?)ESgU!cW|.>Cy?믔p9 Ok}| @~IVĸuҏ3%=G||bãh ~\lU]2mܟGWCѸG `oGE5$澘>!+_Z` = ֏xv|^|gg^AP<~H#\WVq KsG13JX';~7**S0w~qT9u3Gꔤg~} ꃩ[e?WO)ps +;l5 đ¯ )>_#EXOQ)[Lz.hgܾ'78"KC|^4yE6u YC' r:A)Qzew$O\@' <&>yM>\7|b]^$F~kt |F@݋k.}@ ̻x]=׍0o҇f蛒q/˦Y!zwWuɜaJwZ ȧ%ǷB-ν%}UEԕP~ux识:M3w?Hzzs]* ޮ|We'Eև:N=< kNP(_ ߏ?OQnWEHWJqOc(Pg* M^̺Hy_vO1u#/|%]'?Y3  ?QbZpg_8C ¾u"*ƽ ]p%WKM|_`"7x]_Gg/dг*G1ăo_nOl~|j#zWaWKqy3Iu8T7<,H8ק~N~.DR(G dܭ&~>٭p*|hFJ,u]7A^e7IGGa}`1_8+?γshzaٜ u)u} ߳> aVHQ8ͺ`ޔ'E@\WEjjS ꯈX7}BRSn9~ũ/9Rwave/data/amber7.rda0000644000176200001440000001166312377701075014134 0ustar liggesusers!+Y,) Iߐ?,XPMKS7{ε_w¯7__?6_5/*׫{}?w0{sqK~ixo\ݿv8]֣.x4E\o~qꯧ?>/8~]N"[)\^Z{kǯ7ȋ&q|P.b/qCo3q `|#ƒ8O}Q<puMՁ*8VxKv} <(okax+=DO A]b?]^+z=D>.㪙*ú\ oOPq6b?2BxSԋ;E^g3xd:e~7ƒ |9o?/p^ γ@^ԛ9~_b"x7Q_|گ~ 8qg8"x sW Ws0:F:uD{B=V:~OsKʼ֡}=C}*UOGN]sq{wL&f_K*~HyHz%ii p|BWOൗк&hⵚzҽ*"/Й2[5-ɋ8*WLS)>ğI-\Ϥ[q<@CYO/пV0[_ [o y;{;x5GwY'>q'>ߠ7pXR]t =͸SfMzG G |,O$&x7P5{?\} bʧ :X<ygw]!(Jh[/SSWO;gP?QL׋<׭W~D xK~{u+B}p39ߝ/+7(7P:up@^WS|pr^13[4O5f8?q`sԏN3TF +5|1WyIz_K$>xTU@7;NV]~Rj5Խq>$#Wi.@}n_w܀'UTp3jw)t`@BsG8 :C_HW0Cy[Gx!Sw N>IT_dz\kxԫ i/pO9Ot¾>[ƽR:9 %䗮~>LܣycT\e8Ǒ'չ2ԍk3ЏuGyy$&s.yT3.[s^x ݠ5|0{:ܙ:3G5'Vs+Pof7ؿ ?UE}_g{I~o_ߐ/D>~ x*gx5WxQԏjAҋ鼲V5u?;^kRЯ\jxL+Fs,k}H0qL''n^)u_sG.u}(1z:+>Uu}H0_:R3y)"iT8`?\:xg@2<7>h [sc9 tsϠ|2=[<>\P#<;T}Bī\R||z竎sg_C.<[!eQj>aU_<]^an~E7ķy1=YiRo^]#~~RZE2L8:Y/S!_-UX/nTU'}N@/M|.y|IWؿ{V$J߈E^<b˽:E=F7}@/~(dc`4q)}|ޙm9UixuU p=}9[/$?[ G#@ksܷ}f7=nESB߉c1qEdׇJߒx?A=Z[P|.y5\Emm4ȳ }<}^>qYU8D:47A?=ND͜۾Fs_$sLs/[#|>_P?6zRLm]x6z'W5qBO( xЋ֋*7&+u}%$'|~XgH7뗻*n'N(+F8->n\{ OPub>HGxft_?Lo>\47B>gs@՛eipf?oׯz[z?8:L0A cWj9 i3(D◠x@xn~XGSS.0os)]J?Wտ!yD2E99/+bm&ObvqT~x} ÜO^SZ?U?Q~_$=}l;Bp~bօ|~M7G<"㼊8uD~O+y<xo?O!7 ;]^~}ENດy?$s_ e?C4!Ծ8ěI"M}>w~`>7s:nE_wS>nidu]~nf&2x~o}owgϴ^7;M^H}kb;;a_)=63WЗܸo{ϯf^N>l~pÝIx1軨҇"ߐߧ ^\h^[Z'ժ~>0d7 *G ^|5z?|?::קeO\Q|]Qa5+4yC$ Hߎ(Ve}ʷYoW(|KЏ #P}8|./0Rwave/data/W_tilda.8.rda0000644000176200001440000000520012377701075014476 0ustar liggesusersyTUN$ * < Qf< NœH*I PPIi"iX!!<Bk]9awo/T&Bhh_xBah0~Q z=P}/9[Rivp~҂EHsOk''g [U3G%[*6iue~!eV5и=l[uݛ_۷u[|:?W+uf% K韠R|Wup;eA&ߔNu/\^knGKhLNMٝ#f\6aW)D\ZhI"nN+ƭȘNt$e<ߴTz>8^]:DRb-^8J2z9Ilׄ?F65őJƢI;>OYF[-S;yF("E},8q(wX+r|sloEsu/Y5i3u. *-I;YE.F-Dw.)hϵ-:StFvZw g E{.wƋn>.:sO趭0_c&+7[tݿ;ަn٥x)7sz[m;7G};%u& *!%zg~hҜ8򷯞} 3p\y 5 u6mu[mwʲ_lҏJ%f*]̏x{ྡྷ٢[RHjZf\, 'ڲ|k2hvsp-9St6]m[쇋NqNDS:y{Y%ch|߷V4n\v|&6g{%%~}j%H|+ ՗%{}v:omqs]SB:ns#dqS|uVAZ#PJbӧ~׏v$*XGr:9nf2jLWܧI]&M]K϶ۏKtX%:<}"Q~%j^K_DP%/;)%-/qYS/I !J"cDțչ-]uTSw၄[px|{WX[|F;~>jq<@uG7׊g W+y]s]}f_{?߰_9ntǽL ]P.b/Ł>ط>?{SwG7tq͈)nbs6sXA:{*f^=,=ع=j0{|Ěljɽ5bD*9_YX)]9]9Ζdb}oyb+,Ίۙ_,9|&GE{$6ZJxȦguߞV:$ù&.~jƫ~jW%y5&φz~>z_aU>oÿ M|Njlxklx}\"*}k>>|Z"W9@r S 9=@r( W9 ]@rӀ8 9}@r!H W9ȝ@r)S X 9Ƚ@r1 h W9@r9Ӂx 9@}[ rB g#!A. rJ["O rN{ ')QA rV -qA r^ 'FXcFAre3 95ȭA rms 99Aru50 =Ar~'vBa@KW*7=%@Oz c^=E@OzУ^,w= e@Oz^<=@Oz##^ Lw=襞} 3p\y 5 u6}b'@/z:ہzA/zB*7=%-A zMs=)MA zUг=-mA z]юWyM0Ao zd+q]4zlkލ8AoztЫ<+z|냞_P{8 Rwave/data/signal_W_tilda.4.txt.gz0000644000176200001440000000203612377701075016523 0ustar liggesusersے }v$ H0I׍s1ٌo"E['  -IE(Ss"*s*D޷\quA0xKsek ^\{: mZ8z%F6jF&I+ޮIeosFOu^bMEA:@z%(+W,a?I-'dYmմXݗd$뛭5Sߺ]UZ}ڮ5Y_"X]D{5eͮ&iw *ȢT>0NYa qH!&C.gLn2nuַՈڞ2(>VYe% gQmξ4Ee $Fԁ;uϊI=&k7wQYz )һkFZwkGhs B1u͟ڳt܅OvzMc *}}@?U7AAs[>z {< IGI'I\yW(*%x^ʈU(VgO;~4AgNk^O\wEGb-tuz\8!*%f}Yc.[ޑ%ɥIց.^DIRwave/data/ch.rda0000644000176200001440000004404212377701075013346 0ustar liggesusers{ȷkZ6XIHRQ1$JI8E CDL!","" )ᔉ"bSmoarS6ά,-6F}ɚ?Y~ڜ׹9|׾=|k/>7w/~ދw/}?ŋ7u_/m9_?︾?_/׿_|~}~߼Oo~}ǿ?׻;ww^}|__z?w?}O\7r?߿߯uO^~~|_}j\{qݿ~\qgqW\3CD;{7/ڛơNoۗ͹pht5^wgu?\}Ou]d>v}zh[ƫyn~z޳;|6S7tsGo||G/;zϮm|[vKy;{s.>y~"A{{Ϲ1֗v{h?w;gZ=q;pQ7_hNmd_ƣy$>87G~;qӰ;W:?Z/SEZ'Ļg=_y3=i]| c|/{|v7_=_on]G}qasuY#gD΋P?h_ݷOWȼ~}g|y/8S]v3L~y˝[qFh>::l楸7?d~^:{8{r+ssq?c>9[7r@~6{|?&xe?}{uѴ׽Z#/Cx}fy5ncϚ7W?{&opQwǗ<)zr}nO^/з7~gb?{.߲+g6=kW;mƯof_';o~O#? ;I=;dz.ky_i[yiO\ugF|u_~Ja|gq|fNϼgOKg G=l\ Gy8|c_ĽߺPoWy5.nva!5_և׽9a|dcouȿ[x}p=o[\nh-<{^gegxO:ُ]{lվ=7oyT uݳƩgx'Si>|e^NiŭzO[>uy;O#ϑ> Z|ZW~A]濁C~hInN8uك֭8 vg{ki>y}'.n;/]t>5k9pcg_X0Ns[ծ =q 6|uQ=={o̿lu`3c:Qo~1='Q!vu[}eW-mxYqt |uQbq %έ\q?.8Yln{~< Sgla]|8O^^0O_x6zEqmoOg}%/qyχo n\S79G}7|hyp7y%o.J{D\׼xƑl ?\|G׏&=q{/"^u"^|Գ{"Fļ ﳯK(g#,7s֍_쫃74/xkKȧ{!|3Z^֩oyV# ?qWb}zE+ήz>cF}_~mc< jsɧ0Q%Sˣy/ 2sy!?s x3Ky+ٗ]`d=뼋/j:2W_wCud4+8S#`<^8p^a Ժ a(GI o#+'5 s~^}p͛ʻ7-~C?:?v}5/8+X#/95cĩx}~ٶx+?-N7}y{<slO(ਏ+.h؏~;M}1inw~JΟ/5^6&|qgU7|r_*a4íX#?>R=s֑u^1|Q^řwq{Uĥ{_iDMRMmąˏ\IjtKi|:+{@I/: x`K,qh'r}l|uQo|>uyF^x] k~2R?eB>tD/+c|A/G}.?Bfv^\ؿSz]Stv<Wގudv{nC<8t";Ky~i|Q^YqqU_\8|8@yZڠl~azTڟE^S б3O$.7s'v؋ o$@W~x?$Cn|*~Eȟg6uϊ'K ^=⇞/ Цo ^{[#?Vxt_Ww]xE7V91oLr}pvꓯ@#nuȼrx֏G|!?9`o2eOիQIy /8?tG>|w'uOv a}k3[u3ž?qguO?ǿezS=wyT <[s]ú?Wڦutu9Xtι!O: anΏ}ձR|1׫atQ/uC4Խ9k+?}5;/oNsŗ][y\xriuƻg9[t?ϵ^`]y%uu-x́{EI>MgSz* g*>v .a݉#}xgoZˋSg_:(ĹG?ZG;ϕYֆ~qy yQ3n]lƹ&j+|_ܼϣutM=9y c[_{6έ'>7|;=gB+o< v=C\\a|z%?u{/У;pqOϥN4*ĥXaG|T{j/=t :u[uN<.qv_MTTTꖈcP׺sprO-guW_ųZR'UI?}T|qjח,|툧Qyyq99nO|-|p9#{Kek|N+d8k芪Sķu} =_tq,u`צ}^z'm^mg3:}٧gͫ^_3ⵜI(.HS%{4 ʊ:'zsL7} <:C<z3}?.|ЫgޤNRUz? :FE]4KߪW]g~=W?v]@=yxA/m ;~yTrwupN'`^xy˷t_ 8L=rǯ/]Ou"Gܝx&q }C~?pΥC۰+V|x>vKS8 |? ހ>8X[u:G#'~CӺq۾Fjeg>=i~pq57?ׂs}oN}GgQ';qxikԗ#>:?RxiQԧ}+u6P#};^Q< q{h(`ßg_Mx5OWC=#yz)yѧU}J3ѹxz[jwN멛ٿu&#u~dZ_űϳ{9}g#&jW/R/SyyE/y#nl%Qq}6?eo(AkS'鰢w=p͛unp3=kgoyͳ<}v| xpͭt=ojrϒ!Z9A馛Nurwbn8xg>9#C#b穓.!q>VoEEx y =wV@kQ&d0tʫ3^WC=y3cSLwA|nݷ_.~uU/L!Ozusw+<ΤN|Wed{Sn_?PC=p·BlyIq b|`OR?}3S4?U-^>{x EWeO:-q_Ro|'rKDqOSZ~y9Gt%zUG oFy7yX/z%w]g.W.$3( ߆&o\_~CS@q%zΟ}S|:< n(g3g}+&eS ^^/YyTuOCv^;:j֑=oWo?t[k_ Wğʟ 6qFI,ۯGZg~GJ~j ht!;yw>|cY܃n>Q= C@ڋߺ8ڭvә77&.|q$ַo'WT\M.~?/RG?>mqq 7~k'#8~z[sEZnYaYn a˟|yg>Dt0eyT >ÏtVѼПaY3J~u]q6$nϥl[_jV^go[dy㣪8L^:Vuȇ%u37xcƷg[eŸؼc8Ԯ+Ĺ_}'m|(?\x|MQqkNzu1p:b94tc>ވxNJV|gީc~Fс:y/ӷhWսPMхȷ #\;\0.CO;LIuF\xͣ]x[~>XM<773ş[n+.6`k۟ }+ig7=W>P_bGFN~]YG:r+,[u=OCbv۷voP7Y5:z׍Wc<,փ>JhZ[vef֩;c|=iy#/^gŃ{]ugye|)V޷k nS$c: WNL7f3~F2KߓcWO`>Kߗ:3ꮺ5V~D}q˿"8:SAȇL=s䋖J݆N/8W֩v_?7_z9j?$c[3/Ak+h~=1g}Սk‹w'|P^7_/s辿W9~͇Iqq?>Yn=WTE_EoM3.ݶ hX iOXj-b|o=u%YOj>}^wq*&<[jG!oơu~eD8ō K̏5n|Fx1^|/m?t˗Ͼw<.![}>y֭G|jZ\xGxr#iۧMj7Zo }t~t=[3 V܂|V;OVcu!`uՙԏ13*?Tޔuc{KŇ7{m}E:%i=G'?|yǣk?nڧKԭwh|ՈW^ 5%AGs6=i~Ok]t.w}g\Ge g}e?/w"=w#@͓8 u`[O|*#opƶU]~837[C ?({KtӇv,4^VgxZ~zoI'/~GG"6n{em8!зp͓^ݏ-~O#o(B|O.Q"ik/ewᜓۤ}ߪaazsŧɚWysg'?N*YKqu'|W$uTF8b:}qֿ; g_X?u3mOJ&{%k]ֹu|i\Eʾ#_u|n|Y}!/h8:tuzMu? _yY]^Cq[M]/߼ƈN# =tz{)u૚wqeu\uzCۯG=aZNl_ y7Y{ߖio#2:meZׇ񎸥 >(\ևǪzTe.>kĕ/aw ogV>J={ıR}Q<#X\ym{O|[oV/blcqI#Ҟx|:kץk<[2^:}yQ7}_] >:B>9S}JyuēTzaK8O*l~G5Ϗ~[׺kO?yW^t~7 Ne_7qِO'EQyԛm??0pԱGTnECE\>Wϐ!:R_d7]u&cܑu^CM^֯#05~鱛W̛ ~eW 4_baOɷ':o:,>olSyWϩmHqgW{lEס]aө,~eq2~k۵S"ep:]j>.^gSiUFYQ@(?Ux>N$/VU:wOʞ77wڭu?W[G >~C+7AauW]\}}3Ł^] <>[=O>/ʺyHE{g0_b ܔx 6gom S3o }ɗz~:?m&/`\&x~8}'JCJ"ywsuF%jG_|k4~_iT>by_<)}7=c__B[:oQ'<xXכW~RW}MB?~Dz,>gԁ:ƗF~Ѽy^ PE\7YW ̻.{/d-D y< Z[|.vnU_[>C?B T7t\^ewq8%s'>}ҊS#/^t^@%gv,V7ՁYx [[qrwb}C|uUC?U]{릞8yŠggJJfK<8q,s'Z絎Njc75oz[kRx?7:ǣJ}N|.;77ubսqzR_:Wxx[|ysW%o~u|~<أ1\UgK?p=.z#/zzd'OUuMnVj~*~.8ѯ|5C/"u̘T0m}a۩4xgꢊ{QW^mo~8gMS\)Լ#_:_~}|77䱳ᴴ'˲nؕO5Vot%_}Cd@ܥPG.~G]VS_v˳?x{G|kʷ)ދ~MNp(<:⨬{P/ynC?Y|8K~HvJ@tMoE~~Wߺ#h> S~W:{ Zd#^e:Ϲ6믹no}+_G>~:@_K} c>s>I.n}=7\&_P?\_ƿ?'w8f_S7tn7pSy =9e?#d=T|v_xkyԧN~#X~㼠a_{ ȧVZ<[}EG4πð{͇up3$ ;;qGy>Xg'N~6|೏>Te=k7gUھާq2iPf'oZ\qP՟5K |;0&[[;n}oN~m컁0}Qw?~>|uGm֭z2v9.rQo@\xO <쫼q\2y(_]utG ū&~B75]|}|o%;Gx+OV:g=(qOX/k> 5~y!꣈:yC\:ɞ7n|^<%CL>+|yz?q[7XW4h޲Sf)K'!{g_W ?=M?mޗ>$e.~emѮ?htwn#/ZՈ/M'uѿ7jcw{A\ͣ:-|_.$W>!kF?׃֧:шV7X~y]\/XR_q<|<.ݺ}Z7`}:gJ?|#X3?nڸڇ@3sU}qO_& 'բ6t>:5ο}K<~ί_ ?G$<ۨKy~w]|M:/WeW^E:UM|u#X:s.M>4uI4c=[%(/xQy;q*uר-6҃k>8ӼW[A?HP}_+8y ?_:wc[=~y?z _v?R7x< OW竼t~\7#/8R\vٿ }>vO|g_[#Maj nN~_c3u%wg6<œ{>Л>O_5>p ԟXx Ni}qҟ@OƟouDֵ[\yqY{oяGK.?*5{<~~^q_/Z\zzAꊊ;>C:8,pC?B~x+yݟ_/دC^~H'_Ư7/yUgÂ+y\J~`ԯՉOz->'F=> Fܬ|yLz_a2뫛nq(1'qD7M~pwO_+)9nz_em]oFozkU'ގ2doZao}󻭋?q lyy?_/2w3w?fGm}IS/ʈ[gb氳zP]^@ջkσm.|&(~A\qP9~CƵ}$(_U|`qWg&|1Λ#~ /#Yv| ?y?YtF'˟ny_9Ōԓm?$ƾxO)ۧK3O㏾AcOIi9|z:ȗ/>Hl8> W:㡞$5/ԯоczv{pV8\&35oN3l3]q?t#.@W| z*/E(~b[}$8pчF܆<)GԼXILqp} ?j(uG=m<pZE{:ۦf?ƭk>7}3/vCݹDSɷ=9 ?R'^?cAobs\)|~vA^IB~l놳Adu>B܋N~=m\+&^K|3K?Y}O~F$] 'EmEӞgo uᗏxV} |FYfqEƫWO];ٻ?xyVskՃe:@uQȟ[s:|~6%׷>(O_8G6;1c ]OF_vя~kkG=>WG3yj1h~Ke>[؂eC_ο`П_xܓA3ty9 WX==f=w |\x]q8'TZQLEfz:읗Sub{yd_ gUOsW{nױn'8s>A/e~}懷<< voW[6e{y~:Թ>7,eggD\quY5yHǕgcIO՗ȃg g"_Y{}7g]>#gPkݐ`ܢ^}|Աu׫|׍<W~8_Exn.:hG]QO[-zP#΀<֙yr0!nKf|qK:oݗpG[TyaOZZ/~5.jqޭ7=YA%w)]/ %q3*y7Dhs̏z|֟:@~zN$ºh|pz[/j\>g|>י:6}7jЃ8:%թܐ?^H#/s ZKMU=yDD>T3n$@}.u/xu](#Uok\*.}yy^~[c7C4pq + kyn'}s@{IaY7Ї."@>nQK3׌]<ڂ˿w|K)D?nzQi\$\W6_l҅<^t>Qg"8kߏU%y&I 7XwN ~m~[]qD㎟o8 ]{/7?#}кc_~xa}#ZsfYm8t%z/_W1z33%ܽ|C#{['i}^ޱu>'җy3=uyn3"^>q9_L^y{ͨLoW@~koT}1|09צ_)u<%.8QFJ>`#6/*:s0x>ٝ#A==\yQ,_Ǡ/\7u\#{ޘWΑ1Qi7/Ci{Եk1IgYblzLoM#3^0ܺ_渞f~8Y?k +0 ]S}Aacp%Tmq֧S^MN ۏBu`Iʷ,է^nX GTT>quL׉(SZ*YQu=xO.}İ_'{:ONV|ޤu v~B̹.%wۭ&OT?o[T 棩7VyZMCo7#;е~뻶> 7¯QțJlSkX7ܖ<>e=uyޏz ~uĩѬ;{}y.ƨվRyw"x },$V}g:yDwּ:P?{|:D_y΋>q)'+WG|0}ۇ|o@u o>&W}#ٷ_6SVws0(ti!:օ>G$W{ O]?֡c4yx=ߋ/<Rwave/data/signal_W_tilda.2.rda0000644000176200001440000000223312377701075016030 0ustar liggesusersoH]eǏ^euF2mU6C <W\Ե5euMt VB :{ᖵ{s,qⶩً5Dr?~:p'cO ?y?O嚍ݚ%kOWה/Z=n[֚7jo}6Uoi?k3=$.+褮=>jۙsUMiGC%ڳ!\TN-T8LWɻ|OrI[* ɳuK/Nvx#_iFnw|qZ*iŶ6g'R~?2SvSB*kGo^ Ւ[>wuhXn7~yy"}3=^C]`QX;pPY߽=evDh?Ndz+()G6ko]QU|Jw&"^ǢC/3:)W L1oVT_^IuW\z]k0y^&k߇;,7xi*k|f=k러7y|.:s1WfAv;3-掳eQ;; ϓ:Wu ~~JgZzѶٖ.Νn#zpk|[qK[<.qלsnuٹNEn֥GΝuky^Vo;튻;;;;eLܕ'w;]zN⎽⮽ν*i=`dKzORY^@Y.>ݦܹn95aUu_.*W%ڳՎy^}lgqWu/~?Rwave/data/W_tilda.1.rda0000644000176200001440000000174512377701075014501 0ustar liggesuserskHSaOE.HA`bEyBy-̤`JPJ "+\ٕ.QCnF7I톆YbC{ !~χ=y߳}٧'sCJSI$dy{H`)됭K~$io>#f`M3&7ti7ϕ̖ݥ%=\1G}O_[S:Sss{ec֛Hn:lIt힢sv9fze)@ 0 0 0X+,waaa8P(+2?^gxxpNsޱNY޼u\OYSw[ NLn#.LoO>Os!pBscq:ڿź.NSǝQםQQQ^S'^ž8u~<[h&.Bq\%+3M!3Jm*9ycm DUKQ!qG/)%.Th?rS<#z?oKo׏FJyS/}i7՚s|%wVZAՋU.VX>)NJ&Ysj*ʓC٤P2tȦ|6zr<)?J'%JG7UU&哲CPiN#;v:2<)MJ'%J*.VTXbŲKnP^o'ާUr;,{a'(=^j/W}#T2/-v!JKwKՖP]z(/}CU(]ZZZzC5& o ]XXX8-,|F^ ( D]m} `_u=P_ A > v'rmhW_KWA^ ~ %(N]~.L@'` 4tv>|e4i(44tv~y4i irz6?cM㙃'L 7uȏGy<^""eH/~J w 4a§ !/dZRpBK 9!!W{ZxQ^ w+eDx$ARy% N\GR2'JAyV+$ei3~ie$Q91+KƼ|[wrNG9-漒;zL><$2kif*^H_RytM፾jVZW *gU^?Yi- Lc43 ;YN:_t^h~,mH Ir 1.Ȑ+ >ՊPd4`l)l[MYerQ'eJvZ5v6Fν1ԥgvHQ~"̕ QA2]edSUF nrfٹ1m489aDѧP]c^1&x q렒Sʗmc`g\i#/>"%Bq[|}pT]H<~ hqjc+(: ,>cY=T N[zj%tCgCrn??~5JQQ=L#_#(%qhU?-sU_yLKLJoEg}w Xk'e/-\iey WU26kIA=>;yz<[fAI O+4~[4VFvU=|>k^YҊ䄎+%}wg^ZҾ|YU|_;~9^ϫEzdǃCpQ>\|m-P~u.'N'$w, P܈[ZA~VVUHny5V|qXQqRޣ߹-{x<Ϋ~GӊOky;wR})) Wzt(GH<7eN~ɳ]C5Ug-<+S5D_byJza}Qڍ5"~7 =o߳\4X3(CboFZe42^nz![|u|_n<<8{f߃ҭ˙/I7A7?f{u<}1 ٿ_l^7;_\{< 39w}v?߽ޛlgWWoװ{6㮏cG'>Hn6칇a:6_Ӓ߹us}}:dCߡغuS(_/d~X| ?S #^e;wocKO8u>tNɿw'*f ^ތxaзu.x}ӓoq֝8/?qk`pfo϶vIGF >Aߖ ;o3<,s ;16L7SsB |Яg?5<3\H|zCܭq 4ג?vN =?SvbG[|vx;>_OFJ/ܾ7aߧcf\E~C~t/NA>xwu3~>vwW[WSrg㽙/w+9\;\wzY#7G>pYσwI$Ov$x"=/叔Wk~'ǝCث Z<^IN>nsXz<!$/;ʕIo:3=?|ir|*O' '\{=D|.٥@/%O8q13~~$v*v{r8,8/;K ^Уg>NT<19pǹn8oƙ >a癱}ԙ?!.\+肧]s3=OÏ [$E~Hy%KnO>ssGW⩚e)Wo/Pʏ\?p#_?d8S~E ~r=q.;B8.C`|۫X8?gr>< ͫU&{ֽyU[ϛi.5s&+ď!Qzyվ ٣O7p)/ʼnּN~39}\jټϞǰGGGT܀}h\қ7ߒyw o.;}țG+g-mO VL<< eW߁w8IWzVȃv: }O<<\ƺm4-4z2?_Zo ,4׈'GxԴ޶a7gn&Ϝ!!6Khry=Iue!pKM^# ?E'tFxw-~6Y S5ckxpX;A| G#|Z߈{qyq_8%9xH|5N7[kS_5QcCq~뿋 x*{;cTdssSxy+ |` '9W2>;0>?Kn2929q e??d w/QI'a&/Se7wq.rwySwًGz \O3;O6Uoq7?oj&[/ )d¡TiNQh~_S!ߓ|]}x{Keց! ^O'' '4on}-ׇSwȯl!^8A+9_?!/ ?|wI~>qu;>xohW޼b1ƣ|{r>;3!>B>x2C>t<{r7C+Οr=G0oCuog=y_̨Bu fܼ܎.qyh*>2ȋp젞~dԳB.>3aupކuf筶Ҳ˽: ' ĺ3;wQoeyN2㩓>}\<' Ǯ&o+yL{~,+i=~+(Os^,}x"ơu@#=PܢZrRY~-CƥyNu^2<~V1oz@'j\la ;} ;}a@v ^>i}~ S^+oig1_g7p|iK u=w:/C8ЃnāgOKQUy]r<r|~8bօr !NN|fuoSMeS<5'Y#k'}N+`'嗉_Gf?W{ə]1k̛9m$N<ߧ~_4=yrV"<]5cޚxÒC伭ؐCY].y}n]cx&}<wFrr|E߸pg}QׯedVÆlݏKPg?:O:X}(g.x kَYۇ?:o5fཛྷH;I 9H9en Yy~YKqRC& k׾z{2>{f҂(zwpSz"iVtojUYHKTtOxen4¢H?v҂"H=R7[>oa%ۨE @M=zzgCx26ظ-cfI?oūFż.4{WvϱCä?o7~>Ł<_ɯ+-Ey32-y/m{[Fӝ܏|cZֱůCsVǪ.ww?a#0wg,zl`C;Em;'װOw>h:q;x~w$m[y/مO9uy+7sy߹gK~iοnqn011< ̌/]j+/yym~Mc L%G Vps/CG5++\ָKǽa wyǼy̌_wGs{?˖I~wsMy7Տ9-ySܠuFyƹ1;s-9g玜N=}.|C\0ṧA;g/ Yqws п-{g;xn=FC_Yؽy~fۃ7 .m^S@8]4 -~i>%-˯ό1Яs'^kX_uٵ>sk| n$"[>8<@<_7i絡wV5ȳ;O)ϮOZ5oΦaߛB(}jF +of“g'/ Aˆ\ed~jޘ7K>By"/7=!~q2a 8s\l}#C.s\%k+<}Co翌gtmۆh{#?>Xy9#Dđᑟl}VaGuc_(pjQOxu^&nwaWZKW.j~qf陑a縊q7v_w1ΞςOlskFȿqr=7 =bϟD~h٧ϪkXy3)ӤU3x7_G7dJ#1@?\$v`Qc#>45%[2%x供}}VE!{>#vlѳC{|^1ğ9x8/_8Q? X7DЌ#=c7_終L1х#:,KO|cwn@\[0∷}<7aoE˰[<#߰__}c}}5:o4[#VeKz<`܏)yU<^ᚯVBϓV3/M-?[UmCUm =G7ēG5tI8(K Dyo?;s߹߷1E y2=_E+G/lߦV~I`Z|_y/GЎڽ/ǫf\7"~cqqۨGuqǂy\Sg݇z%{7:[>Xoq^Q{aB?3mߡ#)h:_ߛ4W/36{^?\Ⱥo}g#I+ŪcځuQቧS'XBV[quzȺD%Ǩ۷?_o(8Rwave/data/sig_W_tilda.1.txt.gz0000644000176200001440000000073012377701075016024 0ustar liggesusersAn1 CK Q/x|݃-G{adIi83xM)p_.22=˹ }u6t$X|X|֩Å0 +tB]+t7)z@.ٿU Zp&-cJ&Rwave/data/A4.rda0000644000176200001440000001131012377701075013210 0ustar liggesusersEYyЂ$R)))IJ"D%kE%I_ %"!m 3Y,w/sgnCZ~~YwyyΘn5ULLLꏘbZĴ~U G2zPsfj?]Zn{̋Se妾\ ͇O~Kp~?6fpo1B;)]{Ro~G9͟fWn*W6Gr1㑭v3}hv'7mN${>e't@_05E{ke7;P (i̽pCO?:ZpX΃_3:}E ;_֯`7J'dz~N6y +ln4*LݑU;m&r?n+&z>rFnQKAeAW2* Z{VoH6*4^fA;ԪzE$C/OD,,^7^]Ө N_8lCZ\n>!3y97}GFwRFQe13&gKd1ė8|C]q ];,faD<&eOqsphT@OCP?C'jclW^[{"Z9FW:%k2 Jc':Ү!zxS?[f:}-ѐW俩fz)tof'2p6-YJ:4]<d]{+.H6uG{/AA4SikD (/G?ࠩ'$K܂Hpn dܓ5fjd~y> #MwBpԣ2}SajX+!dΆgs`pzNc mJvWG&#wqCۦPul *ϭ:Wuۯ(rLP0Woa"AEߑ3+̼Ži!%*z· :QeC7G9.-(ɫ)tTR87Sfnik'1@Lӓ%˴f'P3 \L^ycmPqm|-S1|σӈk ??[`d [TF mRH6G*?eWC<cgJnGifhE_dr< ;s4+HEakTl~R긽gNpx5ۚYmIausQ(}&P(1xD^]yNԁ r< SWO#2TI"2$yd5q;H4 *6|pvB ;ߤRKIkɡE_[o834њ řZ_>ßPQn8; '4_߼QmQ,<ꬆ[cOK@2x;LO/ȍzͲUG%]oxO{8nr>OC\:FySr /d8yWk8*MS}Cu=Jc!#K22UJ](c8 T@O$k~`Y2fvbMOWTϰхlƆtѵT#ẓ?.u#wBF_QX>G.>hHA)t鰤?u>rW4I}.x\]'To㶥t7:kꃚ O iZ?>ܕ`6˜ nEϳ!]ۑm j\:5%#u(5FvC1| ,b`8XeORl[Qn\ԛ@jFD%q"|P'G /Mu;PEuM@ &XnzL+Fj=“ #)Ytc@+|H˙)MzN`4 7,bZ/'lx٤mέ˦J(QHB΁')_tG,EuJMF%-h4}re6_SYFi-Ԣh HPɈTʹ=.~ 񋊘>**s2mY755}G9R*J) d5-˽dW}~&7s3T1^.3M,Mmmp7RNmx C&=+ OxKuқ,{1x`>N6輏͈ajDg}/V6jNjd 7܉@U:UpXx+EIAN'qUbnw}h#_X0 oe|xq? %Ps'gvu%in?-s?DioQ"o)ICxb7T6U jжK2 ,s>Od:E3y<Υ:ÏɧUiJ<ɛHcg4 lC `W LP(]ZU\7>`H\ķʹF (}xED_p\5;|,sP9%zs~]?xzh+Ck4K/di|P ;Qgx ؎LI2܊S&~1Jײfi`J*%9huB>ba.{mF8R9?<):2SUO+~38&sB?|R?w/ܴ^|l1󅵌w _Bn>4wdDo047d#!i,Q#o"S:8#i|D#U?"gPYvQeҷ?zJ]+ 1]S&Z0W,88T.'P#JNf.!(<=-s$y?Xn2%oXA8풟T2z<,2W n49/%>SΑMQ-Q"<:KT؜IjsLNo=6~o`~lի{+R699l4Z"»R˨X{ {f<'ыHn[gNl$8bxe]">tIOq`9?8"O,ϫ̜9">[@l|hrR{k SJDW˼u]H|/Tx̛#NğlsB_/N1v9ﱛ9ER'Q?ʩ{)aa>=,UmtVHE휨߀oa9ע#3d^,J+s[K1 Rwave/data/signal_W_tilda.8.rda0000644000176200001440000000723112377701075016041 0ustar liggesusersgTTQ" *T* ŞD]BI$6l ;QFWzՈ{l ^k1A|?|X#|s8fcVէF9[~QAC-u" >`pǴ>a:*? UlVCRٮsT}'յh[p$uFOUԛ:? )l_#-OSvHmsKsric37, f~zk--ϻUot) tytځAw>sݵVw>n}ە=BoifZ=kl˞w`/gk{afIfߜ>f}:b߀O+g߇{'taH÷#α#)n{?cWgxh0EKz*Hl~prwُ-/M>A?fgyqs=a8ج֑9:Fq𛘦g$b> pŲ'z? h'ˮ1ro˫W{:;'I>auA,_p3 ,7V1˯Wq~f+4C<Vfܳl8V|7sィF7u*+b7GlbŶ5W2&Cw3UUVxGZim8C,9qC l!ۛ !s7tΙ#9ĺb~ 1%|68||\}ʟS>y|]<0/<|k:Ŋۣ2bFa7kSOdgVXuܿ}} +?pfE6麇Y?W743h7SF)of9N~vЉoL,yhe,٬, ͦLYvZgWU՝dߎ3zō൑~_tVBU iAq#]k Ӭ'qp1[Ƞ36r`unY9;N+8`Xb׿ƶNf2\KgI˱_h,ƲonRV-nosm-wa%O1{?|گ{ZE C#n?|hJJXsza{v^*6{}yº;mbYDbъucoaw%ݓȬsem۞yŻ>*n}?[~l~$Vq_ҾwV滹Sɋ)wfWWbwoܮܻ?}ýBk.Vż dv/:Nvnf ;v}J%;n\fr~v&;6~yDei|d|iߴ>Ci %#5^ G.bBndS"}Y&lC}ض͸&ljV1878S߶v[0Þ?ĥw:@ϾfS_gu%sL:u1{ hHܵK6lCa#+3آּ񯚯N5~rTL q{6?Gue6ir|%l]6l:4utn_`f7 n;'m\LJ<3[5w#[aܘr|n:[`|Vgͮn F7=ub{7 | e[ZTn/Jj^G-9T-~꺽Z[%OY遦eKeu=U~)X"7/:q^d8qawlt'c&'>s};0뵢Ek3q_4rLnV=d {o*q#ڗN;T Qz q~R 3*e{+UG:~B'Кm2eǪ~GU9Bg*~p&uH8q^V5pB\WcK-:bvhf}-ʊ\|QZ8%k OD_ceMQ(џXG_}D/AusD}kDo:.4-4 D-szh|%kR"Pυ|&q1KbSKOz/q>@J7mG)k>TyS-O>7^E?Rx}KE;gѯ$~OH,]@]Kyu$QbI0LDe[%J(QDeҐ4! iHCҐ4! iHCҐg4pKD%JX"QOMKs8qR&{}vE4XϞ#܂Oȉ(DF#rJu"ԉR#rxJ*1"؈ܦb#rȻ*2Ud"DG9gMm+4 WXr O?%r O%rSwD8VK SgD.((N!RȕK)JZS%r5U)p9r@UPq *DN8S"UB êJ!U}UBʊSȥU% {+NԷ ]Uň\_UE)} S,N D(H0}DB8_ĈjqR%r)p'Z 9jS5/<7L!Dn|QȽ|Gs͒^?:.j~,Pu*~8)x$Ks+ȒZ%$x A%$x Bǐ5$x CE$x DGU$x Ee$x FǑu$x G$x" HG$x& I$x* Jǒ$x. K$x2 LG$x6 M$x: NǓ$x> Olǵ9P%|3J<(3J</)SJ#?){JO*J*JO+J+JO,?&&xe Yw%xi Z%xm [%xq \7%xu ]w %x{ _ח%x ` &x a ^= a aU~~T%&x bǘ5&x cE&x dGU&x ee&x fǙu&x g&x hG&x i@Syϫ|*y)?avx_&x nǛ&x o'x pG'}d=;NO9[N9{NO:N:NO;N;N>?Xu O<+Ox ^z>cO<}~sKJXK=]\.m5G<%ہREe<_\2~1׍444bH,V?Rwave/data/signal_W_tilda.9.txt.gz0000644000176200001440000000615012377701075016531 0ustar liggesusers[8Eg/3A|csi.>JR$r_;質ϺAY@1f̦Y<1x^3:4x4BO3c0s4VVdg|/g}{/k*(V䣒4Kb},y+RW"7߲.WI`~O,_f2kY;y&#̦߬8ͲA蔅<TF4-Z. P ! I$$呤ÒŹVo٥Cz8H(w!i$pS/"u:=RI }Ou]Q'E=ü?].ۻt !/:R uóF(n5iAگ%r1K]u]'K79VuR\9Q "){SDAH)E: ͬ2US4Nd"Mug{Ϥ)./.(HyMj7ޤn7)n$IiG*ߢ~ږM*7)o)7ɶr5----[-ٖҎ %- [*[[-lK\SRRؒ_m)HL}KmKʖ|KJһԷ.nl)_Plɷd6/mn\PRlɷdv$UzM}KmKʖbK%Rڑ5-----Ŗ|K#k7mnܤؒ$RGRoRI&-7oݤ^2M&wS~7Mw:?@T?@S(B)>ԗ}OTF'PJS)ۤ;M QT$_/HK&d?t__AZR} Py跡Cx?z臓=C=CAzxx=<q#=No4^ įCP_ӿ<à|6φI? @O wAw=7 {ހ7`|Jz 7 ߀z 7`,`kkk(7߀`k5zZkk(k/00| u m  {_C!@YC]C{N`k5 55hkk+5  55%k5555kK@^k7a|ЙW`kkk(7ހ~Ʒ1yv 7 h7߀$ `ˈ  X!;oG*oT3! e*C>bH"2m%G8Rp$#1z;%Mx;ԩNetSȜ"$8) NwRJ'9yHNnqs̝&8aġlNh9aDN$8~wxq`W daMwȞ@R$pA`g`H J@`  M`+X` *#3ѽ ڌY2!]kdU1BDT&guɤ̖3[LldyaH(BNea 6XP_/Qa_J]i2! ia;W*]HUvQI)RQTS ъ"8ʡR*y+.ƚ1ְ|#ٯqKm,aF"jM60o4q:V ;!IۉNv':6: ,SdA<( Xll3H22`=7W~8H# ݸR6nSFθ3.[Vĸs0}6Yy46K2CP3䓡v bh3-- `ȃ]vm;żQ͍"~4 x]Ps{4<<<<"-֨mx!HF T@_~F0]Ãñjd˟܀wF++nG/fd:y9Ensn9Wff  AKhMXU ،<ǁwX̓Ɨuu=ۿOߌأñԃ/O}Z]7|'{z-y- RK~0m~uM忱;6L̃eiD򠩒z\6Yٿ65P54ľQOT$ 5Jٱ<ۋ3jr8׋jҧV\o=cWhGsz|y8*3⇚Sa9~CU{fb&U/}/kT+|}|jx^~'KT!S]c)5h%U|w_)[O[%[%!oj\Xc:Q?GekeeYd~}Ve-{NjqgGߣ:\uFoD9uKl9q˗R3K*'=EM}ݧ/>y.܇Ϸ_ݗėgɗY,}ޚ{=aC~z\)~`>zOo;rԟ/oΧƵ'^{u"Xbޗ\~/֭Xx8^;vK뱁y}݅>mNO\^;ƿ{΃俆>h^0cC\S~%aAgC<'':q?w+r'\ѓ;`ϡus(\Xvy'*M}`?_~ t{^r AR"=x9>@bq =bx}[#o?D_א7iX'}BO £p`=^L~Sҿ=p@`KxP80].}OP5sC wlc5{'Z7ǚ-_Xyx2\&_?> 4G{56?_w!}ez(U~]C*xaz'9%p@~zzy?<;9zu9P>>~ 󅂏k>0C|} {Ӽ_Bd{>}m>>|eo \Pߥ9>|g*z"ϬSwYu[1GoƁ8P&;ß^ycօg]9, |:J>v^|>nݧo xŀ_^sx :m 3Zj]U1ߌ%WvXWqpQ{==ByBOԺ? >r}k/Jqd|se{O%O|xWS|[q ,N+|QN x^XNv^0n}2Iz!%#=|='߻|7a<Gh~sy7 [9XCŽ`ʗ`Z3u9[x_agzvd=|‘m. 8%^>Ƈ#^C>~ I/rnG㡟Ҿ\~~8x\#u `̓a¸oO۰SWTF~Lx |^4]8W;!_8B>|_KٲÛ^(y(:I?ō{k/dV<E~wp{ ;sɯCǹ߲}8]䕊Dzۿo|7<<@q 8C~aqBqxI_ی`+|xožQ3p_Oּʏ dw.1kW*pySoB?x8{xGϫǥ/s m?&CyBC~!yv~u׹ngvT^B:No]xO9"?|^xx~~bEzr?/C^vϑESuMv%x =x)2xXxx"w  Ot^:EBF|t¯OO~(_p~G|{|z u:G/c\8>"wx =oʫ-{>@PXҋoB8E]ýPy ;ƭ}]OT]XH|\w!~/w Ouxc=č?/!>}I5Ÿyc~|j~sP=wo9w_noPk!?2<}׼#Ο yxsW pV'a\<)piyΗ<;F{9:_5  ϑ?C^~q yi|]Ǵ>sd_y9x!X9+;綁? 򈯡sLV?6_S~l|~m gy>2^#^;0F~kqEx+ϴ*rސ߇<Q~i AN-׈;7|}+b#,ps" :Sb|4n0=Qy&zryc-8~W?|A/pwx*߱ǎ3>|-3<Я ?܇-?``?"|Y-xqs[ĥ+W>KuM*~Gqx%=0DBG:[C s 8SrA\5伄Zٍm'[  xTYB~lѐuQEqk_|PewՁk_Gg@k6XyxubeqԒS{ KʡY}_}I!4#w>h\ԃY8 9 9ϯØ9ϱL$ϱ-3I"8kl5ȱZOZʋ幱ڈH8F=}eSzF}dU[zoxb 5}kW:t{Gu_1x~sDާQ^fm>}cJ{GއzU}Y 3*zocD$կxt_ﬤ=4Gt?fcDzzPzxޯ֮뎿+{_I4{y,;oD7TaFtx~=UoN.~o~4#bj\k{'cmW/4i^(x6"eJو>ek$QݣW^j3Z6l'س,S+yx;r=c8.K/>QqU5Fϗ7~XA-#!viٗ>Fxg}Fn#ٍg͖߽S⭼[ߟU}e=kƸcy|Sߊ=X}y[?熼Hk8@?k6U}۷8hkc٩^&;rX'؆Nh˨ taYzڬ'a];Nxe1݀>ױ |zEԃ{zU-}uÖS/Yo˺wxEݵ֔Qoa27;d}q5f /)h X_45XGk;NV}^әQd_/Zz +_z@aV}FX_zTqnAP7.|[Yw 5ԃ40n ! ޿%N߉ ݅لߑ@_%W;"%wV43ͣ h~~ %p_2u߬+Ÿ۰oԱV˿V}3ixE_7o╁1kF|2 YkE`[qUy65#tX[/-2/Џ`+f\{ɫ;a_kUFx=/ӓJ?F!>J?۾7w nmU^tqʞ؇b r#7 %g[o6ZN_ W]f®Q8"}ZF}}|xYaV?Nq/+]1axynk˼ŷ֍qy亭Ak׵)8}y}e|կ/ :F.a2qe_jG3pVCϬfS :VdU3z|W .)'_+7ѿrO}aԤyeGx#`'><*dï[N? 70?j4KsnkS'Oj; c|`9<ܷѧڏKN9j_,zuĺ> ~͒uyeڽ>U뎚?}Vt> U{K2^=꾅wB}FֽU=YdCG8Rwave/data/W_tilda.5.rda0000644000176200001440000000357612377701075014511 0ustar liggesuserskLWR 1"֪h+M-V+A۠O={Nkvj1,N~A(^ͯVj,J 6A%wɣ,֊[TeYX/ >5Zs,nޣW[<k:ZsDpZ`;y;d clvcץU#+b?l({`sKߟf`l6%`Ѝemn &/?p/oG_ .|ŜOЗyy4C(/F.Q~8O4_c}\ֆџ8C}Qty?K=:^quO^jZ~g>hYh4~ j9Fi|H@7R^/ћiԥ|^_׋>q<4/O<|R8OT#_w鼷n*T몥TkkQꇖ}H(|lEݟ۾WT8n~sOݝWQ^GjnP( BP( ۖ 7 BP( mEP(1͞/|5z-e]V&{|;9\vOzδېS/ 9B[]U{۷۾.QEߟ[U)MW$Xɾ˦}M%{QKq}<ʳYY>r4\6k-TfK3ߥ%fwMUGSQ?sHݷ_uO^YKY?_>bز/skx'L^\[̾abg{wMgLuy<<>7Øϛys]~z8x|*48_S17lM^g$xS> 17Z.P;#\by@m 6gȻ ryRxy<@o 8 7w(*c7zQFO8?ܗQyց@v /;qyށ@x /<'y恼@z /=[y!#aLABd0+L ;ꀜҴxGV{sA]m [ݖAвcZ,G 2mG# o:HX]_=,Iz\=٣2K4?8Rwave/data/signal_W_tilda.7.txt.gz0000644000176200001440000000305712377701075016532 0ustar liggesusersYr8 L _l6~:Sl'}%ED%ߔ ) kHI2XM8֪TLR̜%JC&jJ'>bgmv )J%J;Y ]oP)UM(U\W3Xja-5՚Q8_Pk,:Jg)!-yK8 fD84@0:oUj 1F !e]VjC]F,E,A9bj2zr&BҎXSD 3~G cD#uPLR#?ZByD38 !6yi5R똿mڊ;_: *=AF&区cN~Y`(,CR\PFˡ:4ZJe@t_p 8]Rd^>H>koYԑ8Qig5Gu(;RG;ҴtGQu4,ّ:Mf[ݾF7o|{lx1ڧ$G(>9sQw{+}VoEWQu䭉}zI4oIg,{hN4_7"|ɋy^ݟaius=cU޻\Vy;s25W9Cu5;Y K'$/]t_4@M7I߫CBJ(BB/BP(z( BP(#dH@ @ @ @ '@@ ?  |Wh 9P5ZNJ"iOCpt9CCC=C=ȇPBۃ~AA!C9zEBNބA{l:9-)ֱc{X8&ؕ_ pr,pd~?%;~ y ]!?Fy1CrBkN' :a3BkXQd'w"'q*qV~[E_B/w;c[8k;bdC`,nɃ[rܮDvyڕ$I&B 2JT(pnW'|'lb T:5#mfM-ՊEZwZ/BPÊ5avnAB:B1ЬcS$uZ hkQDծN>%P~^oGCdl{K_o*ۑl7ȥYj VݺW@vQa^SQ;n?.~ӬåHZڭHɲS8vU--VL-6S4;Rm]+W c(kV,zft S<65V]e. ?eRB3L:{ˈT%ņ{+-d"D{ l+6 7*cA[fsQ&̸ec:`Zu 9E~"C2Rwave/data/click.rda0000644000176200001440000001024612377701075014040 0ustar liggesusersKlW'mA@bdžl bXb袨H]VbSHHH]tQ5BP$v,?x{ǎc;mӖj"~G_z.z3sw~\瞩T*OT||ϧrTW^|7/_T^l^ mZ}mwXm[?T~b\I?]/iox;swuq*O4[/xdscilNϥ7VӘK}<|WH|!}_WN}VZOG>i\׸$0MuVw\J΍N:L7[H->oܪi]<ҹ^\Ϸ$JG_r՛?_\isFbLMI?HrkԒzϥI#>ҺsN ` {y"o7"Jrk\J';Eu~8/:'O ;4'ҸdO n;L:4^o i}4I#L>|a/7[i8GI#vM~}M9쯒 ?\9ӹai=Iވ7v'G_bZ/Hc~ȁ'YRF/s.ҾB/Гgk" }C/C'=[69)ߤ:7<7'x?]Q|G p q,7GA[%μ!?;_qsMq}].vy㼉\">8i|7~F%W#%+ƢpM$|O^qV:}?`ɯ~ LKs‹9>׺G;_w W:ۘp˼ ğ?Wsü^h~gb=x9N@kg6GoQ*ޱm pE}_iXE{7?[8Kx |O\|_s=9 1ҁp9`'vNszF/ ) \^>p1yڼz5/;~[]cS`dv߳/s4Q 7&ny^8DŽg"^6/~?WS~|J * ?+\1w3_D\!Nx_`@|&wY4,}!n+q^iX_R~Rı>sA$Yl~ }‡ߒF^#r~lyy$y pj~ 9p.:8O ̋_Apޒ~ }o{YH#8 yIܷ!}k+D [O+>~ּ>qgTxz/ʏ!_\-ă7[-<ľţzW?^2Ϥ~; G5zYuQynOn*韛U ݧOy@k9o~ #ԅz"].@_ΛE|].W"N_Y+*ԝ xnUKWy!~gM~8 zqV 9R̟/gnGp;//C+-ނߏ+β sM]) s$ɹxmCu%gv[ ߍ_V\$?!^9+Z"ҟ寶U[ڠUỹ}\?kk]7ě] UدyR?DH/')|/HmckׄJAOVu ٨ (x{/LGv}WvzqeW~Z[mG7==W/ﳿüz?s's{g{r/ӗ0!x\!Uiv ?B/>T>0xB>ㇶWs3o'z[]qmp\ďCW.ji_K ^q<_zב /'.YWy&yGU yqW'O<3x>~_VuO#ϋG~>>ی$fOyG+5x>EsNA$[4Թ8ԫ~UsVy +7rzQc>xOœї=2(7yuj5",ȯl rM~M]2?a֧8׺xK[/UP>-yO}*-Ǿwx#7O8>*? Oiy=MʻG_Wr)9;?mMqW/Gs)i%-r숺ĄxswP?꣉}5Iu9Yׅ7Kal7&^{aݼ{=_U'p?˔?WSSGP1[||y/__Wt%+25Cn sW׍_^?p}; xU n~+P>WfdǾ?om[%OS×ԗfjWxuv}>'QS>AS-/oz~K#ϱ# 9r^B`KwP7f:ǿO.RW9>sֳ!{/W? sW}7g(W-{3}ѸxŦ>Ӑ Zqx8wzQ":z }UѸד_͇Դ1|F}q-G

Uͳ)9O̢o+C~Y?LNRwave/data/D4.rda0000644000176200001440000001126112377701075013220 0ustar liggesusers=YyeK TZU«WH$kE)IIhT%f1fƙw>]gk$s5s9|Gl3M\\\ͭ?[Xli#Y\˸{Y>kMK4'|pU2Mg#wo'/Fem~+#iMzTv瑟 e݋k^GqoOϧQqޅ̮WgmH9& {^_ (w'AkOGkit:98w]?O1O"Mli^ㅓ_* ]v^*غ ^d{z/@g.~۟{9eg*#VsCqW{/};a}pH?o(k:4=Gݰ :z'1(ـ>b%eS~sY1(} 'GCOߋXtncӫ^Axr_?5m֡ۊr~Kq@3 Ma\Y#ePa_V3ok:%Ybm]}a>Kvni yYSXΊicy*~D`<c Lh3zTlj!9k?cLY#D_U$yS3p7SMEx~ث&F9~p\{˪Was{ԟNz V\k}ry|G\ٝ|{!x,*^PpLQ7 <9A3MCrae 'ڙgnYR#@!\U ݂%۷P}ϣ\˔oSz=):rjyUojbNgGuASsQrXm} XTnhd5-UTV֚-<җdZչ~\jȫbpcVvmK3,DI$i,E-1c)Jz|jwՄ~@N*3{m en. R`,BuX|x6OEUݖ\͢Q&zeWTt.fjEu/P$폿A&Tgj?{>m0Rſ!S6q0bj*b"Al!o W E'dC;卣1 oRc;%xXR ~ A)t{U]e"+F;n0?h1NG׎؉p|9j31 :q\U '|d8\aQ'K> h \{'˟?K5q3K ԇ 7#QWެ,)E䯩#a5uz0Gf ((8HOH _3XfM1)G E{;#l/sb>*<+J&'=G|EֽDAY'U5}5Op~We[9M^|>DOJt 4H,Upn*P&Ta QpX1hP">j'.S,cP'rÆ +",Q^(Hv,l&(ADER 7P)+:GRX>iS'AUcsb*'D x2~ndVCpT)Ϗem+cHHhv5M6g|kP0㚿9 m}C;s- vo,T51(Si^_-ձ]{?,(@z&NrU'nP}~[eV)] ,Fɧ~ml]yɮzDri=UJ?h.z 5'ؑLXFu"vΚP&]L?{¢(hd*jTebT#j"ScV1Q9pܻ?Za~Al+J}cj {D LJ?WM#RB62r1ܿuԷS)ۿ+.詐#)o!~h|zOy5=i?H~ Y(dK> 5tJ^!l d"U|U(0rw\ ͛u~1W0m{2p9J H#Vr8N8`!Ȑ<G5wʽ(o׿{$}>'q;],F5}aE52pZF_nf$gqc:O}J_[Z1 Rwave/data/D0.rda0000644000176200001440000000546612377701075013226 0ustar liggesusersXgTTY0cN042ΘFq1$$5&DQD&t?(""mή:87k={pt5﫯[(nQ8,d_,Y(ǯo>+EhUV*ZE{mIM_j=a5|uu 6o6}u2{<.Enz'9yy/ͼqn$Ծn?k/R'.j 1O׵>pzcN>;/&5}ٖ.37w1k`Ӈd<XQS; fqo1?}h{. *<-:#]y V~?_peDcqܜh8"nPJi4pc g45L 3FS'y5MpKẄ́h&6  *{4IИh]~?f.4:+(;W鏢!  AGh~Mh`N@ ɜ}/pjQ`gugVϳtoaY70s-wo4Ĝ5}ɣGjbx4W/F̤xjjq9TJn3'ԍ,MQ%L31s<~/ y5{J0=Ch'- qSaU`75Ϳ ;e߄DAvFF6NUl%JLmLߖwhE{vU%kVp&\_B֧\N trVV9!a G Y/ZH7gpZ dIvbO !An wi^:RWѼυr=I>}Y xD1WcA3~*uF70G c*C0 9!DCx֧$ \U, ,K|fUơƥƩ-D|P~4Ry90RxK=`yOYDw1b AWy(Vʺ@1@^1.GggOfR&1}Կ:b?K~~'#om+K MHE9͛>A Y#B?ћ\ߤKNtğUK$=oMe/-^F4jsz!d=hw+xMkO_t#~Jq9}+c+xB:y L:N7N4GzH9^@8.={R JKLzH7S(vw;ʷ-uX`f}$ d6ʾFzW?u~XC_C_#sYEyYEyYIXI+ DܿS(eķRw KSHR| H/P<)yTj?æ48Mx"g3_N'jɟj'?X: Qt:v8 i?Mϩ߁Zz/4h?=m,ktْ?fK~b)O,mO,O-K8%>k Z?mO%~-o>g*??c;(1 Rwave/data/B4.rda0000644000176200001440000001122312377701075013214 0ustar liggesusers=YylRIZv%I%:*BIBJ"KEH %QIdg0,̼͛7[f5V{~޽{lT:Ĵi6_b΋i޼H?N֫1z9} ='f);.ss'TҖY7ϧ=_e 㨠茫G;m/pj1ܭ|7K>qU_{]|KO(zO=YR Ow_t+Z9=uܳX]G?pn~>biKgA^Oɶu_1ں״w˶v׋}iW;~ o^ƍ2{u/j^~ʷQV>Ly3 yk':RտcV8__yChl:uSQ𐥗#G^9J]@4s;owmbSV qCgzMn>*>|S k*N i?L/퍬?S·>3_^q=҃v8QSq"0?ߺcʇM809߿ tnz^,ٴ.T+ QCm6siUWS4Z)X?q5ԺG7ޝH֩_(XH? "&Z_BJrd[Ez[}wKe96c*K%w'1m-&8A|}0h*~ (=@}1o7VJSqJpO7#͘)7x 9̧nI! Sޅϛ"#(/dFDy)w鱣кM+P`DI(2/քg>^p5Qs{ވvgw|A{o!%N+2B)~dN1s~\p:;N*m;+pTN< ޝFr%*&2 bKhIHiNo XTSa~y~%':RЃӴKp@2Taw.Ք]}Ӯ>!ՠ5,/Jn56agg­,;dRUloҝBRؤcwDH\zrޡPŮI_2x d~~2/ a髊Q'|o{/6M4\ׇњ?ބikBnEkpC\H3,c մq[B qR~h}ʛ;Lz֤sKwQzu3 MGx<|oU}j\҂j6[K:;l;7[ݚΌƣ,綔.iㇹ fܚ7*] r*ҙ M }9ڭʠj/s9fPP>%D35+:̢n#4Z"$)SzƇ(_J5y)Ѭ+(gz*O;,pup `w fKpB; ݷ[Nܔ%Ky@4nJ,WFϚ &W>/8xVHS/[uv ‹N>|(_c#J(\ΑMP$A5y8_\Gs \=V&|2 N:*ҹߪ:¯"`b4B+l~|$X|Z!7]NaYTl;l٨S7:d`WSYx5:|~ q)^rk$ʞj,GQ.x~#;UpsYz9fL҃v>pE+vP++_Gú QTp?A :&E%,(aqbGnGYWzLC}@A;B*a9\گmִLO<:n 6svYϵGy~'nv<f¶vqRz~(6nPwSĮ.BOewOxR{)~$5FYi/:{"úCNSlŋW`Fco_߆5,>Cy8;OuCt>*?J6oߚV, *HVR,>I\Qi 5T <^P8=bn< ~)Xi+:32)i)K}:2uMH}J7DC99):UzqZ|(EgYPSY٧84s4_D#3Qm9jG ->v-z%l)^l4Ty)GyVt-٥.QV>;Qqng/[;亯?#YP",">:zbqygXp$jDOes7lr:.u[|#  }f"_ O|#z(ܞD~]eP bFT')oƙ{-Tg˼\rU.c6u8 { |RЬeIhPYmòO Q]9I'`<zM&5yfBg%|M_Ŋ3TUsh~ּca't7G{5H.JkM{'V;j~U"A%\qHP' a<u(_ VJN qh|@1 P*{"'hdC MOGKl۔5-Ҽ#xaaJh0vʿq7of0\nk5g99&~J} @O>acr1A*͵<9S7ykQ>}A? ȫM&">J\Su:qEw{ZrE!Ī~HJuVC(KpE/#׵e 43ÍԷԫ*U}9-yܧS>= Yx6f} ̓SsHifM䅋\s6PH}vǦ:UL3w"e-T\T-> EOSAT|<%Ny7'ܚ몾E%=QWO>fNJwE?!St&ɧ9M}N4߬:!99PR9bdf?I~ BdՇX }1W3ŃsP9dWh^@1, hSǩIm||ĩ|d<>?TT\sGy r=$5L8$}D|OWOs{ugH'Q1 Rwave/data/pixel_8.7.txt.gz0000644000176200001440000001103012377701075015150 0ustar liggesusers}Y8y/6*:daC/UX<<k?{]ߣ.cs-:0yc!YzooZ-Yxla {M'뾹h1E6\Wk_ 6>~\|>@?=ST0I?]Zio\`?o{S h{܈xwxs}oMؽa{=`Cp`5)bu:MsڱopL,Ӭ{ Ċ|0`m8)8}m+8?GGɕ'r~@Q+~+W֦\;f+vmuVkvonu#֊R/f &&w9;1+ 5vf@07lzݻI~&'SBy>cN_-] @ cJ̮)ל %Ԗ99f]8_y~kxN+um?^JGxb߷opDp8Fhy}Akz$'QlSO Y36'ky{_suɣp߅nu[Ɓϩ7sfڴcF8犮Wlꦌ-ט۴9]UT6?0zc|7>F\_7clC»9;:eؿrZem#[hM5U{ V_h=QFnd{;槝î83Pn]Xyd\Xey@y2=Bt-.woRZΚ@;ǞcA|&!ZrKsf%L.O]3г]BͿU}Igٓ&4@3\{$ BkgXeA- nȑm VjN>u͆jkuRr[\}\߲}|1E9*&@-ꯝ|vԸQ>_gSq4n;|RᬡgEȟrJnY[uJ-\,_`9X j~ ~ڢiXXsUdԟSW쓨cׁ/'8!bcQWXk~ԵVש8 h`ĺ󬃺{}qw>g1U]"\3EΤ߭w/s=:='kSH#%q!/}% #އN[0f<$ȏ?uvn?K]VrOwO:lA/XsݙSz~Qn\'n}ɦ}O\2nUrh$r|n|xw{E\_mϞ}̏"׀Q]}Q'n9哱g?~qxQc -,߳^_|ڝc}ܓE^ 7~)!,󎌚J_r؇k9d~80RxJoH~R_qe=m֏TcH޻Z7+%&,9o07(X#NSmA~E뉇=HR7"W7:t=gк`ץ1bgwoќo|7sT>1~tF۽bd}OӬzMy!^ס-3w牢Ng^ ?G\ߝ{"{>Uo;&x#ϩ=c_bt2~Cl,s2_@{K_;1!ɞE1}|c?̉ }LWR ϩj֦mᒸ;^K&89ryk!~T y<~uǀ7fbX6\^{?y]4Ok+}bp,2>ݾ獭 3jSeܠgcqi=)qs}=[]&kfTY>q^N'4W @\?6=ڂ11/ҿߝ/1{>؃[ch9Pړ5/5{jSbOY>_w_bO"&){P;H#0>cR7^Xp{RW+qt~I1y3Ә5Ǔ]ħk=a=#g78֫4%0S=< oa-B`GgF\JXo눑Q=ygcz3~akϓլ 7K]O&ϑKv1~sD4z09!X5{,1u.O?q9v}&=KXqQwfzgLٟ}#!'3rbK\k{@c0!M%1c}|P[Pp_jbb}1'IC'{~wFZ1&5¸Yc;~|#]gxSĺd4.:l^ p;? ~fƈ1}Y(O'N_Qċ$v|s {5k\`Tmv|!1׺!+޽N7=v[>V^lC`mRwave/data/chirpm5db.dat.txt.gz0000644000176200001440000005440012377701075016067 0ustar liggesusersY$Idq p@s+ttRDOTe ˗/߿~}㿯/ۮs___뿟߳Ͽ[~߾~|}{>z?>#Ǿ|]_[6_/o[y|>O[_|ex~[鋯/߾<~e|gOѿyZ>`7_X?=ϫ|]>}ӟ//nOc9Oy%|:~nO^h|+yIv,Tߏ9?zUxz__7_Ϋ7A>q-1_8?b}><+W;ORZop>(Ox_}<׺/|Gz|FOc}i/`//?D?v\y*x!Oϴ7; IG࣐-}z㍐O)mi/|S#s}xw}}~>ue Xgg)ߝH{|dv=J3P}_2w\Ӏ??<ozQ>;GC rm~{U:}AOO~7t|>~/7/B3tE}g"?f{97W I~?׿V͟QO} Txs/M|OqwgodO {!u~?= >*+?zw}~kCTW|ׇQ;#~7՟Z=Zs|׏俑3;>ޟz'' 1{i`o??S_ {Cb'uҷ'>\~O߿mo_͟2ǻ:>OQ/6~?l?xzy;|,xڌI& @O%3>'^/Is#+q^f >aOpF<R_WxqGߒBy^׽^A'c tmW>;t}|0ըN2~܏Tf}&>I2||-Gw~ЎI?(}@<8'(߭PPoGg?!xz+̇kͬe>/旀X_+P>c%Ekρ֋d};6'x o/Hޓ9XL;#?/?@'UwyI߽C|y;y\_]lo\O}^y>IWze|7?+sxzp^8 xuoi?z!_o?O{D,O׀6ݞzG>Tx7mߕ3U97Kχ؏bq޳{HI?|[o/ſŏ-ͯAy%^RG[_t<݌?K6<3A<?Mćk |=^lߙz-/^< ?|@wW/xWֻFԳCb}z#: }CFG|.{7g_=/S;^G"%'=.ѯDwEzvOo,{k}Ip$[~.ST0꣔/ |x /X(>;ȇu9_'<QPB_-C+^,cq}/ 58/?*J\Xj _8n<*o>F|̭JGffYf<y+K?z}olGOsQ_W{~D% ffk<?f~`"魿AxǃK_9 #Qp(G_w. goU/ט*r|DS>Tğc=G5x|rzb{9ď"}У.z6>z-C5OSJ+^%<xoפ!/r>[???}>£?׃| 'g=nՇS Շ_~Sw߽?yz*zEҷtgl}W"@?>/ VOTo飥=t}]{~=ȧR"w>5xzWAYGu7uh2ɟo֯׀~]/F||^}_xDIRom} z'kST/$}2}8oAvmM[}>/ݗ[_ 5 |^ה<\߉'=ɧ>W|Ã~T{u~>G?mY |~}u^N<eiWH̗7Dzi4CzTQ[;z!?~ox|cO-~N>7#ޜ<qoDz+vNwO:>7 h !}=-W<}3CZ_#U^4}5_1_4zRߡxo⽅0G;POz`N_ǧˎ~௠37@$_#OPAt{0/ vݠ.哱_v}9c_p߆?Vu!;?)ԃ k?g>8~>W Hr7,w&zb~^ߏ'?bO<{Ô}/fA/Kd}p$y9Ce7n/?|?A ߟ^?Py˨:8#=aS~jSd|vkxV? ^`X >'I}ғN9일?{ASxwdvr+Р~L(^%{7ÿ#*8;E&٣o~_^5)}`=-/UWx>?^˭[!?'_xeK _;~u')r _~:K GJ=OI#'|@?6bg^!nO 9'砧{|zPǹ~^'os^e1ޏ J?L}+w sOiPOЗǪ[#]_p }~%_}~ԯI_kOMMҋ˓_+5ޮ୞뇙?֋Ǐ%kv^ɿdXr?G弝C}t@/_x*kmE|_sxK3/ֳ~ ?4ř*{DA0o[}i~z|| GN^?[}%>IK}-=2%k(?U>J&ה{mHǠǑ?/vg2|N#Wo5g…SC^,sȿL~O!xmCRϜQV3m~z/ާįp?oz_G\@>rO{vg0|$CxNj>~W%J=O]o-<!Ϣ^RgLxT2xeXezd@ht# (t[']9gq?o.|C{>~#!7~Mo'|ǣ{=>0f|G7zӟ)|>Oσ\Y| N|ž?&4Oe>?/EOoRzS?l~<_?Xo[⋙(z1/ūP?(؃_z?w7xa[*pw~?|O!Nע-Ws"{گ_t}7J=? ԏѬcav&#o#gӡ3r,|?zlo`[K5ӿ%|>W6Xv~4n|^OS?S? ߀>wg,c_+_7/ݴG{y~<=·o2_#K֧xj旊+ i=-""U|}^ ? xv?#Nσҿsof}9?e}eYE[~|>^^x+ʙ+zTW/O|Qg?> /:/|9^ߙx%4?%=O=Oz%Ry^D?ϟz$,>8ͼ(^_cA2_OSς +>:zHX_* _&-?o]og=(coykSׄn>#'^9ީOi=b:i=~z3 a9zSdo? |IƟGӧ?1ϓET[BK_k?8/c^G=(ZO]ߝO⛄.zr?eAǃy.x>|:G T/]OWs"=ߢG{)Lo4֟{<-̟ۗ_no7~|) Q|N|ok\C'N5IzP_ɴ^t7}ޒ_7{쯮A>obwǗoPv=_wo?A(w~OQ}k?C=@ߧz9_ƻ3 ?"Z}|~o~(;_Of?}~~>tI3~#>t7&}'KzC?xOo_;><ݟz?/ȝ&=Iۀs«TowRbt=`."[~I|>~ >W@}!~%߻o2WO*|ۿO|I:?_=;*_)`^>?߀?|GJW\*7}>G(.~xE@ /?w{Hg?8([T|>yV ><ןO<HX?|7{Ŀ>o~փ^o߇zSEП,ϸ́s|*[_% ;~ *p{\Ka!C#OX +/I;~Gx_2t3ޮz,3>ǃ/[3gWQ=bίk__Sϊō1n{xq+c-߇A1MǼ:O|*LCYnۄ@6-+>/~^`97W-?z~п<9T/Jzg|h7d&[_wlX_ xA?X(q~zqO\Ş]~9P/#?o}§==x~OCޒ|cP/q'n<C+!_:*dk=RgIg7OҿS(3Q75wxOϵ;Ce<B4s~<"Iw?xy^6 %ۙ.F=^c>迾IAUS >Hv?QolpsLz  Orxbo<^h'?Q/OwK>S&h շ>)|eH|lo귕 ό9jO>$%ȧ\@>2rȗbR!A|G- ߊ?^6*b?-1__G8ˮ_~!<9 ~!=+|?v)>sO 3G} <ozb??w{yWթ:%|@s'ϯkAO%d% ~/zb/>S!J1o@@/}>Tg=aoS=Og勉zOM%} -z<`Ng?QMʏꛨ^>=?F?u,m=& 5|~/gz2%$[i/ϓ\?UY#_oC!>9O}F>wS 򁾧W?]|w^t9o=bxǒ~~m3=sߩ?oszO&뷧\@|>)?w䎧 +ğOw@~ٯ{}Q=ls_DP!tA#? e㛎_R?gz/8,_4|܏H#B~af}&H/)A'ovL>{cz>t멩iD3| ٯg2?1zeԴ_^|}z'3OomS_(G>ޯ/2ߠ~3KO~pq~]`+x?qzu|)3g+"}^V9udaXOn'%?~x>BT_ާ_oL0_s<>#K=;ץd1h'aǏI1S=J!^o|y#WMoɨ /7u+}?⯗~Ho|{DŽ? {Cz)n4^&Yn_HNXi֟"߀>S~ToKIse;ow yc%=k^=a79W)xRop>>}_^$=_,ugqv1I? ?g}io7ϼp}2団[ ~cs|1'ODb8k!=`3 f=SWyGkʿxeLZR=%S e9J~1~-~q߹ԛx%eg?~?Y⭍^ xm~PR/' ^J=z僡@/om<⽲vP7Eƹ /zP}Ϲ/=/zG`"^rDԏG>|_7>1f(m)'}/U|/_ ד=þAZצk܏>=)uG s~t=90Ks|72I:(~N|?/T߹~io|zC?c=ᵤgF ">M5ޑ]Ol>(_;vf!M[D|KO?EOԠ?Vy=ӟ{qR/b ;v6_oTCzYyn Kf!wIRU'/l|LZ?|-x>%z|'~#/ۃxN9'%J=~弞x||Ļ~1!t5^y^}6}~P~|?]o~ ܟ~(ګ蛓?I /0/g ~L| 'I'7zH/ _]/.x];+|@(~ԏ+g?)38!+Ǡ's |u&}~z?Ћ7>gOVHkxx&6{ w!{ԯۊͧ'Oz-/3ߧc-Ac|:އ_&!F}mfn|IvOs8Iz'\oڿoM>kr8UZc8s<{f}~y>}ko?KKߣ͑"AF)~^=P|)>^gJ㛙O(G |Ϲ 7> ow1wyMh?+l<`#G:v<@G>K9+7C|'r<@ /=%KNY_Mۦ?z|Ql~ۻWkğ<%=>?|!:ח'g~WTo@|Hv~|p?0 S%}?}~1AgB}%弛O?xL\O~UW#:y_F~Tm~xj/ ~:F(}o-5փ} Y]A|zY:_|AqJ#~]?|;uoS|ɭoGc㉏|^@K|G2V'LGz,T_O|E߬SSx?Yn>P}?@П%=_3Q)'ZDǫ? ݾ:] xR]sԳ.>/?|լ' >4~;:??3X-񖩏^RllE2_ſ$}9◐?w+ϟkzz=/{I%SwrPc*O`|VMs_gFFi^ a?%Wߌ]g5>:]G*cnx"r=~}?ķ#v,/cӞO>v9I z7WoϔoDz|\Cr5?m7^wD3><x$}zΏm ߷vt>zf?|?%h<`Ŀo~_ 1~=z9woy>x~p||5z%ak,遰>3][ӈOr P+w[)?%_?fGz|Oc~iRcPo<_? I9~>cq{~}x?0o?{5?~E!_ៀ !_Կ{TP· ^ߗ{|:zwwi_L~?]SuwA&ש߳񗢇z_/4G2^Hf<?:_l#/;9˂gR/#CnyZG ?/|~k|PM5ğ;Гz`O'wW?9{v$9۞zŇ*@__kO,m5ZK׫b$>GwXFOԫ'񮬯gS=wx@A0~Nj9p'J>okdo[_xM_=hw6=S/ YcKg~sc? >l/|/+v3yMno#>4}焷A|>t'}Cka|tP-c!}/_3=}I}GLԯ꧂+O\a|Q< |CJ|S=e_<$@_hz E>C!2C9?(_gA m{ -埯|?{9z5(~ a|{ Li M;{7?xo>SO+*6w&;_xyo^3ŤWFzxi: X@z/,I~4{~n_v+U|iRu;G|ϭx8|z/ҏ%ߟ5g8s7Iz@?z~w7%}UG3^ͧ~m^aҤ//r;_!d"Pvv}_!+?RgM#wK<~QbC!` \%cɟR}_a }?Ÿ_woy/g{Af x(>m87_w}=*i哷Ft9Ddw~6ֳRƠtw[N<2^%+7|3*sv~^Sx<+oh(?ݽܮϢz'IU^ Z;/؏?~'>⣴oS_zް"7~{^/M>ꑀ%\(}.wOf{%ޤ~ϥ/KdG&}ү7~O>az xHKڲ_X.z>T q?=|$w >y>A%QO~5ps>sP_ٖx?(>zۣ]N|r|~_ٟfI?._}x]~~t~~Ǹ^HNj4!"~y>/_z3?0U~sL S9wOr3?aؿ|ǿ=./r'ŽK6ߟ>t>%^<oo>&5>7pmD/(xr=~MX9f}Ky>ϓaəjx烟/%d3#Qv|U'o!᯹/9z}TS/>/Q>_!8_{}N3 |7xyw% ˺>)@)]/|Ȃ'>vZbéB _~'Q\fFzzƒZ_Ի,kE|(@''o8۟w@?xBZM=)_QW/z:Q?o~W4~_%= *Sl"|AG8:wկ}m s>F x'R?/G;WD?PyX// G~g3jڿOt=_ PPztS}/ICP}6k;Q/Cݯ#<9=$̯AowD)mė~w4 ^z?g ]OR~^!|SCߧ[g9A4|'Ykm~:}⯀7|8ʯeͿ=?׍'3D?/+^ =߸Cb)IzWQg'Ǚz³/coeK 3|~K=y}?/1c)679;> /zڕOpm~w?iyD__E?/u>|_#zg~I+ۯ{6w=/Wz=OeO_c~>/#+KE~?x7H55Mz]TM9?{| c_=~ozu{@?}èo_:?I6I$C/W>y%V= _|Ut|sP~>[i|X]uX'"^zx3>OBf_r~|lp_e=zW&9M/c?b="O7e7߀?7S|:WqR}2٦yKJʷc*(}/of<[߃OyJvuǏ-?zp=^'q|cQ~x fGe| d7%aGZ /DW0oc=X|yқz_[xCs/~o}>Dׯo?~ai?/q>T-)i{??GGo4J|gjJ|w eg?e3<99 '̟l|siOm/sZy37^-'od% B@_g$ĜoS:(ߍ6>Mcc~>Q@e\8/^#GW̩HƿGiaC!:2_H_yN|_WO g|~\?o[W-^ me.?PR[\;+_/X {q׿Ci;kOO?1>}[nߒO:bϧMW|09#l`S/)bG SU^|z _W;{b'돓7KşG]җx_WU>|m1}|xߟ?_}:gK/xE/l<~η@VB{|^~cNsh=׺̥^O#}z|qym|o"~^;g"ԁc>>_v5.?#c$f볓Hs>_[o&i?yi+>GR'OZ>O<߸wOwoQ)e Sz'|>yw +cA?_zdoI߸zy>SA_ xTVr 6:r %pǮw<zr'>Qߵ>M'y'KM|O菂Q||ߴ?(##"A'GOx?Wy6??R_:? ^@;ރp?M{O*GE/e誟Ǘ/PoE^W*?ԏ7cJGcy/刺G"ճ`x~ԯQ'x|RVC7f#|դ_L?z\kpO_EgHϔ򓤷Zeh=,>?叹9Og}vY[1b| ުzoA= }‡/T#_m|(0 7?h]Yy5·|⳺}{q6u{;]w\??"$a!ފ%}O~=П<[Ox~j!GxuIxׄ~cy?'SϯP+zk׃~WrF7C|~߉~?- e?_z0_<]_/Lx05wyHߛ >_n??ׁke=nX(@*7C]|bw)HO k G'Tz W}p<|9 3.̞?zM%>L~a5>(>Ov|/;ߟ׈J}7oJ}IS&']^g{TWƏgT/ I>ޯ 7%)/~^SMǗ3% QߌK[sfXB;ci}D3o]aor͏ =FAam'~e9?aizS/* <xU" A1H >:\u`'CHzgnywbć.xW >27Ŀw&>~z#1Ŷ?OB=]7gCI7\oǯ8_CKv9wS}՗f]/%?/ܟw73~ O|7W`>C ,aeAǧClʒ/ؿP d^c(> ~%H>ߞ'ˎ!;錄|z|5g/HT‡IxcϯE8_d/oy$KgI H5ƛ1CK""}m?|=y@:!9\1ߥ{|ڇď?/xoG^0cGr~lw#2' USaS3I;7DGXԯSx|#K|?kg>ㇿC?\OJI 7?ƋTgEM(^3o?95ǫŷnv~ _ae}zVnzz9?m<':_st|AS#"=_D~C毐;x2w$ueRwave/data/signal_W_tilda.5.txt.gz0000644000176200001440000000234112377701075016523 0ustar liggesusersْ+ KN!$5-x| LOU@Rï Sݕ]^F$QvqK iY-%]U)i"E+,4m9Vm/6I#j1$Qb+ny'QŪ-ůȖ"e넵,5U&ckX JޖUBs :3_RmeCZmޟS–uSy+67[ 2Qoų<3˪R|Dz4$=/ut9t%:a#d2MQI}2ey$k!s8y+}>&~(Y JQ?!ޞozxxyIbt<} 5ǘ1Qq"H&Ӛ&'KLL՟4Dq"HJRB'w29ե3z^kZf;5iqΦiv:BПz욼CۜMmNjz&? ͫTN){O7 MgjW -  )Excq \EX\zX\fxDh?~2-? ٌE^t/srUW\= ÕdRӽX?:\,K~989wWG_?]ulveta5/f;dq|4Ϙg?S|}*}dY}q}E_^xI]o=zNcTcF>r}YNdӔzjUNnZB=vlܬZRvnECYI[ H,wHKҒZh2E_&); NHђZrq^DR+v o5&MGS_Rwave/data/sig_W_tilda.5.rda0000644000176200001440000000256512377701075015350 0ustar liggesusersTwu)5BDNֺRwaJ~TLGlk"r ΉЖu,"42GTW9gNll|=|?BH06?v? 3}Sc"c&&ոտ`@QOg=&?f{r0.qżn6(7R8u kcfxsV$έRM߬hugܰ*hU[sڄ~5ږ"nDp$+N"nEp,k^#nFp4n#nGp<~$ nHpD+$$) nIpLk%(II6E<W%8+] KpYܖ%8/} LpaܘW&83 MpiSܚ&87 NpqܜW'8; OpyܞקGEgJҞ[< Rwave/data/sig_W_tilda.3.rda0000644000176200001440000000220312377701075015333 0ustar liggesusers]PTuZZ2a`G[]VHqA[^ zALIHI PJl^ eu;XQ(0@@;폽ng~w}97{;G:K *[GQre[bq151X?W }_~6Dž[g)1os9\k|y.Yz.ܜ4/s]NI8q~ߧ2t7 "_tFqܖS2 rkrc-^qxLR6Nk`a2)4N*.)a-M=yǫL;{*Oҋ3x58x%9}#inZ>TqhO~bECq_;zq%6#v6yiC#kE6Z[ԡ*q9+ڟ\>29~ ~rQl+)5T3-.<]5)y<6gv¾G/kzո_UֵكkR𱊾v^})#Wz.Tny{w)öQoUdu%Xb{^{nbO&(xF 3+Q+7l{jҍ=㽊}Wleo'ۊ}{nwk ךl3%ۈ>|#F1bĈ#F;2`ܷp{ p{:} 7H™d R2J[p,%ùd b2fG#Fp8v#Gp@ G$" HpHK$&9 IpPG%*Y JpX%.y Kp` ۏÍ Lpe3ܙ&85 Mpmsܛ'89 Npuܝ'8= Op}[*Fi&< Rwave/data/pixel_8.9.txt.gz0000644000176200001440000001110112377701075015151 0ustar liggesusers}Y:7ַJ:߇O2EbH$ki|nﵿu]bϖwc'>k:?Oް}?/ F0k*6c̟<oY`,Y+b3}]֎_KN{̯ysKĪ`X^y%5WsLc3;_[z\ܯpON͒op{Cn"R[b}2wY+pMbnbLF|>.ErzaM]uIY;Y(XGj7?ֽ5v ;.)Qs2ެe/G8!۞f3tk9Eckصy53Շch?5Z=YP4mlr:mÞ=:}!gGq}ⷫi'bӞ3Pm~n|Hf}:XA Rwoq6&lOqXXK,\~kP%ᆍNJ92^c6woҏT?mmw0[Ç~>Xms7庺GjF?KgUwoC{5$-k$c&kVX>O,-Ygq+!ɛ-䖫^Yg͸gI~fM}u=ϩbdz"O3#fV źmǜϼ='szUxx9~f?Aux /bN>r5~c;}ؼkG\߶:>ـch;eU~CFls]s'Ǫg1X598q}:ǞCQCŔ}xG?,g^G0#{x3f]QV@sag\oZhsc9kQo&vN=@=3G/ƐmlF?vz#4|\/S{ÝuzLo-W~46;05iYsė֡`dX֫X'Տu\pg sH\=ϐjA}R[ P9`\=:l|L5~`n}hmGc i=NX Fv NN~S_uXiۍg2_֏.|xxMW}6mJ=yJ_y_gm.Ƕ~a~n]VuLޯ—qs-} s=4uܻg.ߛ 70\9_ϲ72+7Ⱥk֯}G-ΎrS]3`~w _na|\ tcQRK b9K0GwW֌V{YWspZbN99 "̣:eb^f 5?k հݛ;NX{<׆+EKYK/<6]9? ^lg2Rna•(usx,A}刮\t]W.qO6Xڦr9cS3o+ cKL3JoP Sgh/Y7 aw{#۶̜CYwl (X ϫߩߑJ`Ԟ5 q/X ڤoٮq6a_ hsKy-ګmgbdF}X yQg+䬑(Y 86X##.oq&%~Zc.J#GG~,%>ƃ}BS'cR y mڳP#_ò/ޢpzQ T0RMq~e)==njo ~쑌h框v;0pWGOptbN:)<:vG,X?}%7I3;#œyn]GK.Yuc]G=G+k'^˞n[OՖgyR-{Ő|oףeYN(uLLYoP"a~c߆eLsZ/+`<Z-g82䚹ƼgdL 7 ;4ט^eC tng|p! yE:ƕ7I9mڒ܂;ߘ2>=9&NcԸs+uV[fC F"m?pjga/\8~]ae>qS#vmܓ$N5ފ'9빎[9E ,-׉3=՘@5'<Ŧe31v}N5$f;+9Mke.|ef )>3oZXsqZ޻s_k 9c֘>{hE(FXgȗ+TEo 7J쬿 􏦝YX9BW/wۋali[lL` ٷJz>[O/v+=kC5H-?_ֻas/2c_/oC]vKndXz6OiZd~6ٺe{ٻ lMh?\z 1~q\;3a\k18k1qc-]mE~˼@.zK}CS#'pm\ʙY)z|{{TH\ͩGKkG'g@O>3$Oۡ?K?u?[#)t/b?0_[/s7wƳ7ne>=Oo$u1}/P Gڃ]{?1n3l¸o]+Nc410~Uy1ųŶ=xԬ}{AN>s !(篬=j ܬ/zOEY+<#`b%ĥ{pu}^L:=Ȟ)c[ Fg <|E99g_1q<s Ir c$RGw|9ܰ&21{O5QN)7K?oݼb\\ә+6,~7<1[繟C.Ic8xǗ31orj19Ml=kc硫& Ce5{'}WkYY쓽HW\.X\\G|F}uwJ/];q>挜8zеǺ;.qъb`mRwave/data/signal_W_tilda.9.rda0000644000176200001440000001344312377701075016044 0ustar liggesuserswxA =HȐH"!w9'=Bmբjkmb}UmUbjQ}ޟ\\UsW/*uYǕ535w:zke,uu\mzs)욖mՊ#ẩ+LY]^K9N:r2?5vrjenϵoaGV(ns=* ;e[AiPB IS ȍWؙW|N쵭ҊwrCܸݸ&9|,r  _T@ <ȅ}=[u9wɞ}WR-gjѵ{uns5goWJmX,Kxg*Wv~V;B}FUkb́8tJk;Aﯸ3=RWT!l<W`hVłY=js۝VK3lPvCNT|y{u];׏&W9n{òϱk1#;.,ܵb,G=Ww{pQLiU?rdRqd:--Z%K'?j\Ӊp=k3}}L]7MOZYd1G/i0;Pnxr7hzP*J_ly< lq8V{9֗/63u8vǝ/t}F+fqlGÂF4*e <9ԅ=#ue>wucTZԉNm 9Y~j'>&:CoeA~R~b7 Gy~X\oZbʬߖ]Y뢮d^ЦѬҟrM>cs{>ǟg&ԋt)]4ONw9j fw ύBu /;N i5n!S <)~n>B>[\q]uM\Gq]u]|ӯ<^$>7Y|D]:u#u>0ZwjxznEu.^.:F#+u'֡Xbu+ֱXbu/rѮk !rD;^g75ȩB[͗$99SV'ี'q}?&mjǵS*>|ֶ(7j5Y'co~une"+iyey}lЖ| y}AlX#TX}-6rl ;1?+UCΏ 1U/$&sL!zֵgs.!e.OSJTV6NQZ< (|PtGZF}K<ۺbb~͵!9d}xT iaeW9iW1G\0sADHmVI1r_V=v>7/#=(ʍóuԃñg'9d|pgaya]ÒGl^643}?}07[aV`ժ9t9 xqM吼N5_#.8dOpӡ=8:ppN/7n~ubc{Zr0(p<s"hW=rr MN~oa_T\nq}z DuEq`չ6;瀻+'T~>)Y.Ks98'gfs'f\E=tD3z T1~oģ~Sk*+&7oa nr$SZrcϕ_W玝qen>{n>b犖b(}c =/ԭ֫aVf<7dV~xn3y]sOȔNfgggqR>\Ϻu@}z>=pp}o^*1ag(^hvG]6D瀆~ V57Di~v?mܥ wC޻]~pnqE]+w ]Qk>[s}@n 2>*r\=8,Jإ;QΨ?gԟ879Ǎ9{;;ݿYr+;wr3v:QN45>F)vzry٧h߃uFk׿حB`\aN^\_9/zzzlKe&׋y,yFIۢay^Wztyg{/6QoTϺGUidzM]iHvN\V;PvK7sf;]jǵva;PYqUzM>ɉlեq3]k)ۢm6/}@ԿJsU"Ub}HYwuL(D?$V&._=R?Dh6A"3hJM"g$jOM>-.2f%~M]?M"%DXvd"_YyI$>vf9޾"]`+O&dmb 1oJDU~*Ѻ[ƙK]UJD~,AD~HcVB8qJ D?75JDW>/ޘUK>@"|H~@"ƬDTKD?7fyiOYR"D9c,>%}H"DcAߐ }@"ޘDKDnKDNkrY"rX"V%Z,ԢrRG-G.JDirO;-Z"4\ˏEkDi+_"*_"ca&K(?D=7CDȝ&rEiyn"wfț&7/J4/<%^|?_J2WsxSɧWλJ>vQ[ozQٿߐko o 6^CFxy_E׻ȩw߫Γ_ǐ&5`:֑&N@hSM4DM4ifz^ez^ezS/L4DM4DM׉Úhk%Wb;B|7D|$Gk"Y99,x%z9xYq7F<7ڈ~_;+'~s⯌xcL!xibKs^$̡xq*yĜ秒_M yq*ܓssZOM̕ɗS?7ܜɗMe.PĜ!m*s49GSI]Ҧ2IMenD̙Ҧ2JsMeNDҦ2K"xiS&ycL&rG2L&rG&#Q&cĹ̙1&DITDsd"$*s$b.LeLJe.D1=UT292_9*1'R2WR&rM2R"ZT`|3&jDީTtDs@ DITD. bNLDeIcbLJeNL11@DeL DJTDTD.KTJĜ_9292929*1GY2wY&DeLhZĜj+92o$*s~$Q-}J#.}L2\sTDԤ2]xmjRCM]M*s'&\m*^Tb?R<*7@ū@, m x^} x ^' x$^ g x(^ x,^ x0^ ' x4^ g x8^ x<^ x@^' !xD^g!xH^-!xL^=!xP^'M!xT^g]!xX^m!x\^ܐW0O C2 ;C4O [C6 {C8OC:C<OC>C@ODB;DDO[DF{D HOD(JD0LOD8ND@POEHR;EPTO[EXV{E`XOEhZEp\OEx^E`OFb;FdO[Ff{FhOFjFlOFnFpOGr;GtO[Gv{GxOGzG|OG~GO H ;HO![H!{H O"H("H0O#H8#H@O$IH$;IPO%[IX%{I`O&Ih&IpO'Ix'IO(J*%xH T*S+a}\+?Rwave/data/signal_W_tilda.5.rda0000644000176200001440000000360512377701075016037 0ustar liggesusersiLTWJ)kUj.US&uJb֊[K&ʢVLbTmTt4uX5-&VR NE@I9ps~,{ι1}>!bxM//KK:,x¨Q1 gacu[ l=qEgqEbFuɎl\YԷY6ǁ0L~3vF8YajS߿0W'MAk{o톣 '0mwݚucpC~|cNo4$-(gJ4]qv>`Jm~p孝F!Wo:nraX\zdD>.K]V\k=꫄?qι}cv?~Cg.= vF 9w>4wk}"~ssqq8{}9a`>B?ܴe8;xƑܧc)֨Cm*510riD܏c͒o~\Z{i\IN+nz"Z⼠csWJ}z\c׮?>S'ZF57}nav,J 8~ ㋧++Fw]6M(-!~:NwA?n r$bכۂ]&٧?w@ CW^ʊX ;y|^z|5ʋ˔ZZ01=eG??zhEz~?k}q0_zX~\i'W:ktzqeԟƇq#P<4~&Ox4(Ƽo8U7=:m:Ny]}hԅot|Q?mW: _y]47ΧR'c=ȫC7uarJr2//L#&[wLGܯ*`JYj,۾W>m~O=ׅQ^GzaP(6BP( -KqLP( –C( [fT= ¦CiTw'IEv{}=j- AOYWo۾)QU_U(MW$Xɾˆ} %{QKq6mmll\٬nfWǬ]]W]]?}?^y.TZ~K3ϥ{W~ ߣߋϹ~}[ܯ'%f/yj 1yl 5<&/-f0yt 3ֽ3y<ȁ}e/|6|&3Ez~?{).-S;#\by@m 6gȻ rySxy<@o 8 7w**c7zQ+{wx?Rwave/data/C0.txt.gz0000644000176200001440000000151012377701075013677 0ustar liggesusersW˒1_Xvbnrak4vyy^>Bg|0L.o{I՗4xNkQK|RLgdp^:tuPl (OxU[^MM78Hy";-"Kɸ!/b#GKITtjXuR#d,V nX]YfYc.Cڵ$lh&ZάL4Gė:Tm+uLDz4,U:{v[|M;fJlly`Z='Kn %n #t{aqty윧qįYhJ7y]j\kFa 8聒CxzePϓx16DE1vJpHp5ט뛧Kh+".}iN2l"Ģ-u[4z#ȒܲՀ䀮{о-ȺU5G/™Cnz"T#{VgS~%E=V=̻C"[(06!2b9";S`Iyq2GwS;ɕ:{(?u8)n%#'i'=#*dqr^5N+1ɿI7B}9z%!H7F@$}柃Wu_xNW=sniKo/)/ERwave/data/B4.txt.gz0000644000176200001440000000541112377701075013706 0ustar liggesusersUYII /vp&j{.TʅtԹea}ޫZmgK*w{]qx <^?>&woS3﷗_^[rQ[f+=x*V|\~Z۟x&+fօ -0w/?_}_]ֈ ;C''f<.7ɀX10[G}1LWb]{ō`"BXĵmwCkU8|RإvckObƪIB^+@~%oxDN;G#%ux b槱ψ|; ۑ B]y9N쒶.DA +xwdiج(gjb5һ9/g]Ű-v#ըo"voy8bj^|!c/Cg V"K,nf"+dY{A7# Kx8)I=[I2-K +k6NP.fXdxv!(˅8G͊ D7iJe\NߏƏNj! g}7a*U&rx#t -q:<.[dg7.* #/Nl-u-Qb8{,x,(ER)It1-OơGf&-@KLexBN#] cxS56l=2MHOML2m D fA5M,n(ݗ'o*b1y~6 /\>҇q57Yʠ4SA0UĕWz|B+2f I/ѼlQӒ I,&+E0|Bianh)N㫰JjÚΆCԓJpO"~WI}/Ík6q\x F?2>$}^W"F~ME~EH#1/r3X(8K 7P?/_!l>-+nYwOW+C8H=OМ ˷5a.\>ߊd+bj?8ٶMmWsYp$VE4_O-͵_N`%%W& I/[Vؼ9MM?AL [g3le8d t%4#M3`wC[B?:oPOٴ؅MŁtVl @ c~ rʘ_Ħ>c!8_1 ,OcK̘Ok@*Z.];2߯i^"h WrfJDoݓ\*5%3BN?NDd8r ؜q\Ww7HSjD٥ه''P#^% 6rCX4 s$)<\O8˨E|,Zb_3eHSR%YHHGp07bRxӼ/iXGT-Z!c2r9gU~l&n2l@G5%cy7kil&;rU14YI9(}Rj;}= ɿ̒4dwpY"|T0 OڧBIT;B`)j)@W|Sػ8Ae nk.XoЬ|:Ρqh3vl;Ep`j`|ijDG5cNc֬nձ4ыK*)oƁ%C66rs*v(MҜ L!]]!oK1;rfwטҘ-i^eBMKizKh3<+1oS,USOh߼艨y~~ e9ob6qN~n<rF+9._IfA!ФMQNj vr=럃h@.VNm% Kɠ1-%!T[>*?vΆyRwave/data/HeartRate.txt.gz0000644000176200001440000002066312377701075015326 0ustar liggesusersuW@ Dol[tR8:(x<};w,_?ߧzoǹ\+1;'w签_k^6e]q\m{:nϱG99{7^OÜϬhuVcVߓu??󏱾>]sK[ǧ1(cϹ%u%;羌>Œ?j^Xk4> sx9N_Wmk|];-~>=}_s uy޾T1AO㷱5<;c;+6t1mnsد 1ӇZki9ƧP}Wvlҵ?-sο%{yww:'\1tl:y FCvl:BwN k;_r|ecZCKr c5q%guٷX+"Wns1ܱyS 38eP{Y8X'߿v`]|?uq}*1۪ۏ~im*!?] )EZbZzÄqF꼡\7!K/M9-S]6!]>,s̑ẀF0511>4-%4 }2Cv?j)=\~ZLYoEw,}|E&u?j$A/R*)ޯH-:n0F5j70nkJk%l8)߯B4C nT;ANYM р21ʹrW#SLGcoEUf$\b}{5S '\+  1 ˴n%RM!Ȓ2EP$HRY9-̶`gUr*^5hv"䊆`u1Lg?gעRfl;V#2Ϯt]it9G5k 4k4vߩM4(cV0\fۥ}C/ɦuYd>a%IRKrX#1\_k]Q-"khߴ.װL0wI 2䩙;kC~7.Vni|!.Ǎ=xڐn [Eg$p\QcCpb{ÿ#6 !\ +--pb,Pr*i}fkqc:g>GRg9h=릉nӊV|Jtg2#-'*͎htK@\ ql>:1K"r7ED%9%ҵT*@3(*^scPQ01ƧRnEқ&&;¢K>ґleaG2eYKs6Ie9͒({V3B⣑aI2\NAe*gڣs: ̑w9Eg7;/;YNy)hA@ddF~+n@mRHv'O$ me#%B2MR5 FIV%8aX/y^lZ0ob&+9V'm\|jXB!sG&@d Ivr,,҅-.f QoY! RM"9bT(b/GߢnKFL QWAYTS g.xFt˜%B2{eNcg %{&0@skO)Lq(#pNHoˀZ(0ѯgm0p tTB4J%LɎ4gAN,qDPXВHoƮ^FG24,P;b8ljs#>~7<:6NVb}2+ G|оb#[>\*+C%#u?KwעPQ2I -P,+"3CPEYPɨ#ǏƉ?0GDrk ஭xn:jLo- C-t7Rw wa;Qm!EwITn~H0\6,V52M$fZ:aa0BУkRdANkx%7N 2㹳a_d)C]ci`Wa?sO:Y+-{ŔFg~ `2NYU;U Ƚie:3 7HSgr cQKļQ !N $7pA#kI"*{q8RUA~@2IscxQ-Sa9 7M&VrC3<_[@yrB A|ߖIФJ&I}pTHdq5хūs f!եJGQ)ğ>ixXFutZ]Kj6Ep eb)H`&E*W <jiM;Gsm948M514R^`z3ǦPH]8D փh\ߓa]#NvA-uz_ Y!n BlF䨆[R93LC8c{Tmn jV hr5$9dkU-nrQ9@$A ۣlGz%9DY?9Dm)PH8sAxU\ޔDorw4"`T" I|@zHRDFir#CVDd)*& ]?dj \LVh<:9Xv9lxZWrapz$_lHEUppG.s]ÏTmo|bUiyvM0ohu #{Xr::Ra_Re*ޕsثEj/ҷF$,WIYa'#G(g+).KmZ&VWS@;XݚcF)N s 9;,iwtS,64uS]5im=j<"p. -XYۂpddmxno@"BA"(칍# \ kKȥ WI*q(Zz[䱌UאCg f~ qYhm Nϲ6{DMVPYdd؈)Nnށ>BfPTO#9xII[NULvKèiJ==}S˦֕"(Ԋ$_ 0Hđqb4{-8m-$d:@_ '89Zz]-5mȚahg.$oBحD02X f[N$X,Q[0V+TBL$!yRd(RٻY4; 9 *(|S5W pE-fѪAx(CPKUR(;fbٙnk0 $+:0zmF~ t7V0-BoՈA85bAc/9{]D1'R+,`ň=lhe,vGby a]zvj:^ԟ;7 jH`&]ofeh93Cr,v'K#JQ +Lfa@rHwf{k.~-\4頢 McZpa8[ 8)dՅ>50q"&b&H#FM`zS/A(jm6 5NFKKiFAQ8rExSLS=3]U(v^ uŀ2 aPEևEBp!iFzRon^rFnveAݚ&^ý&,_b(,kѩ 'YunxZ T'81`p .luY7~TUDPE1%cue{e^|u,'_v1cǕL!ttmкgGBF,CMCCe$cv{)JꩱX3ϗ{Z^B%3!(_F/V`C)@EOA/臆^k<PZ.Ӵ>-VVͅl͙Xy I|dtKV0"ms^B4K̋Z+k u?!}ďc7Rڎ)[ <<߽ܱB[+&cPP#Oł#T))GUىzeU/!%v%Vj}Tdq, y^3E\[7)c0!T_/Vǔ݋L- ):AUc5Z8Ko|KPҙS[fëae)PbنY&.h/,B)݃(1G)Ƈm% CnOb% =ԣ\}qĽ[Y%nw GV|k1v‚"/{G0+_o=dbjs"`yOb"u#X:?P~I5@uuL 6VH`r)сKQ$H,vLM oDCw@Α )1jf"YA[ySd[C)F$ޫiEWkX ^t<~J"p<ڋ^l^QxuWq3HiG{i΍?hfC+<"&M3FcYcj7]"K30Hp7y4kT u/ 7(U_2 { q+O&K 6QζʶRDW^ uc}N]]qmQN|TnlyN; 2CS$'SxޭG!"AцAޖyOq%$lF@ks}:Jݦmx`w<|Mˤ@, N0]T a|ݻގTWdOu1>{y/ [hHX)W(/Y fX'<8i27fb3giX [GNze->q$AkP[g @ANeloa{[eʟx=?ar }^^msxAtCw  x0s2yj]n?WM |1Au[ IQڔamLt#lӨ.m".fdKDİNriC VQ/KwSM鎙(>|9h-?..FOu9hiQM|x1AaZ3y)v~oҺ(Gիx N-7 iM՟gxfL^z֙2 nTi%`u{t.m!\,(7#`rƬݸ&vcFh;2v`oɓO ]/uI8ț9ԻRmpbUӎΚPjhLl,h]!*EW,B{7QF)U P$Lo`DR5uׄOɋ8=h#A,1B*(a}Ie;aǜTTX CfmOWc#z޵6֒)/ F껉-gE֓YHǣ$YwM%>eH𫼍i]tٛ,˘[kgŊ#j7)ٜj552(ku-?VͥUj|\nNv5G"@XgIU4|̦URwave/data/amber8.rda0000644000176200001440000001217612377701075014135 0ustar liggesusersͭHrS3{mB+-V@KuP&\hM iB@ =} xlխ*dF8qN__SJJӏ?_?xǿǿ9eLk~zt-ߟvj/~=a翿ߟu|w0nxV}Nxkw~}vO8Sٝ7P\W s Q!.xq98rI<]|{C^1iy8 \0OyҸ.xIO5ߗ% }$~i0nS O 4s^y!|"|{[g8Ѥ1<|c5 We7w>:{ &iu+< g;qoyXZ^9 _$O_B Z؁/]P*/>2qx3AkԗS| ηw?_'xDOL'ka|^gca?^c-Vu`x ^_UsW\\K mx\җ" y눆wKMWe=a0NUp{!.ѡ} _3|6&v_<ϸxQڜ >ÿ~/X_>Dhu =?~38Oi.7u:;O؁`t{wM5+=}6KHDbu ޽:D2.GP_?E?9HL|<חq^U|䉆A?+7(yTϓa1>G}z)8i|zݭ}ǻ!M| |4|蛋\iއ~o':KO%:A^Ik~nu`bzyمūcW$=.gSe,/u n~ܗA_R O8} (_s<;MWg=~3qݍ 6?}5l!{u:a }I. D?׏a>sFA9/ү^pJ]"\㱸x.q%_.9+Q?B}S×CX 4.5s09=eЧnx9S:cXxE5%&˽l]+^o~6ԏy}Cn~?.ɳ38^wC蛆=?,69Os*]͇ '0qCrw~woeXeg=}UV<*'-1(%I\|!kJ|Ozxx$>H7{~ro#m3v^:'m}];2,QgOC<)8uా닰`wnzv)^W7EpC\$|wҕ[Ag`<߯%X@mr6Ipt90|谾BI3 OyJ})s=y"C3|z+*zO~H/~g=!mRV8&'q|;,y[}2gn|=<8wrCɋUp!qA^-s\AiZC<%Xye\x8 /}­+/ɷCt2?=O: YJ8kyK;nOX8N[n:}^e' -9 xIvf<`"uIN0 >uj+\EZ0nMߖ|AZOx`z":KP*1M "u*K>jI:l8-󄗨`?`8H~Iޛ:0KLB]$. 9 W?(Ej}0?lҟQ]!7^+lIEL%K_%=ψ߆}FIǡ}YGBԁ'IgM%~^$O/!^<|^Էo4":*䙭F!^]1_`|ڼG鏧O_b~s_v:c:cg~ݯD {Ѿj&xk} EU*Ž'_*зdᇢcs$ ?u<3*+A\-s<_d~N|5=?I?b;PTPя[u$ ?ق~]OCKp?9A63[Z=>#c%駳įdw}BI,7G|s:B>C$}xy.E%؟`=\rS2ǨNH_k~U\z z ݿ"|)ȼ!ԣ,Y%{^<^Gb/ WP?46YIMuS͋*}}n>Un^7_o7[>#^Y6ߤ$ㄷc 1'[G$|bq;ăM|vIt*:%>"Ex& <ϑe?al xK_>?Ͻǿql'}o&CItĽ"+载^M3>Vn phxJS'/$~&QO/_EEct|$=UUwx$~i_~(,~z}y=g _Nc1?Q'>&}a/`ЏOm}M%8ޫMpE>]_rUDwZ 6Zon-/dӜW(~cy}b9oF\xO 6ze^/i|s(Θ 7\?^2iDgSe7ú h};pLWqo-qBIΣ_n|byj JLUo\}-/G3+%E~ :|`2Ӎ:"xeg߳iWR'/A\K~U%~5oM? \/uxy|`ag|+skKw| So%mludIw}7خ=y__ y 6kg>:YYW @Ykm?CܬmwAf': <_4?)ꋐ-ć%VzW?aI {qW8(ҷHoQ/J&`YU|a=F/9?)_.|BKT片sq Ux?3$S#z:x I=` &>}@\ ._yD}ο.>0~ <" ^.;J]d?O|xz<&KW hMc9O|c 3g~_H# Rwave/data/W_tilda.3.txt.gz0000644000176200001440000000153612377701075015171 0ustar liggesusersr0 CŖn(ノc!Kvځ_bR>Х4βb57DFv%msEE%cnN7jmbIeM]%٥֣>GQ(IQxR)}A l[po&N!ɒr~[#A6梞.qPG+ůR>T7gWeBxO uqHb ꋦXiDi*'%]c6G1 E<8=_y__ P ±u9q9j;-iȏ+J؟ݗ|4+JwCq1c1䳒L:ۛhCCd~s/) Jq,8{Ddςuk;i+2 _%3F@P "9S$6Da_/2F=lɨ_ȉyڸx ;fe' 9cϳU5̚$xx6Ӭԅ7iXǮ;z|6zAOu)~̕s _>/EM⫺XMDrh7{ᬮJ?Lձ_kKͳ}X >w:Gy71I"w9胆mƦ\KSy> 䳆ֻ 8oNI3y>7GuȪ,E7JnNu2.dщq#DSA@/v! ֖1[ Ncx Z \v_$~ʵ#{S$o~Dw@{_J`fmR!cH]kbl2<]ɼQ0n,f;-h2+ǁd :{>x]9eP&ܹ8:;z?g~?~(@_lHqeW!Suh,F@)zu]'N1͎g]tx-s q:b+9 Nfaې8x./u*$.a?_snRwave/data/W_tilda.7.rda0000644000176200001440000000427012377701075014503 0ustar liggesusersՙyPTW[A6A-FEEDhQ8*4 Ad]'0$L9`̂+$3r@ ) ƨPӧ_WW2=λ 0 3H$Fҁe?HIdFKN:sˁ%OD 4۸iM~~/CZ0`jCdzqqS`<\1HԒ9Af~!eѾ&Q*Q4F[o8& 'wpMIp[ &HUcSw<魯^߳aE\0qmpi혞zeá!,]mibn|33Mn̦P910VTiM#*/wUf\?1EU!K.Uۚ36 #/b];-y'4V"sc7l[r{͝W;@rSZZ;=SIgASo'K+ߋ vϻ>D;'C.4zӗM=orBUmC:oW؂>^e_=QyU2f Y2TZ.1[و%AcG`K0=ȯF7Lz9S .ݬmŵ{SbJ{v[[/e9}λl0)Ϙsdap1&`0;xwyiSˌ{xH}iwv{]QnoE> CVj뻂"B~¥)/Ⱥpqq_wat:G df׷n=LJTtп]q(?NֈeS18?c҂qC/WF!8nO*׎-詼8ҤFc\@]eEVSRh7N]hsgHH?1KtɈNtZ<϶n :>M-֟C+N G̽<< Ռ6__ݎÂ]#,~´h`؂VY dL**.iCH?h}OY4o-,ҒCá;&,SiI!Q:<}_?sǧ_Ni}g9!"oirqVu+-=t934v2\G EmM<-12rٕ<^xЈQAWG.JВ$\] du">WU'Q7h+\.Dnz Mh#߯Կ>hPO5Wyj;Q7Bj&Wz1I7/>:ޓ><: [HaYo=#u?c0灎s^, sC_Ы o|e湡' ?&u5kJ]A>֛|0ߌ}^חF_Ou0iN4S3rps`RnjyTY6_]W=ه:Ot;~f(yGbEr-"wstS})b5LҹMpq/>d`=Y/!QQ2kk˂{tއ' i7IJZR{*^I{i5d  '@+yF !$@kyN A(pE۶N8TM<*W@yY O m<.ӥh@ya O 䍁<2W@Cyi O 䭁<6@ȃyq Ó<:W@yy O<>:8 Rwave/data/sig_W_tilda.4.rda0000644000176200001440000000235312377701075015342 0ustar liggesusersLC`! BT !25|eJpV4QHLg$ 99y&#BDm*b3\m?{?g 򱈲d&2U;4&Le ]_LM^KK~ +dV2~B6tM.UoAXuoVpig k)B51\zPS "4dl/b^ǹ%;,6z`Y?󎄠p}h;H:o9n{_w>|UKf=eoufL൉6[qBC~+99׾xy_Mbkƚ^jEkū}q=}ۺ9)2c5 K֘8ٲFfMwkh``<vY`S 9]~b ^$Wherzkw=ղGAf_rD8혳Ë 7gW;n >y!8sTz]iau)ʼn#*oȋ^Wc/ޱ+ɝFE9ϟ&*gߜ3lLa`jا{豅 {778:.r(+ݶ ¯tu.g{f̚*LޑfGb~[6~]߹"<{hC[P-;u̯YΎ]Ck,}> vL`DUmkئ}ccH"[\=z[%iۗeN9RX2Mt3kjfS܏ߊ~"=|Fp{'aUnq=9ȬMַ"a[uZ8}~nX[`0zEd! ǣl;[o`=chz{ { f\65O#UTRJ*UH#4H#4H#?6YS 0.b,Xpc2Fp#yBH p$$"nEp,k^#nFp4n#nGp<~$ nHpD+$$) nIpLk%(I nJpT%,i nKp\ྤ +{)'6#\w&84 NMpkc\&88 NNps\w'8< NOp{\+< Rwave/data/pixel_8.8.txt.gz0000644000176200001440000001130212377701075015153 0ustar liggesusers}[v: C5mb45 HYMlE Drm}.>>s6<?߿O=qykwܷܺ݅XW^g>i]1vˊgO_x~'| ~__ݓCk15.r\0B &f?wVQ~~:n([=s?N\xhCb6{Y]1^kTl}67FsgVEK<9/6asoG10k総kr_q9⺸Uw.Y`oI,K)|nW?޿#)}=y7WیUeH^c.=S1. w0n76ޮr1q@cy3u09{s) ׍_64ë w\c7|6Oa1-[c̳e;rr m]ƳU<q F ҽԄ6_5a®RedNػת?-> ЎDlbk"'#[4W/iY`y&6isJ/VksWC;?Ks3r3NxsZ1w]'s%$gZw^|8|JH-',O2&A˭|:RCeN|R{w3g'W'c ZF i ۰N@>s>0,G05qẀr,QkDj9\~P{iCذЊ{ !$b붩Sy03ㅼ(:^z`j&frӬƖxODe`\c1W0BWd WRC\\ۻLaNalܱVg ?YCKNL f/&yjh|Ǽo|툥̙Ԕ쟘Ƚ.:N1z+a/_~3&5{Ztȍwz^' !~6g831g62Nm[.}<6<_f{i37ϝ^ bۛ"ۥV"ʎkPU=R._4@)|`*_(vȫ7Kt^\3UCb%jhn'͸43ߝׇI~motΪ6'}?֙"/|ʚ?5@^>G3X3Nmk{ܬ=O0~ WL~S+jɽ]X3ԅj=_o;uƀό;Q/<>Z_e_FR]Dqf=9y\ɸO~60x^M xF B>f~y1|8DCZ8 ԈGvCLř7?/G|2_m1^rc IKփOy)4Ki>V؅}ߌ}\] es'M\$; ҁwivpG\0+#OSSJycy+|cQo0\Oؗ0uxN:qk dY7p:apuTDt }tq\6X=`j'^5%K o ߭icMV,[xŘ4 1gnRv]ڊ#+f{BM;~e藟v:;b_[I=g˕9V;DZO9Z+4H=qTՔeG{龷xҘ1Y Y?@պ̉>~ <,Bj#b[|_ <t(}E N ֺp?D{/>0`ƓWcFfO5#y\/ŝ;8 r攧w{<{1_X~W}̨aǘwc]ϼ`1pk&G.*3.#>LOr]$>7 -GxOM?LS/19>hOȼM<'6sp`aĸ۟Xy8 +ol.h'S='1Pp,03éCY*}'.M߯89@bqb /aRiI]zۙFζQٝZ۴;u/!c<`څmѹǫ~Bv)q9kU+yi.4 DMʸϘ/sތ^çm:+稓ˣ~:s;hF8ȼܢxwI?I>$l5X ߓR~:Y"P+aO$<9$bOe8LNe)Kf:^1k7_'=2Gs}\}=9 j^Dk7b/o"ΨY#Y,V#ۚoܔ9vE+sslrpB|ơ1>|0w{X>4k|ɇg55_bd͆ynOiopOZBuhP}I~N[ Oav94!m5ACE /uLٌj[b[fk~قdh=1x>$CWSV,S l2}1~elm<͈y;G|8a]YSb~wЏ:d6LpsAqj*5 >f\{֟/^6<ꬩmL<o+lZ{3rZƾ9+7{kr^~s:%G &kc7ãŅgV?i7+ixƘ6>3_iquӌe4ө+.s;pAii#m}fR?Y};Z+RЇf-?q ,$pkG>g޹-4\^zp=[q>NF_1&8_YhSٛlxYLG\y2\ڐRPCԓwؗzv['Y*Svsy3A8X:<qIbZ8.q}3enoXG{+OS L}Oow=|޼iڀyiv?UYXb췿ĊqvTs}R/4V_`u}r>"NkLrցkkg:" *`mRwave/data/backscatter.1.220.txt.gz0000644000176200001440000001021712377701075016370 0ustar liggesusers՝KrICs(6TkPxGJ+QUG~|篏_Ώ_9gG!\2y<3*#ۼ>bQQM\=1ٖ⚊CЎٓ=:;S<~sMxf7sNky/f%"ʹ^Q72W,E ߼C1X쓳1Z yQaȚ[pWQ$j>aS/FhG~VyAwo|Y EtZlB.vZEaԜ7G㵔`۲xD?E+h(;ʂ4TF_)bAehv jULE;jUCX  s̢gBrY tqxdG8 8>(Z1(n(:lWNY#fEl(w֍G.! O%`<^?ޔFѲϯvn9Oj>L$3)=6K3͠#0Y t:la?R\mj^ _4FIu'0-@ÚެF(ڌPE*՘b! YCU4gkh[n߇S"EpUYqS:dO#.ý4ằ%^WV~ ֓^#``I|>籌.#(^hdγ?øYULwMx;_o=P8WY =IkZ_WWdB Z[p@LLNnD:'l 蠵v9f"}#-a?ҚC1Ƭzn1rl+OnӎhFG`̮,h˛hkZniDS܀47϶e%uAƥb苉I_  ndy#k,2Kgu~v}~KW![#1VQ?uR<ΪmۧdwT3FDLO )NC\:r БN'̉c(Raٶ3좀`"B #dX©8,)J<. p`c*N{QEd[r"5e^o2lsAT3~͈2 DaG9[w!e6_}Ո̌"9O4buvDUb,0&*$VlM68gnf6ϦTX(E9 /P{rIPٽَVb(\u|k뗗Zܐb?.uI[gvsfn"crcHmE+=ôEEHp!dNdAD=c6 -;[Mms mYZUd[-a[AnahaFt=wSz"LEl-K_gc(VGc(͸,;Sr3pl,ۥA FGcw>R;o q~_##fKFmH}6fQ8)6UK 5mC:;u&^r&_q6Ha)YU5v8hussl[eCY*VU^ds_I嵲J#Vps8/Mfl\|EsIz7 h.qs+u_a%˲Ȉ?^Y^X2ylgP%WJ !g%\cz;A&_vpѮ[~>fS4&smlk7O;}`hyb5a`ab3DnSӍe6L&:f$Ώ2xU;9Ua;+o&zu7ʖ!XaVm?tt;h>a*= 'ƺ2k,)F*Rax]g7ܠ 05 ud6Y`pzC̟"#3NŗЉ0\gnaRMgҋ=p V&PL@wj2D :?ZU1"(rSڥ5 ?W= Lܮ=dNPa.gG90}@}ՊMZ\.O,i8UvK6QC8"p?-!z-IzaV@&l8$υRs!ɊSǠԏ[w7PPcl`y28qجӗ g=mmi:ޚ*.$t »ɲyU gnW" b%<F gm9{Z$b9V|bݥ3d#rw@Ⱦ\2T^>儇 fCYNANyEw?#, >ԅΧLݹ D $~MπhVQ c̟ lsΦԮ 4K)L{q9HK9!Ohb @l|)_(}pKƳ)83)x'0Ù%!D٣#5.i$x@݃ Zen q mИS>d9 a.P1$#RhV|wm!t>6Vc'eVЙ{y3e U{VꆭF_SWB~J=V~J@$eѷLs ⇫!͸*91L y5{Iy [j?_h:4Q4lX/Y o$mw#!O,e Ƚd *kne6vcLD[^AfwJiEp#h[l_'db~PPYvtt&Eܘ%JvVv c pMG50C^6Ss? b8bb*o#% hz_6'GXްMŢpe_!#KɹN˘|γKD'_'N6/d uK0+aT.CcaMpaJQ~&٪_yNbjMnpTay"G# &Y%>Xt\²&S~pox,Y큚ە N%A&5G2lJ +\ k~Kl:o+>Lp/w\>Ȋy`xAa1dԲJf$ƼJ<`Gh5jc$H1DGlDc~W12bd 9Z$eueot1lE::^Ux2Ji<:nZ41i #?*{j78بGFViP(m*OT6UV=:L;ˈf4D;5ر&9R۩z)Tک~0?,zX߉t NLkq=BjWh.z.׹zZ8<]'snrw=!8ORK^"Eo=O|{SgU\O)~f\r>Jr\fr\.r^p8p8p8p8p8p8>t;p'FTl~p^Kp<9^:Ÿh?A=@/B G94AGpצKki\pSxd8*\@v#@ځe~ ƈqޘ&;6%6&&)Eoxl\^wxR$}G^xpGxk|j6m YƪbZH 2 6[5[&qt`.;cԐ뀎<:X# FCE=TP֫jz֛dA 2N~J2Xb]Nέxr[n/cd*%fBl鈕Rwave/data/B0.txt.gz0000644000176200001440000000127712377701075013710 0ustar liggesusersV[[1 {E۲ڣ!94h) dGr_j ,/hf7 _>ۂcT]!DŽR.0vϞ4{7mlcn1\E4wIْ,.c6Dh6ܻπTҁM뾅K߬N@@])l׺WfYDX%j LK`: M"66Ѐ1 AvP#NLKS 0 r_EiCIShO6#;#B%D$#mch:Ô5>g80AT)wܙ}IS釲vPii-ZSW@6wТXzȋa-l(0]NYE-v9LgȂBDiRcH"gyr2(dVɥu+$g|8 AtQ9GƇG$2܅NJ " Z]x՜v2@]>~F>jS |UYWI,r[OZ p4G3Y:ma8/Q}~?q3͞Kl^9~%b>e/Lwxϖ)C#y^:ʻ~PmVvuMg<ݏ=޸/[vG'C.vij .{_7.|ΛTQz]Rwave/data/yendiff.txt.gz0000644000176200001440000000530512377701075015067 0ustar liggesusers}ZI9 _CJr~O=jmNj81n}:Mȵg]xgx~}PL2qm[XAUQ >.'Vi* /zYQvl=)mBR `lލ $d 0U-2;o=K9-ψ_pI|R<5O?ɣ8qiL }&aT]hf{a)+5U!◺QXO,J;xtqzRdwYlO%Ko~ވxpw$F$g5hG؋45J H:9(9$U"A)(TdJ*cEr-|UBTQb-%8YC]0!Q]%9[Q·驠Djt4<3ͪӅĘQCP222ݨr33@r9oSkN3ϨS8|wʱo#d1ËM,(S1p6G j{ew/3j_98ǬbUP+uS_)<0zS/$*ʖM 3θ6]BJwIqbUQ3oز1kf !cO"5jb(iKK@BkՃ U]G%^\zHhC)a2XrA3Yƙ!DI$RYB(+4Z͜Gcj}\;f2Z*ף=dMVU/(KRb{'ڢFNzu(RQ% }Y{aM音:L.| 8&BRpQ ^>8׋*%%e{-NRCX-ᓇ:\$ȝXw`|QNu˄]:8ꮗ zT rz/\ -,8}~K$ωj&n8Б/~Jj|ۭc\T5x;"!7 r)E|3/[Jf&Wc"Sw(4IFH>j!7zejњGB_"h۠ZVMRsSʗ.;.L"j.OzGB$G}2>I+R{_5H9R$a4J4eERF!LR7&O(XlV5hL*wBڭI ^o2 WŪȿ;m/ *PZ56*t %Lb9$.j9d<=>Wq2O$/nވrX"%N|Qމ OP$8K6A.FPTtЈq2,!o"J^DHzTsޱgZI il8z]+¯|DQ`nW fi ?^JFU1uT./z zi#cI`~\͟`3YOOw67J9Hu1, #۫_w^C)Rwave/man/0000755000176200001440000000000013230441701012104 5ustar liggesusersRwave/man/skeleton.Rd0000644000176200001440000000226413230422763014232 0ustar liggesusers\name{skeleton} \alias{skeleton} \title{ Reconstruction from Dual Wavelets } \description{ Computes the reconstructed signal from the ridge, given the inverse of the matrix Q. } \usage{ skeleton(cwtinput, Qinv, morvelets, bridge, aridge, N) } \arguments{ \item{cwtinput}{ continuous wavelet transform (as the output of cwt) } \item{Qinv}{ inverse of the reconstruction kernel (2D array) } \item{morvelets}{ array of Morlet wavelets located at the ridge samples } \item{bridge}{ time coordinates of the ridge samples } \item{aridge}{ scale coordinates of the ridge samples } \item{N}{ size of reconstructed signal }} \value{ Returns a list of the elements of the reconstruction of a signal from sample points of a ridge \item{sol}{reconstruction from a ridge} \item{A}{matrix of the inner products} \item{lam}{coefficients of dual wavelets in reconstructed signal. They are the Lagrange multipliers \eqn{\lambda}{lambda}'s of the text.} \item{dualwave}{array containing the dual wavelets.} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{skeleton2}}, \code{\link{zeroskeleton}}, \code{\link{zeroskeleton2}}. } \keyword{ts} Rwave/man/DOG.Rd0000644000176200001440000000271113230433123013004 0ustar liggesusers\name{DOG} \alias{DOG} \title{ Continuous Wavelet Transform with derivative of Gaussian } \description{ Computes the continuous wavelet transform with for (complex-valued) derivative of Gaussian wavelets. } \usage{ DOG(input, noctave, nvoice=1, moments, twoD=TRUE, plot=TRUE) } \arguments{ \item{input}{ input signal (possibly complex-valued). } \item{noctave}{ number of powers of 2 for the scale variable. } \item{moments}{ number of vanishing moments of the wavelet (order of the derivative). } \item{nvoice}{ number of scales in each octave (i.e. between two consecutive powers of 2) } \item{twoD}{ logical variable set to T to organize the output as a 2D array (signal\_size x nb\_scales), otherwise, the output is a 3D array (signal\_size x noctave x nvoice) } \item{plot}{ if set to T, display the modulus of the continuous wavelet transform on the graphic device }} \value{ continuous (complex) wavelet transform } \details{ The output contains the (complex) values of the wavelet transform of the input signal. The format of the output can be 2D array (signal\_size x nb\_scales) 3D array (signal\_size x noctave x nvoice) } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwt}}, \code{\link{cwtp}}, \code{\link{cwtsquiz}}, \code{\link{cgt}}. } \examples{ x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) DOG(chirp, noctave=5, nvoice=12, 3, twoD=TRUE, plot=TRUE) } \keyword{ts} Rwave/man/signal_W_tilda.5.Rd0000644000176200001440000000111613230424650015461 0ustar liggesusers\name{signal_W_tilda.5} \alias{signal_W_tilda.5} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.5) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.5) plot.ts(signal_W_tilda.5) } \keyword{datasets} Rwave/man/gkernel.Rd0000644000176200001440000000220113230422763014024 0ustar liggesusers\name{gkernel} \alias{gkernel} \title{ Kernel for Reconstruction from Gabor Ridges } \description{ Computes the cost from the sample of points on the estimated ridge and the matrix used in the reconstruction of the original signal. } \usage{ gkernel(node, phinode, freqstep, scale, x.inc=1, x.min=node[1], x.max=node[length(node)], plot=FALSE) } \arguments{ \item{node}{ values of the variable b for the nodes of the ridge. } \item{phinode}{ values of the scale variable a for the nodes of the ridge. } \item{freqstep}{ sampling rate for the frequency axis. } \item{scale}{ size of the window. } \item{x.inc}{ step unit for the computation of the kernel. } \item{x.min}{ minimal value of x for the computation of \eqn{Q_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{Q_2}. } \item{plot}{ if set to TRUE, displays the modulus of the matrix of \eqn{Q_2}. }} \value{ matrix of the \eqn{Q_2} kernel } %\details{} \references{ See discussions in the text of ``Time-Frequency Analysis''. } \seealso{ \code{\link{fastgkernel}}, \code{\link{kernel}}, \code{\link{rkernel}}, \code{\link{fastkernel}}, \code{\link{zerokernel}}. } \keyword{ts} Rwave/man/yen.Rd0000644000176200001440000000101713230430020013155 0ustar liggesusers\name{yen} \alias{yen} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(yen) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(yen) plot.ts(yen) } \keyword{datasets} Rwave/man/pure.dat.Rd0000644000176200001440000000104613230430140014111 0ustar liggesusers\name{pure.dat} \alias{pure.dat} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(pure.dat) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(pure.dat) plot.ts(pure.dat) } \keyword{datasets} Rwave/man/tfmean.Rd0000644000176200001440000000116213230422763013654 0ustar liggesusers\name{tfmean} \alias{tfmean} \title{ Average frequency by frequency } \description{ Compute the mean of time-frequency representation frequency by frequency. } \usage{ tfmean(input, plot=TRUE) } \arguments{ \item{input}{ time-frequency transform (output of \code{\link{cwt}} or \code{\link{cgt}}). } \item{plot}{ if set to T, displays the values of the energy as a function of the scale (or frequency). }} \value{ 1D array containing the noise estimate. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{tfpct}},\code{\link{tfvar}}. } \keyword{ts} Rwave/man/amber9.Rd0000644000176200001440000000104113230424304013546 0ustar liggesusers\name{amber9} \alias{amber9} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(amber9) } \format{A vector containing 7000 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(amber9) plot.ts(amber9) } \keyword{datasets} Rwave/man/HeartRate.Rd0000644000176200001440000000111113230422763014253 0ustar liggesusers\name{HeartRate} \alias{HeartRate} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(HeartRate) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(HeartRate) plot.ts(HeartRate) } \keyword{datasets} Rwave/man/snakeview.Rd0000644000176200001440000000105613230422763014400 0ustar liggesusers\name{snakeview} \alias{snakeview} \title{ Restriction to a Snake } \description{ Restrict time-frequency transform to a snake. } \usage{ snakeview(modulus, snake) } \arguments{ \item{modulus}{ Time-Frequency representation (real valued). } \item{snake}{ Time and frequency components of a snake. }} \value{ 2D array containing the restriction of the transform modulus to the snake. } \details{ Recall that a snake is a (two components) \R structure. } \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } %\seealso{} \keyword{ts} Rwave/man/wv.Rd0000644000176200001440000000116113230422763013035 0ustar liggesusers\name{WV} \alias{WV} \title{ Wigner-Ville function } \description{ Compute the Wigner-Ville transform, without any smoothing. } \usage{ WV(input, nvoice, freqstep = (1/nvoice), plot = TRUE) } \arguments{ \item{input}{input signal (possibly complex-valued)} \item{nvoice}{number of frequency bands} \item{freqstep}{sampling rate for the frequency axis} \item{plot}{if set to TRUE, displays the modulus of CWT on the graphic device.} } \value{ (complex) Wigner-Ville transform. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } %\seealso{} \keyword{ts} Rwave/man/cwtsquiz.Rd0000644000176200001440000000257613230422763014305 0ustar liggesusers\name{cwtsquiz} \alias{cwtsquiz} \title{ Squeezed Continuous Wavelet Transform } \description{ Computes the synchrosqueezed continuous wavelet transform with the (complex-valued) Morlet wavelet. } \usage{ cwtsquiz(input, noctave, nvoice=1, w0=2 * pi, twoD=TRUE, plot=TRUE) } \arguments{ \item{input}{ input signal (possibly complex-valued) } \item{noctave}{ number of powers of 2 for the scale variable } \item{nvoice}{ number of scales in each octave (i.e. between two consecutive powers of 2). } \item{w0}{ central frequency of the wavelet. } \item{twoD}{ logical variable set to T to organize the output as a 2D array (signal size \eqn{\times}{x} nb scales), otherwise, the output is a 3D array (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice). } \item{plot}{ logical variable set to T to T to display the modulus of the squeezed wavelet transform on the graphic device. }} \value{ synchrosqueezed continuous (complex) wavelet transform } \details{ The output contains the (complex) values of the squeezed wavelet transform of the input signal. The format of the output can be 2D array (signal size \eqn{\times}{x} nb scales), 3D array (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice). } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwt}}, \code{\link{cwtp}}, \code{\link{DOG}}, \code{\link{cgt}}. } \keyword{ts} Rwave/man/zeroskeleton2.Rd0000644000176200001440000000254213230422763015213 0ustar liggesusers\name{zeroskeleton2} \alias{zeroskeleton2} \title{ Reconstruction from Dual Wavelets } \description{ Computes the the reconstructed signal from the ridge when the epsilon parameter is set to zero, in the case of real constraints. } \usage{ zeroskeleton2(cwtinput, Qinv, morvelets, bridge, aridge, N) } \arguments{ \item{cwtinput}{ continuous wavelet transform (output of \code{\link{cwt}}). } \item{Qinv}{ inverse of the reconstruction kernel (2D array). } \item{morvelets}{ array of Morlet wavelets located at the ridge samples. } \item{bridge}{ time coordinates of the ridge samples. } \item{aridge}{ scale coordinates of the ridge samples. } \item{N}{ size of reconstructed signal. }} \value{ Returns a list of the elements of the reconstruction of a signal from sample points of a ridge \item{sol}{reconstruction from a ridge.} \item{A}{matrix of the inner products.} \item{lam}{coefficients of dual wavelets in reconstructed signal. They are the Lagrange multipliers \eqn{\lambda}{lambda}'s of the text.} \item{dualwave}{array containing the dual wavelets.} } \details{ The details of this reconstruction are the same as for the function skeleton. They can be found in the text } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{skeleton}}, \code{\link{skeleton2}}, \code{\link{zeroskeleton}}. } \keyword{ts} Rwave/man/b0.Rd0000644000176200001440000000100013230424244012666 0ustar liggesusers\name{B0} \alias{B0} \title{Transient Signal} \description{Transient signal. } \usage{data(B0) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(B0) plot.ts(B0) } \keyword{datasets} Rwave/man/scrcrec.Rd0000644000176200001440000000241213230422763014025 0ustar liggesusers\name{scrcrec} \alias{scrcrec} \title{ Simple Reconstruction from Crazy Climbers Ridges } \description{ Reconstructs signal from ridges obtained by \code{\link{crc}}, using the restriction of the transform to the ridge. } \usage{ scrcrec(siginput, tfinput, beemap, bstep=5, ptile=0.01, plot=2) } \arguments{ \item{siginput}{ input signal. } \item{tfinput}{ time-frequency representation (output of \code{\link{cwt}} or \code{\link{cgt}}. } \item{beemap}{ output of crazy climber algorithm } \item{bstep}{ used for the chaining (see \code{\link{cfamily}}). } \item{ptile}{ threshold on the measure beemap (see \code{\link{cfamily}}). } \item{plot}{ 1: displays signal,components, and reconstruction one after another.\cr 2: displays signal, components and reconstruction.\cr Else, no plot. }} \value{ Returns a list containing the reconstructed signal and the chained ridges. \item{rec}{reconstructed signal} \item{ordered}{image of the ridges (with different colors)} \item{comp}{2D array containing the signals reconstructed from ridges} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{crc}},\code{\link{cfamily}} for crazy climbers method, \code{\link{crcrec}} for reconstruction methods. } \keyword{ts} Rwave/man/smoothts.Rd0000644000176200001440000000062613230422763014266 0ustar liggesusers\name{smoothts} \alias{smoothts} \title{ Smoothing Time Series } \description{ Smooth a time series by averaging window. } \usage{ smoothts(ts, windowsize) } \arguments{ \item{ts}{ Time series. } \item{windowsize}{ Length of smoothing window. }} \value{ Smoothed time series (1D array). } %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } %\seealso{} \keyword{ts} Rwave/man/plotwt.Rd0000644000176200001440000000132013230422763013727 0ustar liggesusers\name{plotwt} \alias{plotwt} \title{ Plot Dyadic Wavelet Transform } \description{ Plot dyadic wavelet transform. } \usage{ plotwt(original, psi, phi, maxresoln, scale=FALSE, yaxtype="s") } \arguments{ \item{original}{ input signal. } \item{psi}{ dyadic wavelet transform. } \item{phi}{ scaling function transform at last resolution. } \item{maxresoln}{ number of decomposition scales. } \item{scale}{ when set, the wavelet transform at each scale is plotted with the same scale. } \item{yaxtype}{ axis type (see \R manual). }} %\value{} %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } \seealso{ \code{\link{plotResult}}, \code{\link{epl}}, \code{\link{wpl}}. } \keyword{ts} Rwave/man/tfgmax.Rd0000644000176200001440000000125613230422763013674 0ustar liggesusers\name{tfgmax} \alias{tfgmax} \title{ Time-Frequency Transform Global Maxima } \description{ Computes the maxima (for each fixed value of the time variable) of the modulus of a continuous wavelet transform. } \usage{ tfgmax(input, plot=TRUE) } \arguments{ \item{input}{ wavelet transform (as the output of the function \code{\link{cwt}}) } \item{plot}{ if set to TRUE, displays the values of the energy as a function of the scale. }} \value{ \item{output}{values of the maxima (1D array)} \item{pos}{positions of the maxima (1D array)} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{tflmax}}. } \keyword{ts} Rwave/man/rkernel.Rd0000644000176200001440000000236113230422763014046 0ustar liggesusers\name{rkernel} \alias{rkernel} \title{ Kernel for Reconstruction from Wavelet Ridges } \description{ Computes the cost from the sample of points on the estimated ridge and the matrix used in the reconstruction of the original signal, in the case of real constraints. Modification of the function \code{\link{kernel}}. } \usage{ rkernel(node, phinode, nvoice, x.inc=1, x.min=node[1], x.max=node[length(node)], w0=2 * pi, plot=FALSE) } \arguments{ \item{node}{ values of the variable b for the nodes of the ridge. } \item{phinode}{ values of the scale variable a for the nodes of the ridge. } \item{nvoice}{ number of scales within 1 octave. } \item{x.inc}{ step unit for the computation of the kernel. } \item{x.min}{ minimal value of x for the computation of \eqn{Q_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{Q_2}. } \item{w0}{ central frequency of the wavelet. } \item{plot}{ if set to TRUE, displays the modulus of the matrix of \eqn{Q_2}. }} \value{ matrix of the \eqn{Q_2} kernel } \details{ Uses Romberg's method for computing the kernel. } \references{ See discussions in the text of "Time-Frequency Analysis". } \seealso{ \code{\link{kernel}}, \code{\link{fastkernel}}, \code{\link{gkernel}}, \code{\link{zerokernel}}. } \keyword{ts} Rwave/man/zeroskeleton.Rd0000644000176200001440000000250313230422763015126 0ustar liggesusers\name{zeroskeleton} \alias{zeroskeleton} \title{ Reconstruction from Dual Wavelets } \description{ Computes the the reconstructed signal from the ridge when the epsilon parameter is set to zero } \usage{ zeroskeleton(cwtinput, Qinv, morvelets, bridge, aridge, N) } \arguments{ \item{cwtinput}{ continuous wavelet transform (as the output of \code{\link{cwt}}). } \item{Qinv}{ inverse of the reconstruction kernel (2D array). } \item{morvelets}{ array of Morlet wavelets located at the ridge samples. } \item{bridge}{ time coordinates of the ridge samples. } \item{aridge}{ scale coordinates of the ridge samples. } \item{N}{ size of reconstructed signal. }} \value{ Returns a list of the elements of the reconstruction of a signal from sample points of a ridge \item{sol}{reconstruction from a ridge.} \item{A}{matrix of the inner products.} \item{lam}{coefficients of dual wavelets in reconstructed signal. They are the Lagrange multipliers \eqn{\lambda}{lambda}'s of the text.} \item{dualwave}{array containing the dual wavelets.} } \details{ The details of this reconstruction are the same as for the function skeleton. They can be found in the text } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{skeleton}}, \code{\link{skeleton2}}, \code{\link{zeroskeleton2}}. } \keyword{ts} Rwave/man/morwave2.Rd0000644000176200001440000000160213230422763014143 0ustar liggesusers\name{morwave2} \alias{morwave2} \title{ Real Ridge Morvelets } \description{ Generates the real parts of the Morlet wavelets at the sample points of a ridge } \usage{ morwave2(bridge, aridge, nvoice, np, N, w0=2 * pi) } \arguments{ \item{bridge}{ time coordinates of the ridge samples. } \item{aridge}{ scale coordinates of the ridge samples. } \item{nvoice}{ number of different scales per octave. } \item{np}{ number of samples in the input signal. } \item{N}{ size of reconstructed signal. } \item{w0}{ central frequency of the wavelet. }} \value{ Returns the real parts of the Morlet wavelets at the samples of the time-scale plane given in the input: array of Morlet wavelets located on the ridge samples } %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } \seealso{ \code{\link{morwave}}, \code{\link{gwave}}, \code{\link{gwave2}}. } \keyword{ts} Rwave/man/W_tilda.3.Rd0000644000176200001440000000110513230422763014123 0ustar liggesusers\name{W_tilda.3} \alias{W_tilda.3} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.3) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.3) plot.ts(W_tilda.3) } \keyword{datasets} Rwave/man/cwt.Rd0000644000176200001440000000275613230422763013211 0ustar liggesusers\name{cwt} \alias{cwt} \title{ Continuous Wavelet Transform } \description{ Computes the continuous wavelet transform with for the (complex-valued) Morlet wavelet. } \usage{ cwt(input, noctave, nvoice=1, w0=2 * pi, twoD=TRUE, plot=TRUE) } \arguments{ \item{input}{ input signal (possibly complex-valued) } \item{noctave}{ number of powers of 2 for the scale variable } \item{nvoice}{ number of scales in each octave (i.e. between two consecutive powers of 2). } \item{w0}{ central frequency of the wavelet. } \item{twoD}{ logical variable set to T to organize the output as a 2D array (signal\_size x nb\_scales), otherwise, the output is a 3D array (signal\_size x noctave x nvoice). } \item{plot}{ if set to T, display the modulus of the continuous wavelet transform on the graphic device. }} \value{ continuous (complex) wavelet transform } \details{ The output contains the (complex) values of the wavelet transform of the input signal. The format of the output can be 2D array (signal\_size x nb\_scales) 3D array (signal\_size x noctave x nvoice) Since Morlet's wavelet is not strictly speaking a wavelet (it is not of vanishing integral), artifacts may occur for certain signals. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwtp}}, \code{\link{cwtTh}}, \code{\link{DOG}}, \code{\link{gabor}}. } \examples{ x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) retChirp <- cwt(chirp, noctave=5, nvoice=12) } \keyword{ts} Rwave/man/W_tilda.8.Rd0000644000176200001440000000110713230422763014132 0ustar liggesusers\name{W_tilda.8} \alias{W_tilda.8} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.8) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.8) plot.ts(W_tilda.8) } \keyword{datasets} Rwave/man/click.asc.Rd0000644000176200001440000000105313230430202014216 0ustar liggesusers\name{click.asc} \alias{click.asc} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(click.asc) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(click.asc) plot.ts(click.asc) } \keyword{datasets} Rwave/man/crc.Rd0000644000176200001440000000321013230441545013144 0ustar liggesusers\name{crc} \alias{crc} \title{ Ridge Extraction by Crazy Climbers } \description{ Uses the "crazy climber algorithm" to detect ridges in the modulus of a continuous wavelet or a Gabor transform. } \usage{ crc(tfrep, tfspec=numeric(dim(tfrep)[2]), bstep=3, iteration=10000, rate=0.001, seed=-7, nbclimb=10, flag.int=TRUE, chain=TRUE, flag.temp=FALSE) } \arguments{ \item{tfrep}{ modulus of the (wavelet or Gabor) transform. } \item{tfspec}{ numeric vector which gives, for each value of the scale or frequency the expected size of the noise contribution. } \item{bstep}{ stepsize for random walk of the climbers. } \item{iteration}{ number of iterations. } \item{rate}{ initial value of the temperature. } \item{seed}{ initial value of the random number generator. } \item{nbclimb}{ number of crazy climbers. } \item{flag.int}{ if set to TRUE, the weighted occupation measure is computed. } \item{chain}{ if set to TRUE, chaining of the ridges is done. } \item{flag.temp}{ if set to TRUE: constant temperature. }} \value{ Returns a 2D array called beemap containing the (weighted or unweighted) occupation measure (integrated with respect to time) } %\details{} \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{corona}}, \code{\link{icm}}, \code{\link{coronoid}}, \code{\link{snake}}, \code{\link{snakoid}} for ridge estimation, \code{\link{cfamily}} for chaining and \code{\link{crcrec}},\code{\link{gcrcrec}},\code{\link{scrcrec}} for reconstruction. } \examples{ data(HOWAREYOU) plot.ts(HOWAREYOU) cgtHOWAREYOU <- cgt(HOWAREYOU,70,0.01,100) clHOWAREYOU <- crc(Mod(cgtHOWAREYOU),nbclimb=1000) } \keyword{ts} Rwave/man/Ekg.Rd0000644000176200001440000000105013230422763013104 0ustar liggesusers\name{Ekg} \alias{Ekg} \title{Heart Rate Data} \description{Successive beat-to-beat intervals for a normal patient. } \usage{data(Ekg) } \format{A vector containing 16,042 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(Ekg) plot.ts(Ekg) } \keyword{datasets} Rwave/man/signal_W_tilda.6.Rd0000644000176200001440000000111613230424602015457 0ustar liggesusers\name{signal_W_tilda.6} \alias{signal_W_tilda.6} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.6) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.6) plot.ts(signal_W_tilda.6) } \keyword{datasets} Rwave/man/backscatter.1.180.Rd0000644000176200001440000000112313230423537015333 0ustar liggesusers\name{backscatter.1.180} \alias{backscatter.1.180} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(backscatter.1.180) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(backscatter.1.180) plot.ts(backscatter.1.180) } \keyword{datasets} Rwave/man/wpl.Rd0000644000176200001440000000055513230422763013211 0ustar liggesusers\name{wpl} \alias{wpl} \title{ Plot Dyadic Wavelet Transform. } \description{ Plot dyadic wavelet transform(output of \code{\link{mw}}). } \usage{ wpl(dwtrans) } \arguments{ \item{dwtrans}{ dyadic wavelet transform (output of \code{\link{mw}}). }} %\value{} %\details{} %\references{} \seealso{ \code{\link{mw}}, \code{\link{ext}},\code{\link{epl}}. } \keyword{ts} Rwave/man/W_tilda.6.Rd0000644000176200001440000000110613230422763014127 0ustar liggesusers\name{W_tilda.6} \alias{W_tilda.6} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.6) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.6) plot.ts(W_tilda.6) } \keyword{datasets} Rwave/man/rwkernel.Rd0000644000176200001440000000220613230422763014233 0ustar liggesusers\name{rwkernel} \alias{rwkernel} \title{ Kernel for Reconstruction from Wavelet Ridges } \description{ Computes the cost from the sample of points on the estimated ridge and the matrix used in the reconstruction of the original signal } \usage{ rwkernel(node, phinode, nvoice, x.inc=1, x.min=node[1], x.max=node[length(node)], w0=2 * pi, plot=FALSE) } \arguments{ \item{node}{ values of the variable b for the nodes of the ridge. } \item{phinode}{ values of the scale variable a for the nodes of the ridge. } \item{nvoice}{ number of scales within 1 octave. } \item{x.inc}{ step unit for the computation of the kernel. } \item{x.min}{ minimal value of x for the computation of \eqn{Q_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{Q_2}. } \item{w0}{ central frequency of the wavelet. } \item{plot}{ if set to TRUE, displays the modulus of the matrix of \eqn{Q_2}. }} \value{ matrix of the \eqn{Q_2} kernel } \details{ The kernel is evaluated using Romberg's method. } \references{ See discussions in the text of "Time-Frequency Analysis". } \seealso{ \code{\link{gkernel}}, \code{\link{rkernel}}, \code{\link{zerokernel}}. } \keyword{ts} Rwave/man/snakoid.Rd0000644000176200001440000000376113230422763014041 0ustar liggesusers\name{snakoid} \alias{snakoid} \title{ Modified Snake Method } \description{ Estimate a ridge from a time-frequency representation, using the modified snake method (modified cost function). } \usage{ snakoid(modulus, guessA, guessB, snakesize=length(guessB), tfspec=numeric(dim(modulus)[2]), subrate=1, temprate=3, muA=1, muB=muA, lambdaB=2 * muB, lambdaA=2 * muA, iteration=1000000, seed=-7, costsub=1, stagnant=20000, plot=TRUE) } \arguments{ \item{modulus}{ Time-Frequency representation (real valued). } \item{guessA}{ Initial guess for the algorithm (frequency variable). } \item{guessB}{ Initial guess for the algorithm (time variable). } \item{snakesize}{ The length of the first guess of time variable. } \item{tfspec}{ Estimate for the contribution of srthe noise to modulus. } \item{subrate}{ Subsampling rate for ridge estimation. } \item{temprate}{ Initial value of temperature parameter. } \item{muA}{ Coefficient of the ridge's derivative in cost function (frequency component). } \item{muB}{ Coefficient of the ridge's derivative in cost function (time component). } \item{lambdaB}{ Coefficient of the ridge's second derivative in cost function (time component). } \item{lambdaA}{ Coefficient of the ridge's second derivative in cost function (frequency component). } \item{iteration}{ Maximal number of moves. } \item{seed}{ Initialization of random number generator. } \item{costsub}{ Subsampling of cost function in output. } \item{stagnant}{ Maximum number of stationary iterations before stopping. } \item{plot}{ when set(default), some results will be displayed }} \value{ Returns a structure containing: \item{ridge}{1D array (of same length as the signal) containing the ridge.} \item{cost}{1D array containing the cost function.} \item{plot}{when set(default), some results will be displayed.} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{corona}}, \code{\link{coronoid}}, \code{\link{icm}}, \code{\link{snake}}. } \keyword{ts} Rwave/man/noisy.dat.Rd0000644000176200001440000000105313230426355014312 0ustar liggesusers\name{noisy.dat} \alias{noisy.dat} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(noisy.dat) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(noisy.dat) plot.ts(noisy.dat) } \keyword{datasets} Rwave/man/npl.Rd0000644000176200001440000000041613230422763013174 0ustar liggesusers\name{npl} \alias{npl} \title{ Prepare Graphics Environment } \description{ Splits the graphics device into prescrivbed number of windows. } \usage{ npl(nbrow) } \arguments{ \item{nbrow}{ number of plots. }} %\value{} %\details{} %\references{} %\seealso{} \keyword{ts} Rwave/man/ridrec.Rd0000644000176200001440000000321213230422763013650 0ustar liggesusers\name{ridrec} \alias{ridrec} \title{ Reconstruction from a Ridge } \description{ Reconstructs signal from sample of a ridge, in the wavelet case. } \usage{ ridrec(cwtinput, node, phinode, noct, nvoice, Qinv, epsilon, np, w0=2 * pi, check=FALSE, real=FALSE) } \arguments{ \item{cwtinput}{ wavelet transform, output of \code{\link{cwt}}. } \item{node}{ time coordinates of the ridge samples. } \item{phinode}{ scale coordinates of the ridge samples. } \item{noct}{ number of octaves (powers of 2). } \item{nvoice}{ number of different scales per octave. } \item{Qinv}{ inverse of the matrix \eqn{Q} of the quadratic form. } \item{epsilon}{ coefficient of the \eqn{Q_2} term in reconstruction kernel } \item{np}{ number of samples of the reconstructed signal. } \item{w0}{ central frequency of Morlet wavelet. } \item{check}{ if set to TRUE, computes \code{\link{cwt}} of reconstructed signal. } \item{real}{ if set to TRUE, uses only constraints on the real part of the transform. }} \value{ Returns a list containing the reconstructed signal and the chained ridges. \item{sol}{reconstruction from a ridge} \item{A}{ matrix } \item{lam}{coefficients of dual wavelets in reconstructed signal.} \item{dualwave}{array containing the dual wavelets.} \item{morvelets}{array of morlet wavelets located on the ridge samples.} \item{solskel}{wavelet transform of sol, restricted to the ridge} \item{inputskel}{wavelet transform of signal, restricted to the ridge} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{sridrec}}, \code{\link{regrec}}, \code{\link{regrec2}}. } \keyword{ts} Rwave/man/yendiff.Rd0000644000176200001440000000104113230427773014030 0ustar liggesusers\name{yendiff} \alias{yendiff} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(yendiff) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(yendiff) plot.ts(yendiff) } \keyword{datasets} Rwave/man/vwt.Rd0000644000176200001440000000107413230422763013224 0ustar liggesusers\name{vwt} \alias{vwt} \title{ Voice Wavelet Transform } \description{ Compute Morlet's wavelet transform at one scale. } \usage{ vwt(input, scale, w0=2 * pi) } \arguments{ \item{input}{ Input signal (1D array). } \item{scale}{ Scale at which the wavelet transform is to be computed. } \item{w0}{ Center frequency of the wavelet. }} \value{ 1D (complex) array containing wavelet transform at one scale. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{vgt}}, \code{\link{vDOG}}. } \keyword{ts} Rwave/man/icm.Rd0000644000176200001440000000256313230422763013160 0ustar liggesusers\name{icm} \alias{icm} \title{ Ridge Estimation by ICM Method } \description{ Estimate a (single) ridge from a time-frequency representation, using the ICM minimization method. } \usage{ icm(modulus, guess, tfspec=numeric(dim(modulus)[2]), subrate=1, mu=1, lambda=2 * mu, iteration=100) } \arguments{ \item{modulus}{ Time-Frequency representation (real valued). } \item{guess}{ Initial guess for the algorithm. } \item{tfspec}{ Estimate for the contribution of the noise to modulus. } \item{subrate}{ Subsampling rate for ridge estimation. } \item{mu}{ Coefficient of the ridge's second derivative in cost function. } \item{lambda}{ Coefficient of the ridge's derivative in cost function. } \item{iteration}{ Maximal number of moves. }} \value{ Returns the estimated ridge and the cost function. \item{ridge}{ 1D array (of same length as the signal) containing the ridge. } \item{cost}{ 1D array containing the cost function. }} \details{ To accelerate convergence, it is useful to preprocess modulus before running annealing method. Such a preprocessing (smoothing and subsampling of modulus) is implemented in \code{\link{icm}}. The parameter subrate specifies the subsampling rate. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{corona}}, \code{\link{coronoid}}, and \code{\link{snake}}, \code{\link{snakoid}}. } \keyword{ts} Rwave/man/regrec2.Rd0000644000176200001440000000326013230422763013734 0ustar liggesusers\name{regrec2} \alias{regrec2} \title{ Reconstruction from a Ridge } \description{ Reconstructs signal from a ``regularly sampled'' ridge, in the wavelet case, from a precomputed kernel. } \usage{ regrec2(siginput, cwtinput, phi, nbnodes, noct, nvoice, Q2, epsilon=0.5, w0=2 * pi, plot=FALSE) } \arguments{ \item{siginput}{ input signal. } \item{cwtinput}{ wavelet transform, output of \code{\link{cwt}}. } \item{phi}{ unsampled ridge. } \item{nbnodes}{ number of samples on the ridge } \item{noct}{ number of octaves (powers of 2) } \item{nvoice}{ number of different scales per octave } \item{Q2}{ second term of the reconstruction kernel } \item{epsilon}{ coefficient of the \eqn{Q_2} term in reconstruction kernel } \item{w0}{ central frequency of Morlet wavelet } \item{plot}{ if set to TRUE, displays original and reconstructed signals }} \value{ Returns a list containing: \item{sol}{ reconstruction from a ridge. } \item{A}{ matrix. } \item{lam}{ coefficients of dual wavelets in reconstructed signal. } \item{dualwave}{ array containing the dual wavelets. } \item{morvelets}{ array containing the wavelets on sampled ridge. } \item{solskel}{ wavelet transform of sol, restricted to the ridge. } \item{inputskel}{ wavelet transform of signal, restricted to the ridge. } \item{nbnodes}{ number of nodes used for the reconstruction. }} \details{ The computation of the kernel may be time consuming. This function avoids recomputing it if it was computed already. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{regrec}}, \code{\link{gregrec}}, \code{\link{ridrec}}, \code{\link{sridrec}}. } \keyword{ts} Rwave/man/W_tilda.1.Rd0000644000176200001440000000110613230422763014122 0ustar liggesusers\name{W_tilda.1} \alias{W_tilda.1} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.1) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.1) plot.ts(W_tilda.1) } \keyword{datasets} Rwave/man/cwtimage.Rd0000644000176200001440000000204413230422763014202 0ustar liggesusers\name{cwtimage} \alias{cwtimage} \title{ Continuous Wavelet Transform Display } \description{ Converts the output (modulus or argument) of cwtpolar to a 2D array and displays on the graphic device. } \usage{ cwtimage(input) } \arguments{ \item{input}{ 3D array containing a continuous wavelet transform }} \value{ 2D array continuous (complex) wavelet transform } \details{ The output contains the (complex) values of the wavelet transform of the input signal. The format of the output can be % format of the input?? 2D array (signal\_size x nb\_scales) 3D array (signal\_size x noctave x nvoice) } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwtpolar}}, \code{\link{cwt}}, \code{\link{DOG}}. } \examples{ x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) retChirp <- cwt(chirp, noctave=5, nvoice=12, twoD=FALSE, plot=FALSE) retPolar <- cwtpolar(retChirp) retImageMod <- cwtimage(retPolar$modulus) retImageArg <- cwtimage(retPolar$argument) } \keyword{ts} Rwave/man/W_tilda.2.Rd0000644000176200001440000000110613230422763014123 0ustar liggesusers\name{W_tilda.2} \alias{W_tilda.2} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.2) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.2) plot.ts(W_tilda.2) } \keyword{datasets} Rwave/man/crfview.Rd0000644000176200001440000000115213230422763014046 0ustar liggesusers\name{crfview} \alias{crfview} \title{ Display chained ridges } \description{ displays a family of chained ridges, output of \code{\link{cfamily}}. } \usage{ crfview(beemap, twod=TRUE) } \arguments{ \item{beemap}{ Family of chained ridges, output of \code{\link{cfamily}}. } \item{twod}{ If set to T, displays the ridges as an image. If set to F, displays as a series of curves. }} %\value{} %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{crc}},\code{\link{cfamily}} for crazy climbers and corresponding chaining algorithms. } \keyword{ts} Rwave/man/W_tilda.5.Rd0000644000176200001440000000110513230422763014125 0ustar liggesusers\name{W_tilda.5} \alias{W_tilda.5} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.5) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.5) plot.ts(W_tilda.5) } \keyword{datasets} Rwave/man/purwave.Rd0000644000176200001440000000104713230430076014071 0ustar liggesusers\name{purwave} \alias{purwave} \title{Pure Gravitational Wave} \description{Pure gravitational wave. } \usage{data(purwave) } \format{A vector containing 8192 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(purwave) plot.ts(purwave) } \keyword{datasets} Rwave/man/signal_W_tilda.4.Rd0000644000176200001440000000111613230424673015465 0ustar liggesusers\name{signal_W_tilda.4} \alias{signal_W_tilda.4} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.4) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.4) plot.ts(signal_W_tilda.4) } \keyword{datasets} Rwave/man/sig_W_tilda.5.Rd0000644000176200001440000000113113230422763014766 0ustar liggesusers\name{sig_W_tilda.5} \alias{sig_W_tilda.5} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(sig_W_tilda.5) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(sig_W_tilda.5) plot.ts(sig_W_tilda.5) } \keyword{datasets} Rwave/man/W_tilda.7.Rd0000644000176200001440000000110513230422763014127 0ustar liggesusers\name{W_tilda.7} \alias{W_tilda.7} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.7) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.7) plot.ts(W_tilda.7) } \keyword{datasets} Rwave/man/b4.Rd0000644000176200001440000000100013230424173012673 0ustar liggesusers\name{B4} \alias{B4} \title{Transient Signal} \description{Transient signal. } \usage{data(B4) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(B4) plot.ts(B4) } \keyword{datasets} Rwave/man/ch.Rd0000644000176200001440000000077213230430434012774 0ustar liggesusers\name{ch} \alias{ch} \title{Chen's Chirp} \description{Chen's chirp. } \usage{data(ch) } \format{A vector containing 15,000 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(ch) plot.ts(ch) } \keyword{datasets} Rwave/man/backscatter.1.220.Rd0000644000176200001440000000112513230423504015322 0ustar liggesusers\name{backscatter.1.220} \alias{backscatter.1.220} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(backscatter.1.220) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(backscatter.1.220) plot.ts(backscatter.1.220) } \keyword{datasets} Rwave/man/sridrec.Rd0000644000176200001440000000104313230422763014033 0ustar liggesusers\name{sridrec} \alias{sridrec} \title{ Simple Reconstruction from Ridge } \description{ Simple reconstruction of a real valued signal from a ridge, by restriction of the transform to the ridge. } \usage{ sridrec(tfinput, ridge) } \arguments{ \item{tfinput}{ time-frequency representation. } \item{ridge}{ ridge (1D array). }} \value{ (real) reconstructed signal (1D array) } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{ridrec}}, \code{\link{gridrec}}. } \keyword{ts} Rwave/man/fastgkernel.Rd0000644000176200001440000000237313230422763014714 0ustar liggesusers\name{fastgkernel} \alias{fastgkernel} \title{ Kernel for Reconstruction from Gabor Ridges } \description{ Computes the cost from the sample of points on the estimated ridge and the matrix used in the reconstruction of the original signal, using simple trapezoidal rule for integrals. } \usage{ fastgkernel(node, phinode, freqstep, scale, x.inc=1, x.min=node[1], x.max=node[length(node)], plot=FALSE) } \arguments{ \item{node}{ values of the variable b for the nodes of the ridge } \item{phinode}{ values of the frequency variable \eqn{\omega} for the nodes of the ridge } \item{freqstep}{ sampling rate for the frequency axis } \item{scale}{ size of the window } \item{x.inc}{ step unit for the computation of the kernel. } \item{x.min}{ minimal value of x for the computation of \eqn{G_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{G_2}. } \item{plot}{ if set to TRUE, displays the modulus of the matrix of \eqn{G_2}. }} \value{ matrix of the \eqn{G_2} kernel. } \details{ Uses trapezoidal rule (instead of Romberg's method) to evaluate the kernel. } \references{ See discussions in the text of ``Time-Frequency Analysis''. } \seealso{ \code{\link{gkernel}}, \code{\link{fastkernel}}, \code{\link{rkernel}}, \code{\link{zerokernel}}. } \keyword{ts} Rwave/man/fastkernel.Rd0000644000176200001440000000246113230422763014543 0ustar liggesusers\name{fastkernel} \alias{fastkernel} \title{ Kernel for Reconstruction from Wavelet Ridges } \description{ Computes the cost from the sample of points on the estimated ridge and the matrix used in the reconstruction of the original signal, using simple trapezoidal rule for integrals. } \usage{ fastkernel(node, phinode, nvoice, x.inc=1, x.min=node[1], x.max=node[length(node)], w0=2 * pi, plot=FALSE) } \arguments{ \item{node}{ values of the variable b for the nodes of the ridge. } \item{phinode}{ values of the scale variable a for the nodes of the ridge. } \item{nvoice}{ number of scales within 1 octave. } \item{x.inc}{ step unit for the computation of the kernel } \item{x.min}{ minimal value of x for the computation of \eqn{Q_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{Q_2}. } \item{w0}{ central frequency of the wavelet } \item{plot}{ if set to TRUE, displays the modulus of the matrix of \eqn{Q_2}. }} \value{ matrix of the \eqn{Q_2} kernel. } \details{ Uses trapezoidal rule (instead of Romberg's method) to evaluate the kernel. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{kernel}}, \code{\link{rkernel}}, \code{\link{gkernel}}, \code{\link{zerokernel}}. } \keyword{ts} %\keyword{~keyword} % Converted by Sd2Rd version 1.21. Rwave/man/signal_W_tilda.8.Rd0000644000176200001440000000115013230422763015465 0ustar liggesusers\name{signal_W_tilda.8} \alias{signal_W_tilda.8} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.8) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.8) plot.ts(signal_W_tilda.8) } \keyword{datasets} Rwave/man/tfvar.Rd0000644000176200001440000000116513230422763013527 0ustar liggesusers\name{tfvar} \alias{tfvar} \title{ Variance frequency by frequency } \description{ Compute the variance of time-frequency representation frequency by frequency. } \usage{ tfvar(input, plot=TRUE) } \arguments{ \item{input}{ time-frequency transform (output of \code{\link{cwt}} or \code{\link{cgt}}). } \item{plot}{ if set to T, displays the values of the energy as a function of the scale (or frequency). }} \value{ 1D array containing the noise estimate. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{tfmean}},\code{\link{tfpct}}. } \keyword{ts} Rwave/man/a4.Rd0000644000176200001440000000077713230423646012722 0ustar liggesusers\name{A4} \alias{A4} \title{Transient Signal} \description{Transient signal. } \usage{data(A4) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(A4) plot.ts(A4) } \keyword{datasets} Rwave/man/d4.Rd0000644000176200001440000000077713230426410012715 0ustar liggesusers\name{D4} \alias{D4} \title{Transient Signal} \description{Transient signal. } \usage{data(D4) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(D4) plot.ts(D4) } \keyword{datasets} Rwave/man/gwave2.Rd0000644000176200001440000000156513230422763013604 0ustar liggesusers\name{gwave2} \alias{gwave2} \title{ Real Gabor Functions on a Ridge } \description{ Generation of the real parts of gabor functions located on a ridge. (modification of \code{\link{gwave}}.) } \usage{ gwave2(bridge, omegaridge, nvoice, freqstep, scale, np, N) } \arguments{ \item{bridge}{ time coordinates of the ridge samples } \item{omegaridge}{ frequency coordinates of the ridge samples } \item{nvoice}{ number of different scales per octave } \item{freqstep}{ sampling rate for the frequency axis } \item{scale}{ scale of the window } \item{np}{ size of the reconstruction kernel } \item{N}{ number of complex constraints }} \value{ Array of real Gabor functions located on the ridge samples } %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } \seealso{ \code{\link{gwave}}, \code{\link{morwave}}, \code{\link{morwave2}}. } \keyword{ts} Rwave/man/HOWAREYOU.Rd0000644000176200001440000000104613230422763013765 0ustar liggesusers\name{HOWAREYOU} \alias{HOWAREYOU} \title{How Are You?} \description{Example of speech signal. } \usage{data(HOWAREYOU) } \format{A vector containing 5151 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(HOWAREYOU) plot.ts(HOWAREYOU) } \keyword{datasets} Rwave/man/mntrim.Rd0000644000176200001440000000217513230422763013715 0ustar liggesusers\name{mntrim} \alias{mntrim} \title{ Trim Dyadic Wavelet Transform Extrema } \description{ Trimming of dyadic wavelet transform local extrema, assuming normal distribution. } \usage{ mntrim(extrema, scale=FALSE, prct=0.95) } \arguments{ \item{extrema}{ dyadic wavelet transform extrema (output of \code{\link{ext}}). } \item{scale}{ when set, the wavelet transform at each scale will be plotted with the same scale. } \item{prct}{percentage critical value used for thresholding} } \value{ Structure containing \item{original}{ original signal. } \item{extrema}{ trimmed extrema representation. } \item{Sf}{ coarse resolution of signal. } \item{maxresoln}{ number of decomposition scales. } \item{np}{ size of signal. }} \details{ The distribution of extrema of dyadic wavelet transform at each scale is generated by simulation, assuming a normal distribution, and the 95\% critical value is used for thresholding the extrema of the signal. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mbtrim}}, \code{\link{mrecons}}, \code{\link{ext}}. } \keyword{ts} Rwave/man/sig_W_tilda.3.Rd0000644000176200001440000000107713230425465014777 0ustar liggesusers\name{sig_W_tilda.3} \alias{sig_W_tilda.3} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(sig_W_tilda.3) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(sig_W_tilda.3) plot.ts(sig_W_tilda.3) } \keyword{datasets} Rwave/man/mw.Rd0000644000176200001440000000225613230422763013032 0ustar liggesusers\name{mw} \alias{mw} \title{ Dyadic Wavelet Transform } \description{ Dyadic wavelet transform, with Mallat's wavelet. The reconstructed signal preserves locations and values at extrema. } \usage{ mw(inputdata, maxresoln, filtername="Gaussian1", scale=FALSE, plot=TRUE) } \arguments{ \item{inputdata}{ either a text file or an \R object containing data. } \item{maxresoln}{ number of decomposition scales. } \item{filtername}{ name of filter (either Gaussian1 for Mallat and Zhong's wavelet or Haar wavelet). } \item{scale}{ when set, the wavelet transform at each scale is plotted with the same scale. } \item{plot}{ indicate if the wavelet transform at each scale will be plotted. }} \value{ Structure containing \item{original}{ original signal. } \item{Wf}{ dyadic wavelet transform of signal. } \item{Sf}{ multiresolution of signal. } \item{maxresoln}{ number of decomposition scales. } \item{np}{ size of signal. }} \details{ The decomposition goes from resolution 1 to the given maximum resolution. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{dwinverse}}, \code{\link{mrecons}}, \code{\link{ext}}. } \keyword{ts} Rwave/man/morwave.Rd0000644000176200001440000000154213230422763014064 0ustar liggesusers\name{morwave} \alias{morwave} \title{ Ridge Morvelets } \description{ Generates the Morlet wavelets at the sample points of the ridge. } \usage{ morwave(bridge, aridge, nvoice, np, N, w0=2 * pi) } \arguments{ \item{bridge}{ time coordinates of the ridge samples. } \item{aridge}{ scale coordinates of the ridge samples. } \item{nvoice}{ number of different scales per octave. } \item{np}{ number of samples in the input signal. } \item{N}{ size of reconstructed signal. } \item{w0}{ central frequency of the wavelet. }} \value{ Returns the Morlet wavelets at the samples of the time-scale plane given in the input: complex array of Morlet wavelets located on the ridge samples } %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } \seealso{ \code{\link{morwave2}}, \code{\link{gwave}}, \code{\link{gwave2}}. } \keyword{ts} Rwave/man/tfpct.Rd0000644000176200001440000000126113230422763013522 0ustar liggesusers\name{tfpct} \alias{tfpct} \title{ Percentile frequency by frequency } \description{ Compute a percentile of time-frequency representation frequency by frequency. } \usage{ tfpct(input, percent=0.8, plot=TRUE) } \arguments{ \item{input}{ time-frequency transform (output of \code{\link{cwt}} or \code{\link{cgt}}). } \item{percent}{ percentile to be retained. } \item{plot}{ if set to T, displays the values of the energy as a function of the scale (or frequency). }} \value{ 1D array containing the noise estimate. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{tfmean}},\code{\link{tfvar}}. } \keyword{ts} Rwave/man/gsampleOne.Rd0000644000176200001440000000104113230422763014470 0ustar liggesusers\name{gsampleOne} \alias{gsampleOne} \title{ Sampled Identity } \description{ Generate a sampled identity matrix. } \usage{ gsampleOne(node, scale, np) } \arguments{ \item{node}{ location of the reconstruction gabor functions. } \item{scale}{ scale of the gabor functions. } \item{np}{ size of the reconstructed signal. }} \value{ diagonal of the ``sampled'' \eqn{Q_1} term (1D vector) } %\details{} \references{ See discussions in the text of ``Time-Frequency Analysis''. } \seealso{ \code{\link{kernel}}, \code{\link{gkernel}}. } \keyword{ts} Rwave/man/W_tilda.4.Rd0000644000176200001440000000110513230422763014124 0ustar liggesusers\name{W_tilda.4} \alias{W_tilda.4} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.4) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.4) plot.ts(W_tilda.4) } \keyword{datasets} Rwave/man/cgt.Rd0000644000176200001440000000242213230441436013155 0ustar liggesusers\name{cgt} \alias{cgt} \title{ Continuous Gabor Transform } \description{ Computes the continuous Gabor transform with Gaussian window. } \usage{ cgt(input, nvoice, freqstep=(1/nvoice), scale=1, plot=TRUE) } \arguments{ \item{input}{ input signal (possibly complex-valued). } \item{nvoice}{ number of frequencies for which gabor transform is to be computed. } \item{freqstep}{ Sampling rate for the frequency axis. } \item{scale}{ Size parameter for the window. } \item{plot}{ logical variable set to TRUE to display the modulus of the continuous gabor transform on the graphic device. }} \value{ continuous (complex) gabor transform (2D array). } \details{ The output contains the (complex) values of the gabor transform of the input signal. The format of the output is a 2D array (signal\_size x nb\_scales). } \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwt}}, \code{\link{cwtp}}, \code{\link{DOG}} for continuous wavelet transforms. \code{\link{cwtsquiz}} for synchrosqueezed wavelet transform. } \examples{ data(HOWAREYOU) plot.ts(HOWAREYOU) cgtHOWAREYOU <- cgt(HOWAREYOU,70,0.01,100) } \keyword{ts} \section{Warning}{ freqstep must be less than 1/nvoice to avoid aliasing. freqstep=1/nvoice corresponds to the Nyquist limit. } Rwave/man/hurst.est.Rd0000644000176200001440000000267113230422763014347 0ustar liggesusers\name{hurst.est} \alias{hurst.est} \title{ Estimate Hurst Exponent } \description{ Estimates Hurst exponent from a wavelet transform. } \usage{ hurst.est(wspec, range, nvoice, plot=TRUE) } \arguments{ \item{wspec}{ wavelet spectrum (output of \code{\link{tfmean}}) } \item{range}{ range of scales from which estimate the exponent. } \item{nvoice}{ number of scales per octave of the wavelet transform. } \item{plot}{ if set to \code{TRUE}, displays regression line on current plot. }} \value{ complex 1D array of size sigsize. } %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{tfmean}}, \code{\link{wspec.pl}}. } \keyword{ts} \examples{ # White Noise Hurst Exponent: The plots on the top row of Figure 6.8 # were produced by the folling S-commands. These make use of the two # functions Hurst.est (estimation of Hurst exponent from CWT) and # wspec.pl (display wavelet spectrum). # Compare the periodogram and the wavelet spectral estimate. wnoise <- rnorm(8192) plot.ts(wnoise) spwnoise <- fft(wnoise) spwnoise <- Mod(spwnoise) spwnoise <- spwnoise*spwnoise plot(spwnoise[1:4096], log="xy", type="l") lswnoise <- lsfit(log10(1:4096), log10(spwnoise[1:4096])) abline(lswnoise$coef) cwtwnoise <- DOG(wnoise, 10, 5, 1, plot=FALSE) mcwtwnoise <- Mod(cwtwnoise) mcwtwnoise <- mcwtwnoise*mcwtwnoise wspwnoise <- tfmean(mcwtwnoise, plot=FALSE) wspec.pl(wspwnoise, 5) hurst.est(wspwnoise, 1:50, 5) } Rwave/man/signal_W_tilda.1.Rd0000644000176200001440000000111713230425346015461 0ustar liggesusers\name{signal_W_tilda.1} \alias{signal_W_tilda.1} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.1) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.1) plot.ts(signal_W_tilda.1) } \keyword{datasets} Rwave/man/gabor.Rd0000644000176200001440000000152613230431733013475 0ustar liggesusers\name{gabor} \alias{gabor} \title{ Generate Gabor function } \description{ Generates a Gabor for given location and frequency. } \usage{ gabor(sigsize, location, frequency, scale) } \arguments{ \item{sigsize}{ length of the Gabor function. } \item{location}{ position of the Gabor function. } \item{frequency}{ frequency of the Gabor function. } \item{scale}{ size parameter for the Gabor function. See details. }} \value{ complex 1D array of size sigsize. } \details{The size parameter here corresponds to the standard deviation for a gaussian. In the Carmona (1998, eBook ISBN:978008053942) book, equation 3.23 has a different scale factor. } \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{morlet}}. } \examples{ m1 = gabor(1024, 512, 2 * pi, 20 ) plot.ts(Re(m1) ) } \keyword{ts} Rwave/man/vgt.Rd0000644000176200001440000000130313230422763013177 0ustar liggesusers\name{vgt} \alias{vgt} \title{ Gabor Transform on one Voice } \description{ Compute Gabor transform for fixed frequency. } \usage{ vgt(input, frequency, scale, plot=FALSE) } \arguments{ \item{input}{ Input signal (1D array). } \item{frequency}{ frequency at which the Gabor transform is to be computed. } \item{scale}{ frequency at which the Gabor transform is to be computed. } \item{plot}{ if set to TRUE, plots the real part of cgt on the graphic device. }} \value{ 1D (complex) array containing Gabor transform at specified frequency. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{vwt}}, \code{\link{vDOG}}. } \keyword{ts} Rwave/man/signal_W_tilda.7.Rd0000644000176200001440000000115013230422763015464 0ustar liggesusers\name{signal_W_tilda.7} \alias{signal_W_tilda.7} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.7) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.7) plot.ts(signal_W_tilda.7) } \keyword{datasets} Rwave/man/amber7.Rd0000644000176200001440000000104113230424376013555 0ustar liggesusers\name{amber7} \alias{amber7} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(amber7) } \format{A vector containing 7000 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(amber7) plot.ts(amber7) } \keyword{datasets} Rwave/man/dwinverse.Rd0000644000176200001440000000114713230422763014413 0ustar liggesusers\name{dwinverse} \alias{dwinverse} \title{ Inverse Dyadic Wavelet Transform } \description{ Invert the dyadic wavelet transform. } \usage{ dwinverse(wt, filtername="Gaussian1") } \arguments{ \item{wt}{ dyadic wavelet transform } \item{filtername}{ filters used. ("Gaussian1" stands for the filters corresponds to those of Mallat and Zhong's wavlet. And "Haar" stands for the filters of Haar basis. }} \value{ Reconstructed signal } %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mw}}, \code{\link{ext}}, \code{\link{mrecons}}. } \keyword{ts} Rwave/man/gcrcrec.Rd0000644000176200001440000000410213230422763014007 0ustar liggesusers\name{gcrcrec} \alias{gcrcrec} \title{Crazy Climbers Reconstruction by Penalization} \description{ Reconstructs a real-valued signal from ridges found by crazy climbers on a Gabor transform. } \usage{ gcrcrec(siginput, inputgt, beemap, nvoice, freqstep, scale, compr, bstep=5, ptile=0.01, epsilon=0, fast=TRUE, para=5, minnbnodes=3, hflag=FALSE, real=FALSE, plot=2) } \arguments{ \item{siginput}{original signal.} \item{inputgt}{Gabor transform.} \item{beemap}{occupation measure, output of \code{\link{crc}}.} \item{nvoice}{number of frequencies.} \item{freqstep}{sampling step for frequency axis.} \item{scale}{size of windows.} \item{compr}{compression rate to be applied to the ridges.} \item{bstep}{size (in the time direction) of the steps for chaining.} \item{ptile}{threshold of ridge} \item{epsilon}{constant in front of the smoothness term in penalty function.} \item{fast}{if set to TRUE, uses trapezoidal rule to evaluate \eqn{Q_2}.} \item{para}{scale parameter for extrapolating the ridges.} \item{minnbnodes}{minimal number of points per ridge.} \item{hflag}{if set to FALSE, uses the identity as first term in the kernel. If not, uses \eqn{Q_1} instead.} \item{real}{if set to \code{TRUE}, uses only real constraints.} \item{plot}{ \describe{ \item{1}{displays signal,components, and reconstruction one after another.} \item{2}{displays signal, components and reconstruction.} } } } \details{ When \code{ptile} is high, boundary effects may appear. \code{para} controls extrapolation of the ridge. } \value{ Returns a structure containing the following elements: \item{rec}{reconstructed signal.} \item{ordered}{image of the ridges (with different colors).} \item{comp}{2D array containing the signals reconstructed from ridges.} } \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{crc}}, \code{\link{cfamily}}, \code{\link{crcrec}}, \code{\link{scrcrec}}. } \keyword{ts} Rwave/man/signal_W_tilda.3.Rd0000644000176200001440000000111613230424733015461 0ustar liggesusers\name{signal_W_tilda.3} \alias{signal_W_tilda.3} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.3) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.3) plot.ts(signal_W_tilda.3) } \keyword{datasets} Rwave/man/gregrec.Rd0000644000176200001440000000353113230422763014022 0ustar liggesusers\name{gregrec} \alias{gregrec} \title{ Reconstruction from a Ridge } \description{ Reconstructs signal from a ``regularly sampled'' ridge, in the Gabor case. } \usage{ gregrec(siginput, gtinput, phi, nbnodes, nvoice, freqstep, scale, epsilon=0, fast=FALSE, plot=FALSE, para=0, hflag=FALSE, real=FALSE, check=FALSE) } \arguments{ \item{siginput}{ input signal. } \item{gtinput}{ Gabor transform, output of \code{\link{cgt}}. } \item{phi}{ unsampled ridge. } \item{nbnodes}{ number of nodes used for the reconstruction. } \item{nvoice}{ number of different scales per octave } \item{freqstep}{ sampling rate for the frequency axis } \item{scale}{ size parameter for the Gabor function. } \item{epsilon}{ coefficient of the \eqn{Q_2} term in reconstruction kernel } \item{fast}{ if set to T, the kernel is computed using trapezoidal rule. } \item{plot}{ if set to TRUE, displays original and reconstructed signals } \item{para}{ scale parameter for extrapolating the ridges. } \item{hflag}{ if set to TRUE, uses \eqn{Q_1} as first term in the kernel. } \item{real}{ if set to TRUE, uses only real constraints on the transform. } \item{check}{ if set to TRUE, computes \code{\link{cwt}} of reconstructed signal. }} \value{ Returns a list containing: \item{sol}{ reconstruction from a ridge. } \item{A}{ matrix. } \item{lam}{ coefficients of dual wavelets in reconstructed signal. } \item{dualwave}{ array containing the dual wavelets. } \item{gaborets}{ array containing the wavelets on sampled ridge. } \item{solskel}{ Gabor transform of sol, restricted to the ridge. } \item{inputskel}{ Gabor transform of signal, restricted to the ridge. } \item{Q2}{ second part of the reconstruction kernel. }} %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{regrec}}. } \keyword{ts} Rwave/man/c4.Rd0000644000176200001440000000100113230424077012700 0ustar liggesusers\name{C4} \alias{C4} \title{Transient Signal} \description{Transient signal. } \usage{data(C4) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(C4) plot.ts(C4) } \keyword{datasets} Rwave/man/cwtpolar.Rd0000644000176200001440000000300113230422763014227 0ustar liggesusers\name{cwtpolar} \alias{cwtpolar} \title{ Conversion to Polar Coordinates } \description{ Converts one of the possible outputs of the function \code{\link{cwt}} to modulus and phase. } \usage{ cwtpolar(cwt, threshold=0) } \arguments{ \item{cwt}{ 3D array containing the values of a continuous wavelet transform in the format (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice) as in the output of the function \code{\link{cwt}} with the logical flag \code{twodimension} set to FALSE. } \item{threshold}{ value of a level for the absolute value of the modulus below which the value of the argument of the output is set to \eqn{-\pi}{-pi}. }} \value{ Modulus and Argument of the values of the continuous wavelet transform \item{output1}{ 3D array giving the values (in the same format as the input) of the modulus of the input. } \item{output2}{ 3D array giving the values of the argument of the input. }} \details{ The output contains the (complex) values of the wavelet transform of the input signal. The format of the output can be 2D array (signal size \eqn{\times}{x} nb\_scales) 3D array (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice) } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwt}}, \code{\link{DOG}}, \code{\link{cwtimage}}. } \examples{ x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) retChirp <- cwt(chirp, noctave=5, nvoice=12, twoD=FALSE, plot=FALSE) retPolar <- cwtpolar(retChirp) } \keyword{ts} Rwave/man/pixel_8.9.Rd0000644000176200001440000000105313230426171014115 0ustar liggesusers\name{pixel_8.9} \alias{pixel_8.9} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(pixel_8.9) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(pixel_8.9) plot.ts(pixel_8.9) } \keyword{datasets} Rwave/man/zerokernel.Rd0000644000176200001440000000112413230422763014560 0ustar liggesusers\name{zerokernel} \alias{zerokernel} \title{ Reconstruction from Wavelet Ridges } \description{ Generate a zero kernel for reconstruction from ridges. } \usage{ zerokernel(x.inc=1, x.min, x.max) } \arguments{ \item{x.min}{ minimal value of x for the computation of \eqn{Q_2}. } \item{x.max}{ maximal value of x for the computation of \eqn{Q_2}. } \item{x.inc}{ step unit for the computation of the kernel. }} \value{ matrix of the \eqn{Q_2} kernel } %\details{} %\references{} \seealso{ \code{\link{kernel}}, \code{\link{fastkernel}}, \code{\link{gkernel}}, \code{\link{gkernel}}. } \keyword{ts} Rwave/man/d0.Rd0000644000176200001440000000077713230426432012715 0ustar liggesusers\name{D0} \alias{D0} \title{Transient Signal} \description{Transient signal. } \usage{data(D0) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(D0) plot.ts(D0) } \keyword{datasets} Rwave/man/cleanph.Rd0000644000176200001440000000110513230422763014011 0ustar liggesusers\name{cleanph} \alias{cleanph} \title{ Threshold Phase based on Modulus } \description{ Sets to zero the phase of time-frequency transform when modulus is below a certain value. } \usage{ cleanph(tfrep, thresh=0.01, plot=TRUE) } \arguments{ \item{tfrep}{ continuous time-frequency transform (2D array) } \item{thresh}{ (relative) threshold. } \item{plot}{ if set to TRUE, displays the maxima of cwt on the graphic device. }} \value{ thresholded phase (2D array) } %\details{} \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } %\seealso{} \keyword{ts} Rwave/man/tflmax.Rd0000644000176200001440000000111113230422763013667 0ustar liggesusers\name{tflmax} \alias{tflmax} \title{ Time-Frequency Transform Local Maxima } \description{ Computes the local maxima (for each fixed value of the time variable) of the modulus of a time-frequency transform. } \usage{ tflmax(input, plot=TRUE) } \arguments{ \item{input}{ time-frequency transform (real 2D array). } \item{plot}{ if set to T, displays the local maxima on the graphic device. }} \value{ values of the maxima (2D array). } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{tfgmax}}. } \keyword{ts} Rwave/man/plotResult.Rd0000644000176200001440000000127513230422763014564 0ustar liggesusers\name{plotResult} \alias{plotResult} \title{ Plot Dyadic Wavelet Transform Extrema } \description{ Plot extrema of dyadic wavelet transform. } \usage{ plotResult(result, original, maxresoln, scale=FALSE, yaxtype="s") } \arguments{ \item{result}{ result. } \item{original}{ input signal. } \item{maxresoln}{ number of decomposition scales. } \item{scale}{ when set, the extrema at each scale is plotted withe the same scale. } \item{yaxtype}{ y axis type (see \R manual). } } %\value{} %\details{} \references{ See discussions in the text of ``Time-Frequency Analysis''. } \seealso{ \code{\link{plotwt}}, \code{\link{epl}}, \code{\link{wpl}}. } \keyword{ts} Rwave/man/epl.Rd0000644000176200001440000000070213230422763013161 0ustar liggesusers\name{epl} \alias{epl} \title{ Plot Dyadic Wavelet Transform Extrema } \description{ Plot dyadic wavelet transform extrema (output of \code{\link{ext}}). } \usage{ epl(dwext) } \arguments{ \item{dwext}{ dyadic wavelet transform (output of \code{\link{ext}}). }} %\value{} %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mw}}, \code{\link{ext}}, \code{\link{wpl}}. } \keyword{ts} Rwave/man/a0.Rd0000644000176200001440000000077713230423676012721 0ustar liggesusers\name{A0} \alias{A0} \title{Transient Signal} \description{Transient signal. } \usage{data(A0) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(A0) plot.ts(A0) } \keyword{datasets} Rwave/man/RidgeSampling.Rd0000644000176200001440000000125213230422763015127 0ustar liggesusers\name{RidgeSampling} \alias{RidgeSampling} \title{ Sampling Gabor Ridge } \description{ Given a ridge phi (for the Gabor transform), returns a (regularly) subsampled version of length nbnodes. } \usage{ RidgeSampling(phi, nbnodes) } \arguments{ \item{phi}{ ridge (1D array). } \item{nbnodes}{ number of samples. }} \value{ Returns a list containing the discrete values of the ridge. \item{node}{ time coordinates of the ridge samples. } \item{phinode}{ frequency coordinates of the ridge samples. }} \details{ Gabor ridges are sampled uniformly. } \references{ See discussions in the text of "Time-Frequency Analysis''. } \seealso{ \code{\link{wRidgeSampling}}. } \keyword{ts} Rwave/man/amber8.Rd0000644000176200001440000000104313230424353013553 0ustar liggesusers\name{amber8} \alias{amber8} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(amber8) } \format{A vector containing 7000 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(amber8) plot.ts(amber8) } \keyword{datasets} Rwave/man/vdog.Rd0000644000176200001440000000110213230422763013333 0ustar liggesusers\name{vDOG} \alias{vDOG} \title{ DOG Wavelet Transform on one Voice } \description{ Compute DOG wavelet transform at one scale. } \usage{ vDOG(input, scale, moments) } \arguments{ \item{input}{ Input signal (1D array). } \item{scale}{ Scale at which the wavelet transform is to be computed. } \item{moments}{ number of vanishing moments. }} \value{ 1D (complex) array containing wavelet transform at one scale. } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{vgt}}, \code{\link{vwt}}. } \keyword{ts} Rwave/man/YNdiff.Rd0000644000176200001440000000107013230423314013550 0ustar liggesusers\name{YNdiff} \alias{YNdiff} \title{Daily differences of Japanese Yen} \description{Daily differences of \code{\link{YN}}. } \usage{data(YNdiff) } \format{A vector containing 499 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(YNdiff) plot.ts(YNdiff) } \keyword{datasets} Rwave/man/snake.Rd0000644000176200001440000000364413230422763013512 0ustar liggesusers\name{snake} \alias{snake} \title{ Ridge Estimation by Snake Method } \description{ Estimate a ridge from a time-frequency representation, using the snake method. } \usage{ snake(tfrep, guessA, guessB, snakesize=length(guessB), tfspec=numeric(dim(modulus)[2]), subrate=1, temprate=3, muA=1, muB=muA, lambdaB=2 * muB, lambdaA=2 * muA, iteration=1000000, seed=-7, costsub=1, stagnant=20000, plot=TRUE) } \arguments{ \item{tfrep}{ Time-Frequency representation (real valued). } \item{guessA}{ Initial guess for the algorithm (frequency variable). } \item{guessB}{ Initial guess for the algorithm (time variable). } \item{snakesize}{ the length of the initial guess of time variable. } \item{tfspec}{ Estimate for the contribution of the noise to modulus. } \item{subrate}{ Subsampling rate for ridge estimation. } \item{temprate}{ Initial value of temperature parameter. } \item{muA}{ Coefficient of the ridge's derivative in cost function (frequency component). } \item{muB}{ Coefficient of the ridge's derivative in cost function (time component). } \item{lambdaB}{ Coefficient of the ridge's second derivative in cost function (time component). } \item{lambdaA}{ Coefficient of the ridge's second derivative in cost function (frequency component). } \item{iteration}{ Maximal number of moves. } \item{seed}{ Initialization of random number generator. } \item{costsub}{ Subsampling of cost function in output. } \item{stagnant}{ maximum number of steps without move (for the stopping criterion) } \item{plot}{ when set (by default), certain results will be displayed }} \value{ Returns a structure containing: \item{ridge}{1D array (of same length as the signal) containing the ridge.} \item{cost}{1D array containing the cost function.} } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{corona}}, \code{\link{coronoid}}, \code{\link{icm}}, \code{\link{snakoid}}. } \keyword{ts} Rwave/man/cwtth.Rd0000644000176200001440000000277413230422763013545 0ustar liggesusers\name{cwtTh} \alias{cwtTh} \title{Cauchy's wavelet transform} \description{ Compute the continuous wavelet transform with (complex-valued) Cauchy's wavelet. } \usage{cwtTh(input, noctave, nvoice=1, moments, twoD=TRUE, plot=TRUE) } \arguments{ \item{input}{ input signal (possibly complex-valued). } \item{noctave}{ number of powers of 2 for the scale variable. } \item{nvoice}{ number of scales in each octave (i.e. between two consecutive powers of 2). } \item{moments}{ number of vanishing moments. } \item{twoD}{ logical variable set to \code{T} to organize the output as a 2D array (signal size x nb scales), otherwise, the output is a 3D array (signal size x noctave x nvoice). } \item{plot}{ if set to \code{T}, display the modulus of the continuous wavelet transform on the graphic device. }} \value{ \item{tmp}{continuous (complex) wavelet transform.} } \details{ The output contains the (complex) values of the wavelet transform of the input signal. The format of the output can be 2D array (signal size \eqn{\times}{x} nb scales) 3D array (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice) } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{cwt}}, \code{\link{cwtp}}, \code{\link{DOG}}, \code{\link{gabor}}. } \examples{ x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) retChirp <- cwtTh(chirp, noctave=5, nvoice=12, moments=20) } \keyword{ts} Rwave/man/wspec.pl.Rd0000644000176200001440000000067413230422763014144 0ustar liggesusers\name{wspec.pl} \alias{wspec.pl} \title{Log of Wavelet Spectrum Plot} \description{ Displays normalized log of wavelet spectrum. } \usage{wspec.pl(wspec, nvoice) } \arguments{ \item{wspec}{ wavelet spectrum. } \item{nvoice}{ number of voices. } } %\value{} %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{\code{\link{hurst.est}}. } \keyword{ts} \keyword{hplot} Rwave/man/YN.Rd0000644000176200001440000000107513230423405012725 0ustar liggesusers\name{YN} \alias{YN} \title{Logarithms of the Prices of Japanese Yen} \description{Logarithms of the prices of a contract of Japanese yen. } \usage{data(YN) } \format{A vector containing 500 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(YN) plot.ts(YN) } \keyword{datasets} Rwave/man/corona.Rd0000644000176200001440000000357513230422763013675 0ustar liggesusers\name{corona} \alias{corona} \title{ Ridge Estimation by Corona Method } \description{ Estimate a (single) ridge from a time-frequency representation, using the corona method. } \usage{ corona(tfrep, guess, tfspec=numeric(dim(tfrep)[2]), subrate=1, temprate=3, mu=1, lambda=2 * mu, iteration=1000000, seed=-7, stagnant=20000, costsub=1, plot=TRUE) } \arguments{ \item{tfrep}{ Time-Frequency representation (real valued). } \item{guess}{ Initial guess for the algorithm. } \item{tfspec}{ Estimate for the contribution of the noise to modulus. } \item{subrate}{ Subsampling rate for ridge estimation. } \item{temprate}{ Initial value of temperature parameter. } \item{mu}{ Coefficient of the ridge's second derivative in cost function. } \item{lambda}{ Coefficient of the ridge's derivative in cost function. } \item{iteration}{ Maximal number of moves. } \item{seed}{ Initialization of random number generator. } \item{stagnant}{ Maximum number of stationary iterations before stopping. } \item{costsub}{ Subsampling of cost function in output. } \item{plot}{ When set(default), some results will be shown on the display. }} \value{ Returns the estimated ridge and the cost function. \item{ridge}{ 1D array (of same length as the signal) containing the ridge. } \item{cost}{ 1D array containing the cost function. } } \details{ To accelerate convergence, it is useful to preprocess modulus before running annealing method. Such a preprocessing (smoothing and subsampling of modulus) is implemented in \code{\link{corona}}. The parameter subrate specifies the subsampling rate. } \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{icm}},\code{\link{coronoid}},\code{\link{snake}}, \code{\link{snakoid}}. } \keyword{ts} \section{Warning}{ The returned cost may be a large array, which is time consuming. The argument costsub allows subsampling the cost function. } Rwave/man/adjust.length.Rd0000644000176200001440000000103113230422763015147 0ustar liggesusers\name{adjust.length} \alias{adjust.length} \title{ Zero Padding } \description{ Add zeros to the end of the data if necessary so that its length is a power of 2. It returns the data with zeros added if nessary and the length of the adjusted data. } \usage{ adjust.length(inputdata) } \arguments{ \item{inputdata}{ either a text file or an S object containing data. }} \value{ Zero-padded 1D array. } %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } %\seealso{} \keyword{ts} \keyword{ts} Rwave/man/crcrec.Rd0000644000176200001440000000336013230422763013645 0ustar liggesusers\name{crcrec} \alias{crcrec} \title{ Crazy Climbers Reconstruction by Penalization } \description{ Reconstructs a real valued signal from the output of \code{\link{crc}} (wavelet case) by minimizing an appropriate quadratic form. } \usage{ crcrec(siginput, inputwt, beemap, noct, nvoice, compr, minnbnodes=2, w0=2 * pi, bstep=5, ptile=0.01, epsilon=0, fast=FALSE, para=5, real=FALSE, plot=2) } \arguments{ \item{siginput}{ original signal. } \item{inputwt}{ wavelet transform. } \item{beemap}{ occupation measure, output of \code{\link{crc}}. } \item{noct}{ number of octaves. } \item{nvoice}{ number of voices per octave. } \item{compr}{ compression rate for sampling the ridges. } \item{minnbnodes}{ minimal number of points per ridge. } \item{w0}{ center frequency of the wavelet. } \item{bstep}{ size (in the time direction) of the steps for chaining. } \item{ptile}{ relative threshold of occupation measure. } \item{epsilon}{ constant in front of the smoothness term in penalty function. } \item{fast}{ if set to TRUE, uses trapezoidal rule to evaluate $Q_2$. } \item{para}{ scale parameter for extrapolating the ridges. } \item{real}{ if set to TRUE, uses only real constraints. } \item{plot}{ 1: displays signal,components,and reconstruction one after another. 2: displays signal, components and reconstruction. }} \value{ Returns a structure containing the following elements: \item{rec}{ reconstructed signal. } \item{ordered}{ image of the ridges (with different colors). } \item{comp}{ 2D array containing the signals reconstructed from ridges. } } \details{ When ptile is high, boundary effects may appeare. para controls extrapolation of the ridge. } %\references{} \seealso{ \code{\link{crc}}, \code{\link{cfamily}}, \code{\link{scrcrec}}. } \keyword{ts} Rwave/man/sig_W_tilda.4.Rd0000644000176200001440000000107713230425417014775 0ustar liggesusers\name{sig_W_tilda.4} \alias{sig_W_tilda.4} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(sig_W_tilda.4) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(sig_W_tilda.4) plot.ts(sig_W_tilda.4) } \keyword{datasets} Rwave/man/coronoid.Rd0000644000176200001440000000356213230422763014224 0ustar liggesusers\name{coronoid} \alias{coronoid} \title{ Ridge Estimation by Modified Corona Method } \description{ Estimate a ridge using the modified corona method (modified cost function). } \usage{ coronoid(tfrep, guess, tfspec=numeric(dim(tfrep)[2]), subrate=1, temprate=3, mu=1, lambda=2 * mu, iteration=1000000, seed=-7, stagnant=20000, costsub=1, plot=TRUE) } \arguments{ \item{tfrep}{ Estimate for the contribution of the noise to modulus. } \item{guess}{ Initial guess for the algorithm. } \item{tfspec}{ Estimate for the contribution of the noise to modulus. } \item{subrate}{ Subsampling rate for ridge estimation. } \item{temprate}{ Initial value of temperature parameter. } \item{mu}{ Coefficient of the ridge's derivative in cost function. } \item{lambda}{ Coefficient of the ridge's second derivative in cost function. } \item{iteration}{ Maximal number of moves. } \item{seed}{ Initialization of random number generator. } \item{stagnant}{ Maximum number of stationary iterations before stopping. } \item{costsub}{ Subsampling of cost function in output. } \item{plot}{ When set(default), some results will be shown on the display. }} \value{ Returns the estimated ridge and the cost function. \item{ridge}{ 1D array (of same length as the signal) containing the ridge. } \item{cost}{ 1D array containing the cost function. } } \details{ To accelerate convergence, it is useful to preprocess modulus before running annealing method. Such a preprocessing (smoothing and subsampling of modulus) is implemented in \code{\link{coronoid}}. The parameter subrate specifies the subsampling rate. } \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{corona}}, \code{\link{icm}}, \code{\link{snake}}, \code{\link{snakoid}}. } \keyword{ts} \section{Warning}{ The returned cost may be a large array. The argument costsub allows subsampling the cost function. } Rwave/man/cfamily.Rd0000644000176200001440000000354313230441701014024 0ustar liggesusers\name{cfamily} \alias{cfamily} \title{ Ridge Chaining Procedure } \description{ Chains the ridge estimates produced by the function \code{\link{crc}}. } \usage{ cfamily(ccridge, bstep=1, nbchain=100, ptile=0.05) } \arguments{ \item{ccridge}{ unchained ridge set as the output of the function \code{\link{crc}} } \item{bstep}{ maximal length for a gap in a ridge. } \item{nbchain}{ maximal number of chains produced by the function. } \item{ptile}{ relative threshold for the ridges. }} \value{ Returns the results of the chaining algorithm \item{ordered map}{ image containing the ridges (displayed with different colors) } \item{chain}{ 2D array containing the chained ridges, according to the chain data structure\cr chain[,1]: first point of the ridge\cr chain[,2]: length of the chain\cr chain[,3:(chain[,2]+2)]: values of the ridge\cr } \item{nbchain}{ number of chains produced by the algorithm }} \details{ \code{\link{crc}} returns a measure in time-frequency (or time-scale) space. \code{\link{cfamily}} turns it into a series of one-dimensional objects (ridges). The measure is first thresholded, with a relative threshold value set to the input parameter ptile. During the chaining procedure, gaps within a given ridge are allowed and filled in. The maximal length of such gaps is the input parameter bstep. } \references{ See discussion in text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{crc}} for the ridge estimation, and \code{\link{crcrec}}, \code{\link{gcrcrec}} and \code{\link{scrcrec}} for corresponding reconstruction functions. } \examples{ \dontrun{ data(HOWAREYOU) plot.ts(HOWAREYOU) cgtHOWAREYOU <- cgt(HOWAREYOU,70,0.01,100) clHOWAREYOU <- crc(Mod(cgtHOWAREYOU),nbclimb=1000) cfHOWAREYOU <- cfamily(clHOWAREYOU,ptile=0.001) image(cfHOWAREYOU$ordered > 0) } } \keyword{ts} Rwave/man/back1.000.Rd0000644000176200001440000000110313230430614013646 0ustar liggesusers\name{back1.000} \alias{back1.000} \title{Acoustic Returns} \description{Acoustic returns from natural underwater clutter. } \usage{data(back1.000) } \format{A vector containing 7936 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(back1.000) plot.ts(back1.000) } \keyword{datasets} Rwave/man/regrec.Rd0000644000176200001440000000410113230422763013645 0ustar liggesusers\name{regrec} \alias{regrec} \title{ Reconstruction from a Ridge } \description{ Reconstructs signal from a \dQuote{regularly sampled} ridge, in the wavelet case. } \usage{ regrec(siginput, cwtinput, phi, compr, noct, nvoice, epsilon=0, w0=2 * pi, fast=FALSE, plot=FALSE, para=0, hflag=FALSE, check=FALSE, minnbnodes=2, real=FALSE) } \arguments{ \item{siginput}{ input signal. } \item{cwtinput}{ wavelet transform, output of \code{\link{cwt}}. } \item{phi}{ unsampled ridge. } \item{compr}{ subsampling rate for the wavelet coefficients (at scale 1) } \item{noct}{ number of octaves (powers of 2) } \item{nvoice}{ number of different scales per octave } \item{epsilon}{ coefficient of the \eqn{Q_2} term in reconstruction kernel } \item{w0}{ central frequency of Morlet wavelet } \item{fast}{ if set to TRUE, the kernel is computed using trapezoidal rule. } \item{plot}{ if set to TRUE, displays original and reconstructed signals } \item{para}{ scale parameter for extrapolating the ridges. } \item{hflag}{ if set to TRUE, uses \eqn{Q_1} as first term in the kernel. } \item{check}{ if set to TRUE, computes \code{\link{cwt}} of reconstructed signal. } \item{minnbnodes}{ minimum number of nodes for the reconstruction. } \item{real}{ if set to TRUE, uses only real constraints on the transform. }} \value{ Returns a list containing: \item{sol}{ reconstruction from a ridge. } \item{A}{ matrix. } \item{lam}{ coefficients of dual wavelets in reconstructed signal. } \item{dualwave}{ array containing the dual wavelets. } \item{morvelets}{ array containing the wavelets on sampled ridge. } \item{solskel}{ wavelet transform of sol, restricted to the ridge. } \item{inputskel}{ wavelet transform of signal, restricted to the ridge. } \item{Q2}{ second part of the reconstruction kernel. } \item{nbnodes}{ number of nodes used for the reconstruction. }} %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{regrec2}}, \code{\link{ridrec}}, \code{\link{gregrec}}, \code{\link{gridrec}}. } \keyword{ts} Rwave/man/Rwave-internal.Rd0000644000176200001440000000157513230422763015310 0ustar liggesusers\name{Undocumented} \alias{PcaRidgeSampling} \alias{RidgeDist} \alias{RidgeIrregSampling} \alias{RunRec} \alias{SampleGen} \alias{Sausage} \alias{SpecGen} \alias{band} \alias{cgtRadar} \alias{cloudXYZ} \alias{confident} \alias{crcirgrec} \alias{crcirrec} \alias{ddw} \alias{dw} \alias{fftshift} \alias{girregrec} \alias{hescrc} \alias{irregrec} \alias{mbpval} \alias{mcgt} \alias{mnpval} \alias{pcacrc} \alias{pcafamily} \alias{pcamaxima} \alias{pcamorwave} \alias{pcarec} \alias{pcaregrec} \alias{pcaridrec} \alias{pcazeroskeleton} \alias{robustrec} \alias{showRadar} \alias{simplepcarec} \alias{vwtTh} \title{Undocumented Functions in Rwave} \description{ Numerous functions were not documented in the original Swave help files. } %\usage{} %\arguments{} %\value{} %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } %\seealso{} \keyword{ts} Rwave/man/morlet.Rd0000644000176200001440000000146313230431522013701 0ustar liggesusers\name{morlet} \alias{morlet} \title{ Morlet Wavelets } \description{ Computes a Morlet wavelet at the point of the time-scale plane given in the input } \usage{ morlet(sigsize, location, scale, w0=2 * pi) } \arguments{ \item{sigsize}{ length of the output. } \item{location}{ time location of the wavelet. } \item{scale}{ scale of the wavelet. } \item{w0}{ central frequency of the wavelet. }} \value{ Returns the values of the complex Morlet wavelet at the point of the time-scale plane given in the input } \details{ The details of this construction (including the definition formulas) are given in the text. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{gabor}}. } \examples{ m1 = morlet(1024, 512, 20, w0=2 * pi) plot.ts(Re(m1) ) } \keyword{ts} Rwave/man/sig_W_tilda.2.Rd0000644000176200001440000000107713230425520014766 0ustar liggesusers\name{sig_W_tilda.2} \alias{sig_W_tilda.2} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(sig_W_tilda.2) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(sig_W_tilda.2) plot.ts(sig_W_tilda.2) } \keyword{datasets} Rwave/man/gridrec.Rd0000644000176200001440000000325213230422763014023 0ustar liggesusers\name{gridrec} \alias{gridrec} \title{ Reconstruction from a Ridge } \description{ Reconstructs signal from sample of a ridge, in the Gabor case. } \usage{ gridrec(gtinput, node, phinode, nvoice, freqstep, scale, Qinv, epsilon, np, real=FALSE, check=FALSE) } \arguments{ \item{gtinput}{ Gabor transform, output of \code{\link{cgt}}. } \item{node}{ time coordinates of the ridge samples. } \item{phinode}{ frequency coordinates of the ridge samples. } \item{nvoice}{ number of different frequencies. } \item{freqstep}{ sampling rate for the frequency axis. } \item{scale}{ scale of the window. } \item{Qinv}{ inverse of the matrix \eqn{Q} of the quadratic form. } \item{epsilon}{ coefficient of the \eqn{Q_2} term in reconstruction kernel } \item{np}{ number of samples of the reconstructed signal. } \item{real}{ if set to TRUE, uses only constraints on the real part of the transform. } \item{check}{ if set to TRUE, computes \code{\link{cgt}} of reconstructed signal. }} \value{ Returns a list containing the reconstructed signal and the chained ridges. \item{sol}{ reconstruction from a ridge. } \item{A}{ matrix. } \item{lam}{ coefficients of dual gaborlets in reconstructed signal. } \item{dualwave}{ array containing the dual gaborlets. } \item{gaborets}{ array of gaborlets located on the ridge samples. } \item{solskel}{ Gabor transform of sol, restricted to the ridge. } \item{inputskel}{ Gabor transform of signal, restricted to the ridge. }} %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{sridrec}}, \code{\link{gregrec}}, \code{\link{regrec}}, \code{\link{regrec2}}. } \keyword{ts} Rwave/man/back1.220.Rd0000644000176200001440000000110613230430475013662 0ustar liggesusers\name{back1.220} \alias{back1.220} \title{Acoustic Returns} \description{Acoustic returns from an underwater metallic object. } \usage{data(back1.220) } \format{A vector containing 7936 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(back1.220) plot.ts(back1.220) } \keyword{datasets} Rwave/man/signal_W_tilda.9.Rd0000644000176200001440000000111713230425563015472 0ustar liggesusers\name{signal_W_tilda.9} \alias{signal_W_tilda.9} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.9) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.9) plot.ts(signal_W_tilda.9) } \keyword{datasets} Rwave/man/chirpm5db.dat.Rd0000644000176200001440000000106513230430341015017 0ustar liggesusers\name{chirpm5db.dat} \alias{chirpm5db.dat} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(chirpm5db.dat) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ \dontrun{ data(chirpm5db.dat) } } \keyword{datasets} Rwave/man/backscatter.1.000.Rd0000644000176200001440000000112413230423610015313 0ustar liggesusers\name{backscatter.1.000} \alias{backscatter.1.000} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(backscatter.1.000) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(backscatter.1.000) plot.ts(backscatter.1.000) } \keyword{datasets} Rwave/man/noisywave.Rd0000644000176200001440000000106213230426314014421 0ustar liggesusers\name{noisywave} \alias{noisywave} \title{Noisy Gravitational Wave} \description{Noisy gravitational wave. } \usage{data(noisywave) } \format{A vector containing 8192 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(noisywave) plot.ts(noisywave) } \keyword{datasets} Rwave/man/pixel_8.7.Rd0000644000176200001440000000105313230426246014116 0ustar liggesusers\name{pixel_8.7} \alias{pixel_8.7} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(pixel_8.7) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(pixel_8.7) plot.ts(pixel_8.7) } \keyword{datasets} Rwave/man/cwtp.Rd0000644000176200001440000000345113230422763013362 0ustar liggesusers\name{cwtp} \alias{cwtp} \title{Continuous Wavelet Transform with Phase Derivative} \description{ Computes the continuous wavelet transform with (complex-valued) Morlet wavelet and its phase derivative. } \usage{ cwtp(input, noctave, nvoice=1, w0=2 * pi, twoD=TRUE, plot=TRUE) } \arguments{ \item{input}{input signal (possibly complex-valued)} \item{noctave}{number of powers of 2 for the scale variable} \item{nvoice}{number of scales in each octave (i.e., between two consecutive powers of 2).} \item{w0}{central frequency of the wavelet.} \item{twoD}{logical variable set to \code{T} to organize the output as a 2D array (signal size \eqn{\times}{x} nb scales), otherwise, the output is a 3D array (signal size \eqn{\times}{x} noctave \eqn{\times}{x} nvoice).} \item{plot}{if set to \code{TRUE}, display the modulus of the continuous wavelet transform on the graphic device.} } %\details{} \value{ list containing the continuous (complex) wavelet transform and the phase derivative \item{wt}{array of complex numbers for the values of the continuous wavelet transform.} \item{f}{array of the same dimensions containing the values of the derivative of the phase of the continuous wavelet transform.} } \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{cgt}}, \code{\link{cwt}}, \code{\link{cwtTh}}, \code{\link{DOG}} for wavelet transform, and \code{\link{gabor}} for continuous Gabor transform. } \examples{ ## discards imaginary part with error, ## c code does not account for Im(input) x <- 1:512 chirp <- sin(2*pi * (x + 0.002 * (x-256)^2 ) / 16) chirp <- chirp + 1i * sin(2*pi * (x + 0.004 * (x-256)^2 ) / 16) retChirp <- cwtp(chirp, noctave=5, nvoice=12) } \keyword{ts} Rwave/man/smoothwt.Rd0000644000176200001440000000122313230422763014264 0ustar liggesusers\name{smoothwt} \alias{smoothwt} \title{ Smoothing and Time Frequency Representation } \description{ smooth the wavelet (or Gabor) transform in the time direction. } \usage{ smoothwt(modulus, subrate, flag=FALSE) } \arguments{ \item{modulus}{ Time-Frequency representation (real valued). } \item{subrate}{ Length of smoothing window. } \item{flag}{ If set to TRUE, subsample the representation. }} \value{ 2D array containing the smoothed transform. } %\details{} \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } \seealso{ \code{\link{corona}}, \code{\link{coronoid}}, \code{\link{snake}}, \code{\link{snakoid}}. } \keyword{ts} Rwave/man/SVD.Rd0000644000176200001440000000112413230434437013035 0ustar liggesusers\name{SVD} \alias{SVD} \title{ Singular Value Decomposition } \description{ Computes singular value decomposition of a matrix. } \usage{ SVD(a) } \arguments{ \item{a}{ input matrix. }} \value{ a structure containing the 3 matrices of the singular value decomposition of the input. } \details{ \R interface for Numerical Recipes singular value decomposition routine. } \references{ See discussions in the text of \dQuote{Time-Frequency Analysis}. } %\seealso{} \examples{ hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") } X <- hilbert(6) z = SVD(X) z } \keyword{ts} Rwave/man/wRidgeSampling.Rd0000644000176200001440000000153313230422763015320 0ustar liggesusers\name{wRidgeSampling} \alias{wRidgeSampling} \title{ Sampling wavelet Ridge } \description{ Given a ridge \eqn{\phi}{phi} (for the wavelet transform), returns a (appropriately) subsampled version with a given subsampling rate. } \usage{ wRidgeSampling(phi, compr, nvoice) } \arguments{ \item{phi}{ ridge (1D array). } \item{compr}{ subsampling rate for the ridge. } \item{nvoice}{ number of voices per octave. }} \value{ Returns a list containing the discrete values of the ridge. \item{node}{time coordinates of the ridge samples.} \item{phinode}{scale coordinates of the ridge samples.} \item{nbnode}{number of nodes of the ridge samples.} } \details{ To account for the variable sizes of wavelets, the sampling rate of a wavelet ridge is not uniform, and is proportional to the scale. } %\references{} \seealso{ \code{\link{RidgeSampling}}. } \keyword{ts} Rwave/man/check.maxresoln.Rd0000644000176200001440000000072213230422763015467 0ustar liggesusers\name{check.maxresoln} \alias{check.maxresoln} \title{ Verify Maximum Resolution } \description{ Stop when \eqn{2^{maxresoln}} is larger than the signal size. } \usage{ check.maxresoln(maxresoln, np) } \arguments{ \item{maxresoln}{ number of decomposition scales. } \item{np}{ signal size. }} %\value{} %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mw}}, \code{\link{mrecons}}. } \keyword{ts} Rwave/man/gwave.Rd0000644000176200001440000000145413230422763013517 0ustar liggesusers\name{gwave} \alias{gwave} \title{ Gabor Functions on a Ridge } \description{ Generation of Gabor functions located on the ridge. } \usage{ gwave(bridge, omegaridge, nvoice, freqstep, scale, np, N) } \arguments{ \item{bridge}{ time coordinates of the ridge samples } \item{omegaridge}{ frequency coordinates of the ridge samples } \item{nvoice}{ number of different scales per octave } \item{freqstep}{ sampling rate for the frequency axis } \item{scale}{ scale of the window } \item{np}{ size of the reconstruction kernel } \item{N}{ number of complex constraints }} \value{ Array of Gabor functions located on the ridge samples } %\details{} \references{ See discussions in the text of "Time-Frequency Analysis''. } \seealso{ \code{\link{gwave2}}, \code{\link{morwave}}, \code{\link{morwave2}}. } \keyword{ts} Rwave/man/skeleton2.Rd0000644000176200001440000000217213230422763014312 0ustar liggesusers\name{skeleton2} \alias{skeleton2} \title{ Reconstruction from Dual Wavelet } \description{ Computes the reconstructed signal from the ridge in the case of real constraints. } \usage{ skeleton2(cwtinput, Qinv, morvelets, bridge, aridge, N) } \arguments{ \item{cwtinput}{ continuous wavelet transform (as the output of cwt). } \item{Qinv}{ inverse of the reconstruction kernel (2D array). } \item{morvelets}{ array of Morlet wavelets located at the ridge samples. } \item{bridge}{ time coordinates of the ridge samples. } \item{aridge}{ scale coordinates of the ridge samples. } \item{N}{ size of reconstructed signal. }} \value{ Returns a list of the elements of the reconstruction of a signal from sample points of a ridge \item{sol}{reconstruction from a ridge.} \item{A}{matrix of the inner products.} \item{lam}{coefficients of dual wavelets in reconstructed signal. They are the Lagrange multipliers \eqn{\lambda}{lambda}'s of the text.} \item{dualwave}{array containing the dual wavelets.} } %\details{} \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{skeleton}}. } \keyword{ts} Rwave/man/back1.180.Rd0000644000176200001440000000105313230430550013662 0ustar liggesusers\name{back1.180} \alias{back1.180} \title{Acoustic Returns} \description{Acoustic returns from ... } \usage{data(back1.180) } \format{A vector containing 7936 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(back1.180) plot.ts(back1.180) } \keyword{datasets} Rwave/man/pixel_8.8.Rd0000644000176200001440000000105313230426220014107 0ustar liggesusers\name{pixel_8.8} \alias{pixel_8.8} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(pixel_8.8) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(pixel_8.8) plot.ts(pixel_8.8) } \keyword{datasets} Rwave/man/sig_W_tilda.1.Rd0000644000176200001440000000107713230425543014772 0ustar liggesusers\name{sig_W_tilda.1} \alias{sig_W_tilda.1} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(sig_W_tilda.1) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(sig_W_tilda.1) plot.ts(sig_W_tilda.1) } \keyword{datasets} Rwave/man/vecmorlet.Rd0000644000176200001440000000124613230422763014405 0ustar liggesusers\name{vecmorlet} \alias{vecmorlet} \title{ Morlet Wavelets on a Ridge } \description{ Generate Morlet wavelets at specified positions on a ridge. } \usage{ vecmorlet(sigsize, nbnodes, bridge, aridge, w0=2 * pi) } \arguments{ \item{sigsize}{ Signal size. } \item{nbnodes}{ Number of wavelets to be generated. } \item{bridge}{ b coordinates of the ridge samples (1D array of length nbnodes). } \item{aridge}{ a coordinates of the ridge samples (1D array of length nbnodes). } \item{w0}{ Center frequency of the wavelet. }} \value{ 2D (complex) array containing wavelets located at the specific points. } %\details{} %\references{} \seealso{ \code{\link{vecgabor}}. } \keyword{ts} Rwave/man/ext.Rd0000644000176200001440000000150513230422763013203 0ustar liggesusers\name{ext} \alias{ext} \title{ Extrema of Dyadic Wavelet Transform } \description{ Compute the local extrema of the dyadic wavelet transform modulus. } \usage{ ext(wt, scale=FALSE, plot=TRUE) } \arguments{ \item{wt}{ dyadic wavelet transform. } \item{scale}{ flag indicating if the extrema at each resolution will be plotted at the same scale. } \item{plot}{ if set to TRUE, displays the transform on the graphics device. }} \value{ Structure containing: \item{original}{ original signal. } \item{extrema}{ extrema representation. } \item{Sf}{ coarse resolution of signal. } \item{maxresoln}{ number of decomposition scales. } \item{np}{ size of signal. } } %\details{} \references{ See discussions in the text of \dQuote{Practical Time-Frequency Analysis}. } \seealso{ \code{\link{mw}}, \code{\link{mrecons}}. } \keyword{ts} Rwave/man/vecgabor.Rd0000644000176200001440000000123513230422763014173 0ustar liggesusers\name{vecgabor} \alias{vecgabor} \title{ Gabor Functions on a Ridge } \description{ Generate Gabor functions at specified positions on a ridge. } \usage{ vecgabor(sigsize, nbnodes, location, frequency, scale) } \arguments{ \item{sigsize}{ Signal size. } \item{nbnodes}{ Number of wavelets to be generated. } \item{location}{ b coordinates of the ridge samples (1D array of length nbnodes). } \item{frequency}{ frequency coordinates of the ridge samples (1D array of length nbnodes). } \item{scale}{ size parameter for the Gabor functions. }} \value{ size parameter for the Gabor functions. } %\details{} %\references{} \seealso{ \code{\link{vecmorlet}}. } \keyword{ts} Rwave/man/signal_W_tilda.2.Rd0000644000176200001440000000111513230425312015451 0ustar liggesusers\name{signal_W_tilda.2} \alias{signal_W_tilda.2} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(signal_W_tilda.2) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(signal_W_tilda.2) plot.ts(signal_W_tilda.2) } \keyword{datasets} Rwave/man/c0.Rd0000644000176200001440000000100013230424132012663 0ustar liggesusers\name{C0} \alias{C0} \title{Transient Signal} \description{Transient signal. } \usage{data(C0) } \format{A vector containing 1024 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(C0) plot.ts(C0) } \keyword{datasets} Rwave/man/click.Rd0000644000176200001440000000102213230430235013453 0ustar liggesusers\name{click} \alias{click} \title{Dolphin Click Data} \description{Dolphin click data. } \usage{data(click) } \format{A vector containing 2499 observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(click) plot.ts(click) } \keyword{datasets} Rwave/man/W_tilda.9.Rd0000644000176200001440000000110713230422763014133 0ustar liggesusers\name{W_tilda.9} \alias{W_tilda.9} \title{Pixel from Amber Camara} \description{Pixel from amber camara. } \usage{data(W_tilda.9) } \format{A vector containing observations. } \source{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \references{ Carmona, R. A., W. L. Hwang and B Torresani (1998, eBook ISBN:978008053942), eBook ISBN:978008053942) \emph{Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S}, Academic Press, San Diego. } \examples{ data(W_tilda.9) plot.ts(W_tilda.9) } \keyword{datasets} Rwave/man/mbtrim.Rd0000644000176200001440000000213213230422763013672 0ustar liggesusers\name{mbtrim} \alias{mbtrim} \title{ Trim Dyadic Wavelet Transform Extrema } \description{ Trimming of dyadic wavelet transform local extrema, using bootstrapping. } \usage{ mbtrim(extrema, scale=FALSE, prct=0.95) } \arguments{ \item{extrema}{ dyadic wavelet transform extrema (output of \code{\link{ext}}). } \item{scale}{ when set, the wavelet transform at each scale will be plotted with the same scale. } \item{prct}{percentage critical value used for thresholding} } \value{ Structure containing \item{original}{ original signal. } \item{extrema}{ trimmed extrema representation. } \item{Sf}{ coarse resolution of signal. } \item{maxresoln}{ number of decomposition scales. } \item{np}{ size of signal. }} \details{ The distribution of extrema of dyadic wavelet transform at each scale is generated by bootstrap method, and the 95\% critical value is used for thresholding the extrema of the signal. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mntrim}}, \code{\link{mrecons}}, \code{\link{ext}}. } \keyword{ts} Rwave/man/mrecons.Rd0000644000176200001440000000200713230422763014047 0ustar liggesusers\name{mrecons} \alias{mrecons} \title{ Reconstruct from Dyadic Wavelet Transform Extrema } \description{ Reconstruct from dyadic wavelet transform modulus extrema. The reconstructed signal preserves locations and values at extrema. } \usage{ mrecons(extrema, filtername="Gaussian1", readflag=FALSE) } \arguments{ \item{extrema}{ the extrema representation. } \item{filtername}{ filter used for dyadic wavelet transform. } \item{readflag}{ if set to T, read reconstruction kernel from precomputed file. }} \value{ Structure containing \item{f}{ the reconstructed signal. } \item{g}{ reconstructed signal plus mean of original signal. } \item{h}{ reconstructed signal plus coarse scale component of original signal. }} \details{ The reconstruction involves only the wavelet coefficients, without taking care of the coarse scale component. The latter may be added a posteriori. } \references{ See discussions in the text of ``Practical Time-Frequency Analysis''. } \seealso{ \code{\link{mw}}, \code{\link{ext}}. } \keyword{ts} Rwave/DESCRIPTION0000644000176200001440000000365614125127122013053 0ustar liggesusersPackage: Rwave Version: 2.6-0 Date: 2021-09-29 Title: Time-Frequency Analysis of 1-D Signals Authors@R: c(person(given="Rene", family='Carmona', email='rcarmona@princeton.edu', role='aut'), person(given="Bruno", family='Torresani', email='bruno.torresani@cmi.univ-mrs.fr', role='aut'), person(given="Brandon", family='Whitcher', email='bjw34032@users.sourceforge.net', role='ctb'), person(given="Andrea", family='Wang', role='ctb'), person(given="Wen-Liang", family='Hwang', role='ctb'), person(given="Robert", family="Alberts", role='ctb'), person(given="Jonathan M.", family="Lees", role = c("ctb", "cre"), email = "jonathan.lees@unc.edu")) Author: Rene Carmona [aut], Bruno Torresani [aut], Brandon Whitcher [ctb], Andrea Wang [ctb], Wen-Liang Hwang [ctb], Robert Alberts [ctb], Jonathan M. Lees [ctb, cre] Maintainer: Jonathan M. Lees Depends: R (>= 2.14) Description: A set of R functions which provide an environment for the Time-Frequency analysis of 1-D signals (and especially for the wavelet and Gabor transforms of noisy signals). It was originally written for Splus by Rene Carmona, Bruno Torresani, and Wen L. Hwang, first at the University of California at Irvine and then at Princeton University. Credit should also be given to Andrea Wang whose functions on the dyadic wavelet transform are included. Rwave is based on the book: "Practical Time-Frequency Analysis: Gabor and Wavelet Transforms with an Implementation in S", by Rene Carmona, Wen L. Hwang and Bruno Torresani (1998, eBook ISBN:978008053942), Academic Press. License: GPL (>= 2) Copyright: University of California URL: https://carmona.princeton.edu/TFbook/tfbook.html, https://r-forge.r-project.org/projects/rwave/ Packaged: 2021-09-29 14:56:39 UTC; lees Repository: CRAN Date/Publication: 2021-09-29 18:20:02 UTC NeedsCompilation: yes Rwave/src/0000755000176200001440000000000014125077246012135 5ustar liggesusersRwave/src/bee_annealing.c0000644000176200001440000001156213064230076015046 0ustar liggesusers#include /*************************************************************** * $Log: bee_annealing.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ /**************************************************************** * Function: Sbee_annealing: * -------------------------- * Ridges caracterisation with crazy_climber algorithm * * modulus: modulus of the wavelet transform * (coming from learning the noise) * beemap: ridges * c: constant on the temperature schedule * sigsize: signal size * nscale: total number of scales for CWT * (or frequencies for Gabor) * nbbee: number of crazy climbers * iteration: number of moves for each climber * seed: seed for random number generator * bstep: stepsize for moves in b direction * integral: flag; if set to FALSE, the function computes * the "characteristic function" of the ridge; if set to * TRUE, computes the characteristic function, weighted by * the value of the modulus. * chain: flag; if set to TRUE, returns "chained ridges" * ****************************************************************/ #include "Swave.h" void Sbee_annealing(double *smodulus, double *beemap, double *pc, int *psigsize, int *pnscale, int *piteration, int *pseed, int *pbstep, int *pnbbee, int *pintegral, int *pchain, int *flag) { double r, dd, ee; int i, bstep, k, k1, k2, bee; int *a, *b, integral, chain, s, count; int seed, nscale, iteration, sigsize, nbbee, tstep; long idum; double c; double ran1(); chain = *pchain; integral = *pintegral; nbbee = *pnbbee; bstep = *pbstep; nscale = *pnscale; iteration = *piteration; c = *pc; sigsize = *psigsize; seed = *pseed; idum = (long)seed; if(!(a = (int *) R_alloc(iteration, sizeof(int) ))) Rf_error("Memory allocation failed for a in bee_annealing.c \n"); if(!(b = (int *) R_alloc(iteration, sizeof(int) ))) Rf_error("Memory allocation failed for b in bee_annealing.c \n"); /* generation of the random moves of the climbers ----------------------------------------------*/ for(bee = 0; bee < nbbee; bee++) { /* Initialisation */ a[0] = (int)((nscale-1) * ran1(&idum)); b[0] = (int)((sigsize-1) * ran1(&idum)); a[0] = min(nscale-1, a[0]); b[0] = min(sigsize-1, b[0]); a[0] = max(0, a[0]); b[0] = max(0, b[0]); k = b[0] + a[0] * sigsize; /* By Wen 6/5/97 */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; /* beemap[k] = beemap[k] +1;*/ /* Iterations */ for(i =1; i < iteration; i++) { r = (double)ran1(&idum); if (r >= 0.5) b[i] = min(sigsize-1,b[i-1]+bstep); else b[i] = max(0,b[i-1]-bstep); r = (double)ran1(&idum); if (r >= 0.5) a[i] = min(nscale-1,a[i-1]+1); else a[i] = max(0,a[i-1]-1); k1 = b[i] + sigsize * a[i]; k2 = b[i] + sigsize * a[i-1]; dd = smodulus[k1] - smodulus[k2]; /* dd = smodulus[k1] - smodulus[k2] - noise[a[i]] + noise[a[i-1]]; */ if (dd<0) { r = (double)ran1(&idum); ee = exp(dd * log((double)(3.0 + i))/c); if((*flag)==1) ee=exp(dd * log((double)(3.0))/c); /* constant temperature */ if (r>ee) a[i] = a[i-1]; } /* Chaining of the ridges */ if(chain) { count = 1; /* The real move By Wen 6/7/97 */ tstep = b[i] - b[i-1]; if(tstep < 0) tstep = -tstep; while(count < tstep) { /* while(count < bstep) { By Wen 6/7/97 */ if(b[i] - b[i-1] > 0) { k1 = b[i-1] + count + sigsize * a[i]; k2 = b[i-1] + count + sigsize * a[i-1]; /* if(smodulus[k1] - noise[a[i]] > smodulus[k2] - noise[a[i-1]]){ */ if(smodulus[k1] > smodulus[k2]){ k = k1; s = a[i]; } else { k = k2; s = a[i-1]; } } if(b[i] - b[i-1] < 0) { k1 = b[i-1] - count + sigsize * a[i]; k2 = b[i-1] - count + sigsize * a[i-1]; /* if(smodulus[k1] - noise[a[i]] > smodulus[k2] - noise[a[i-1]]) { */ if(smodulus[k1] > smodulus[k2]) { k = k1; s = a[i]; } else { k = k2; s = a[i-1]; } } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } k = b[i] + a[i] * sigsize; if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; } } } Rwave/src/svd.c0000644000176200001440000003161213064230076013071 0ustar liggesusers#include /* NUMERICAL RECIPE */ /****************************************************************/ /* (c) Copyright 1997 */ /* by */ /* Author: Rene Carmona, Andrea Wang, Wen-Liang Hwang */ /* Princeton University */ /* All right reserved */ /****************************************************************/ /* This routine computes the singular value decomposition of a matrix */ /* a= u w v^t. The maxtix U is replaces a on output. The diagonal matrix */ /* of singular values w is output as a vector w[1..n]. The matrix v(not */ /* the transpost v^t) is output as v[1..n][1..n]. m must be greater or */ /* equal to n; if it is smaller, than a should be filled up to square */ /* with zero rows. */ #include "Swave.h" #include "denoise.h" #define SIGN(a,b) ((b) > 0.0 ? fabs(a) : -fabs(a)) static double sqrarg; #define SQR(a) ((sqrarg = (a)) == 0.0 ? 0.0 : sqrarg * sqrarg) static double maxarg1, maxarg2; #define FMAX(a,b) (maxarg1=(a), maxarg2=(b), (maxarg1) > (maxarg2) ? \ (maxarg1) : (maxarg2)) static int iminarg1, iminarg2; #define IMIN(a,b) (iminarg1=(a), iminarg2=(b),(iminarg1) < (iminarg2) ? \ (iminarg1) : (iminarg2)) double pythag(double a, double b) { double absa, absb; absa = fabs(a); absb = fabs(b); if(absa > absb) return (absa * sqrt(1.0 + SQR(absb/absa))); else return (absb == 0.0 ? 0.0 : absb * sqrt(1.0+SQR(absa/absb))); } void svdcmp(double **a, int m, int n, double *w, double **v) { int flag, i, its, j, jj, k, l, nm; double anorm, c, f, g, h, s, scale, x, y, z, *rv1; if(!(rv1 = (double *)R_alloc((n + 1), sizeof(double) ))) Rf_error("Memory allocation failed for rv1 in svd.c \n"); g = scale = anorm = 0.0; /* Householder reduction to bidiagonal form */ for (i = 1; i <= n; i++) { l = i + 1; rv1[i] = scale * g; g = s = scale = 0.0; if(i <= m) { for(k=i;k <= m; k++) scale += fabs(a[k][i]); if(scale) { for(k=i; k <=m;k++) { a[k][i] /= scale; s += a[k][i] * a[k][i]; } f = a[i][i]; g = -SIGN(sqrt(s),f); h = f * g - s; a[i][i] = f-g; for ( j= l; j <= n; j++) { for(s= 0.0, k= i; k<=m; k++) s+= a[k][i] * a[k][j]; f = s/h; for(k=i; k<= m;k++) a[k][j] += f * a[k][i]; } for(k=i;k<=m;k++) a[k][i] *= scale; } } w[i] = scale * g; g = s = scale = 0.0; if(i<= m && i != n) { for (k = l; k <= n; k++) scale += fabs(a[i][k]); if(scale) { for(k= l; k<=n; k++) { a[i][k] /= scale; s += a[i][k] * a[i][k]; } f = a[i][l]; g = -SIGN(sqrt(s),f); h= f*g-s; a[i][l] = f-g; for(k = l; k <= n; k++) rv1[k] = a[i][k]/h; for ( j = l; j <= m; j++) { for (s = 0.0, k= l; k <= n; k++) s += a[j][k] * a[i][k]; for (k = l; k <= n; k++) a[j][k] += s * rv1[k]; } for(k = l; k <= n; k++) a[i][k] *= scale; } } anorm = FMAX(anorm, (fabs(w[i]) + fabs(rv1[i]))); } /* Accumulation of right-hand transformations */ for (i = n; i >= 1; i--) { if (i < n) { if(g) { for (j = l; j <= n; j++) v[j][i] = (a[i][j]/a[i][l])/g; for(j = l; j <= n; j++) { for (s = 0.0, k = l; k <= n; k++) s += a[i][k] * v[k][j]; for(k = l; k <= n; k++) v[k][j] += s * v[k][i]; } } for(j = l; j <= n; j++) v[i][j] = v[j][i] = 0.0; } v[i][i] = 1.0; g= rv1[i]; l = i; } /* Accumulation of left-hand transformations */ for(i = IMIN(m,n); i >= 1; i--) { l = i + 1; g = w[i]; for(j = l; j <= n; j++) a[i][j] = 0.0; if(g) { g = 1.0/g; for ( j = l; j <= n; j++) { for ( s= 0.0, k = l; k <= m; k++) s+= a[k][i] * a[k][j]; f = (s/a[i][i]) * g; for( k = i; k <= m; k++) a[k][j] += f * a[k][i]; } for(j = i; j <= m; j++) a[j][i] *= g; } else for (j = i; j <= m; j++) a[j][i] = 0.0; ++a[i][i]; } /* Diagonalization of bidiagonal form */ for(k = n; k >= 1; k--) { for(its= 1; its <= 30; its++) { flag = 1; for(l=k; l >= 1; l--) { nm = l-1; if((double)(fabs(rv1[l]) + anorm) == (double)anorm) { flag = 0; break; } if((double)(fabs(w[nm]) + anorm) == (double)anorm) break; } if(flag) { c = 0.0; s = 1.0; for(i = l; i <= k; i++) { f = s * rv1[i]; rv1[i] = c * rv1[i]; if ((double)(fabs(f) + anorm) == (double)anorm) break; g = w[i]; h = pythag(f,g); w[i] = h; h = 1.0/h; c = g * h; s = -f * h; for( j = 1; j <= m; j++) { y = a[j][nm]; z = a[j][i]; a[j][nm] = y * c + z * s; a[j][i] = z * c - y * s; } } } z = w[k]; if( l == k) { if ( z < 0.0) { w[k] = -z; for ( j = 1; j <= n; j++) v[j][k] = (-v[j][k]); } break; } if(its == 30) Rf_error("No convergence in 30 SVDCMP iterations"); x = w[l]; nm = k - 1; y = w[nm]; g = rv1[nm]; h = rv1[k]; f = ((y-z) * (y + z) + (g - h) * (g + h))/(2.0*h*y); g = pythag(f,1.0); f= ((x-z) * (x+z) + h * ((y/(f + SIGN(g,f))) - h))/x; c=s = 1.0; for(j = l; j <= nm; j++) { i = j + 1; g = rv1[i]; y = w[i]; h = s * g; g = c * g; z = pythag(f,h); rv1[j] = z; c = f/z; s = h/z; f = x * c + g * s; g = g * c - x * s; h = y * s; y *= c; for ( jj= 1; jj <= n; jj++) { x = v[jj][j]; z = v[jj][i]; v[jj][j] = x * c + z * s; v[jj][i] = z * c - x * s; } z = pythag(f,h); w[j] = z; if(z) { z = 1.0/z; c = f * z; s = h * z; } f = (c * g) + (s * y); x = (c * y) - (s * g); for(jj = 1; jj <= m; jj++) { y = a[jj][j]; z = a[jj][i]; a[jj][j] = y * c + z * s; a[jj][i] = z * c - y * s; } } rv1[l] = 0.0; rv1[k] = f; w[k] = x; } } } /**********************************************************************/ /* Solve AX = B for a vector X, where A is specified by the array */ /* U, w and v as returned by svdcmp. b is the input right-hand side */ /* x is the output solution vector. No input quantities are destroyed */ /* so the routin may be called sequentially with different b's. */ /**********************************************************************/ void svbksb(double **U, double *W, double **V, int m, int n, double *B, double *X) { int jj, j, i; double s, *tmp; if(!(tmp = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for tmp in svd.c \n"); for (j = 1; j <= n; j++) { s = 0.0; if (W[j]) { for(i = 1; i <= m; i++) s += U[i][j] * B[i]; s = s/W[j]; } tmp[j] = s; } for(j=1; j <= n; j++) { s = 0.0; for(jj = 1; jj <= n; jj++) s += V[j][jj] * tmp[jj]; X[j] = s; } } /* solve linear Ax = B by single value decomposition */ void svdecomp_solve(double **a, double *b, double *x, int m, int n, double **w, double ***v) { int i, j; double **A, *W, **V, *B, *X; void double_residue(); if(!((*w) = (double *) R_alloc(n, sizeof(double) ))) Rf_error("Memory allocation failed for (*w) in svd.c \n"); if(!((*v) = (double **)R_alloc( n, sizeof(double *)))) Rf_error("Memory allocation failed for (*v) in svd.c \n"); for(i = 0; i < n; i++) if(!((*v)[i] = (double *) R_alloc(n, sizeof(double) ))) Rf_error("Memory allocation failed for (*v)[] in svd.c \n"); if(!(W = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for W in svd.c \n"); if(!(V = (double **)R_alloc( (n+1), sizeof(double *)))) Rf_error("Memory allocation failed for V in svd.c \n"); if(!(A = (double **)R_alloc( (m+1), sizeof(double *)))) Rf_error("Memory allocation failed for A in svd.c \n"); if(!(B = (double *)R_alloc((m+1), sizeof(double) ))) Rf_error("Memory allocation failed for B in svd.c \n"); if(!(X = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for X in svd.c \n"); for(i = 0; i <= n; i++) if(!(V[i] = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for V[] in svd.c \n"); for(i = 0; i <= m; i++) if(!(A[i] = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for A[] in svd.c \n"); for( i = 0; i < m; i++) { B[i+1] = (double)(b[i]); for(j = 0; j < n; j++) A[i + 1][j + 1] = (double)(a[i][j]); } svdcmp(A,m,n,W,V); svbksb(A,W,V,m,n,B,X); double_residue(A,W,V,m,n,B,X); for( i = 0; i < m; i++) for(j = 0; j < n; j++) a[i][j] = (double)(A[i+1][j+1]); for( i = 0; i < n; i++) for(j = 0; j < n; j++) (*v)[i][j] = (double)(V[i+1][j+1]); for(i = 0; i < n; i++) { (*w)[i] = (double)(W[i + 1]); x[i] = (double)(X[i+1]); } /* residue(a,*w,*v,m,n,b,x); */ /* output_array(a,m,n,"U"); output_array((*v),n,n,"V"); output_signal(b,m,"B"); output_signal(x,n,"X"); output_signal((*w),n,"W"); */ } /* compute the L2 Norm */ void residue(double **a, double *w, double **v, int m, int n, double *b, double *x) { double **tmp, *tmp1; double sum; int i, j, k; if(!(tmp = (double **)R_alloc( m, sizeof(double *)))) Rf_error("Memory allocation failed for tmp in svd.c \n"); if(!(tmp1 = (double *) R_alloc(m, sizeof(double) ))) Rf_error("Memory allocation failed for tmp1 in svd.c \n"); for(i = 0 ; i < m; i++) if(!(tmp[i] = (double *) R_alloc(n, sizeof(double) ))) Rf_error("Memory allocation failed for tmp[] in svd.c \n"); for(i = 0; i < m; i++) for(j = 0; j < n; j++) { tmp[i][j] = 0.0; for(k = 0; k < n; k++) tmp[i][j] = tmp[i][j] + w[k] * a[i][k] * v[j][k]; } for(i = 0; i < m; i++) { tmp1[i] = 0.0; for(k = 0; k < n; k++) tmp1[i] = tmp1[i] + tmp[i][k] * x[k]; } for(i = 0; i < m; i++) tmp1[i] = tmp1[i] - b[i]; sum = 0.0; for(i = 0; i < m; i++) sum = sum + tmp1[i] * tmp1[i]; /* printf("Residule is %g \n",sum); */ } void double_residue(double **a, double *w, double **v, int m, int n, double *b, double *x) { double **tmp, *tmp1; double sum; int i, j, k; if(!(tmp = (double **)R_alloc( (m+1), sizeof(double *)))) Rf_error("Memory allocation failed for tmp in svd.c \n"); if(!(tmp1 = (double *)R_alloc((m+1), sizeof(double) ))) Rf_error("Memory allocation failed for tmp1 in svd.c \n"); for(i = 1 ; i <= m; i++) if(!(tmp[i] = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for tmp[] in svd.c \n"); for(i = 1; i <= m; i++) for(j = 1; j <= n; j++) { tmp[i][j] = 0.0; for(k = 1; k <= n; k++) tmp[i][j] = tmp[i][j] + w[k] * a[i][k] * v[j][k]; } for(i = 1; i <= m; i++) { tmp1[i] = 0.0; for(k = 1; k <= n; k++) tmp1[i] = tmp1[i] + tmp[i][k] * x[k]; } for(i = 1; i <= m; i++) tmp1[i] = tmp1[i] - b[i]; sum = 0.0; for(i = 1; i <= m; i++) sum = sum + tmp1[i] * tmp1[i]; /* printf("Residule is %g \n",sum); */ } /* compute the L2 Norm */ /* void Sresidue(double *a, double *w, double *v, int m, int n, double *b, double *x) { double *tmp, *tmp1; double sum; int i, j, k; int t; if(!(tmp = (double *)malloc(sizeof(double) * m * n))) Rf_error("Memory allocation failed for tmp in svd.c \n"); if(!(tmp1 = (double *)malloc(sizeof(double) * m))) Rf_error("Memory allocation failed for tmp1 in svd.c \n"); for(i = 0; i < m; i++) for(j = 0; j < n; j++) { t = i * n + j; tmp[t] = 0.0; for(k = 0; k < n; k++) tmp[t] = tmp[t] + w[k] * a[i*n+k] * v[j*n+k]; } for(i = 0; i < m; i++) { tmp1[i] = 0.0; for(k = 0; k < n; k++) tmp1[i] = tmp1[i] + tmp[i*n+k] * x[k]; } for(i = 0; i < m; i++) tmp1[i] = tmp1[i] - b[i]; sum = 0.0; for(i = 0; i < m; i++) sum = sum + tmp1[i] * tmp1[i]; printf("Residule is %f \n",sum); free(tmp); free(tmp1); } */ /* Called by Splus */ void Ssvdecomp(double *a, int *pm, int *pn, double *w, double *v) { int m, n; int i, j, k; double **A; double **V; double *W; m = *pm; n = *pn; if(!(A = (double **)R_alloc( (m+1), sizeof(double *)))) Rf_error("Memory allocation failed for A in svd.c \n"); if(!(V = (double **)R_alloc( (n+1), sizeof(double *)))) Rf_error("Memory allocation failed for V in svd.c \n"); if(!(W = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for W in svd.c \n"); for(i = 0; i <= m; i++) if(!(A[i] = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for A[] in svd.c \n"); for(i = 0; i <= n; i++) if(!(V[i] = (double *)R_alloc((n+1), sizeof(double) ))) Rf_error("Memory allocation failed for V[] in svd.c \n"); for(j = 0; j < n; j++) for( i = 0; i < m; i++) A[i + 1][j + 1] = (double)(a[j * m + i]); svdcmp(A,m,n,W,V); for(i = 0,k=0; i < n; i++) for( j = 0; j < m; j++,k++) a[k] = A[j+1][i+1]; for( i = 0; i < n; i++) w[i] = W[i+1]; for( i = 0, k = 0; i < n; i++) for(j = 0; j < n; j++, k++) v[k] = V[j+1][i+1]; } Rwave/src/polint.c0000644000176200001440000000236713064230076013607 0ustar liggesusers#include #include "Swave.h" /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ /* Numeric Recipe of C */ #include "rwkernel.h" #define NRANSI void polint(double xa[], double ya[], int n, double x, double *y, double *dy) { int i,m,ns=1; double den,dif,dift,ho,hp,w; double *c,*d; c=(double *)S_alloc(n,sizeof(double))-1; d=(double *)S_alloc(n,sizeof(double))-1; dif=fabs(x-xa[1]); for (i=1;i<=n;i++) { if ( (dift=fabs(x-xa[i])) < dif) { ns=i; dif=dift; } c[i]=ya[i]; d[i]=ya[i]; } *y=ya[ns--]; for (m=1;m /*************************************************************** * $Log: snakesub2.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * **************************************************************** * Reduction of the size of the snake * ***************************************************************/ #include "Swave.h" void snakesub(rho,rate,snakesize) int rate, snakesize; double *rho; { int i; for(i=0; i< snakesize;i++){ *rho /= (double)rate; /* *rho = floorf(*rho); */ *rho = (double)floor((double)(*rho)); /* printf("rho=%f\n",*rho);*/ rho++; } return; } void snakexpand(rho,rate,snakesize) int rate, snakesize; double *rho; { int i; for(i=0; i< snakesize;i++){ *rho *= (double)rate; /* *rho = floorf(*rho); */ *rho = (double)floor((double)(*rho)); /* printf("rho=%f\n",*rho);*/ rho++; } return; } Rwave/src/rwkernel.h0000644000176200001440000000763013064230076014136 0ustar liggesusers/**************************************************************** * $ Log: kernel.h,v $ * * (c) Copyright 1995 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * University of California, Irvine * * All right reserved * ****************************************************************/ #include "complex.h" #define EPS 1.0e-3 #include #include #include #include #include #ifndef Macintosh #include #include #endif #include #ifndef Macintosh #include #endif #define YES 1 #define NO 0 #define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) #define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) #define STRING_SIZE 256 /************************************************************************** Function declarations: **************************************************************************/ /* In kernel.c ----------*/ fcomplex integrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double w0); void rwkernel(double *ker_r, double *ker_i,int *px_min,int *px_max, int *px_inc, int *plng,double *nodes,double *phi_nodes, int *pnb_nodes,double *pw0,double *pb_start,double *pb_end); void fastkernel(double *ker_r, double *ker_i,int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pw0,double *pb_start,double *pb_end); double rintegrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double w0); void rkernel(double *ker,int *px_min,int *px_max,int *px_inc, int *plng, double *nodes,double *phi_nodes,int *pnb_nodes, double *pw0,double *pb_start,double *pb_end); double maxvalue(double *vector, int length); void hermite_sym(fcomplex *ker,int lng); fcomplex psi(double x,double w0); fcomplex psiprime(double x,double w0); /* In gkernel.c -----------*/ double gintegrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double w0); void gkernel(double *ker, int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pw0,double *pb_start,double *pb_end); void fastgkernel(double *ker,int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pscale,double *pb_start,double *pb_end); double gfunc(double x, double scale); void ghermite_sym(double *ker,int lng); double gprime(double x,double scale); /* In splint2.c ------------*/ void splint2(double xa[], double ya[], double y2a[], int n, double x, double *y, double *yp); /* In spline.c -----------*/ void spline(double x[], double y[], int n, double yp1, double ypn, double y2[]); /* In compinteg.c --------------*/ fcomplex qrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end); fcomplex trapzdmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end, int n); double rqrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end); double rtrapzdmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end, int n); double gqrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double scale,double b_start, double b_end); double gtrapzdmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double scale,double b_start, double b_end, int n); void polint(double xa[], double ya[], int n, double x, double *y, double *dy); Rwave/src/util.c0000644000176200001440000000144713064230076013255 0ustar liggesusers#include #include /**************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ int find2power(n) int n; { long m, m2; m = 0; m2 = 1< /****************************************************************/ /* (c) Copyright 1997 */ /* by */ /* Author: Rene Carmona, Andrea Wang, Wen-Liang Hwang */ /* Princeton University */ /* All right reserved */ /****************************************************************/ /**************************************************************************** * $Log: splridge.c,v $ * Revision 1.1 1994/05/22 01:44:51 bruno * Initial revision * * Revision 1.1 1994/05/22 00:59:26 bruno * Initial revision * ***************************************************************************** * * * This file contains proprietary information * * * ***************************************************************************** * Cubic spline interpolation of the ridge of wavelet transform * * of amplitude and frequency modulated signals * * Modification of the routines spline.c and splint.c * * (numerical Recipes) * * * * y: input vector * * yy: output (interpolated) vector * * rate: subsampling rate * ****************************************************************************/ /* #include #include #include */ #include "Swave.h" void splridge(int rate, double *y, int n, double *yy) { int i,k, x, khi, klo; double p,qn,sig,un,*u,yp1,ypn,a,b,h; double *y2; u=(double *)S_alloc(n-1,sizeof(double)); y2=(double *)S_alloc(n,sizeof(double)); yp1 = ypn =0; if (yp1 > 0.99e30) y2[0]=u[0]=0.0; else { y2[0] = -0.5; u[0]=(3.0/rate)*((y[1]-y[0])/rate-yp1); } for (i=1;i<=n-2;i++) { sig=2.0; p=sig*y2[i-1]+2.0; y2[i]=(sig-1.0)/p; u[i]=(y[i+1]-y[i])/rate - (y[i]-y[i-1])/rate; u[i]=(6.0*u[i]/rate/2.0-sig*u[i-1])/p; } if (ypn > 0.99e30) qn=un=0.0; else { qn=0.5; un=(3.0/rate)*(ypn-(y[n-1]-y[n-2])/rate); } y2[n-1]=(un-qn*u[n-2])/(qn*y2[n-2]+1.0); for (k=n-2;k>=0;k--) y2[k]=y2[k]*y2[k+1]+u[k]; for(x=0;x 1) { k=(khi+klo) >> 1; if (k*rate > x) khi=k; else klo=k; } h=(khi-klo)*rate; if (h == 0.0) Rf_error("Impossible interpolation"); a=(rate*khi-x)/h; b=(x-klo*rate)/h; *yy=a*y[klo]+b*y[khi]+((a*a*a-a)*y2[klo]+(b*b*b-b)*y2[khi])*(h*h)/6.0; yy++; } } Rwave/src/ridge_snakenoid.c0000644000176200001440000003062313064230076015423 0ustar liggesusers#include /*************************************************************** * $Log: ridge_snakoid.c,v $ * **************************************************************** * * * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Ssnakoid: * * ------------------- * * Ridge extraction from annealing, using the snake method * * * * smodulus: modulus smoothed by a window * * cost: cost function * * phi: ridge (scale coordinate) * * rho: ridge(position coordinate) * * lambda: coefficient in front of phi'' in the cost function * * mu: coefficient in front of phi' in the cost function * * lambda2: coefficient in front of rho'' in the cost function* * mu2: coefficient in front of rho' in the cost function * * c: constant on the temperature schedule * * sigsize: signal size * * snakesize: size of the snake (number of points) * * nscale: total number of scales for CWT * * iteration: maximal number of iterations for the annealing * * stagnant: allowed number of consecutive steps without * * move (stopping criterion) * * seed: seed for random number generator * * count: number of iterations * * sub: subsampling rate for ridge extraction * * blocksize: subsampling of the cost function in cost * * blocksize=1 means that the whole cost function * * is returned * * * ****************************************************************/ void Ssnakenoid_annealing(double *cost, double *smodulus, double *phi, double *rho, double *plambda, double *pmu, double *plambda2, double *pmu2, double *pc, int *psigsize, int *psnakesize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize) { int sigsize,snakesize,ncount,iteration; int i,k,up,right,pos,num,a,b,count,costcount,sub; /* int count1=0; */ long idum=-9; int again, tbox, blocksize,smodsize; int nscale, stagnant, recal; double c, lambda, mu, lambda2, mu2; double *bcost, *phi2; double ran, gibbs; double cost1; double temperature, tmp=0; /* FILE *fp; */ int *posmap; double tmp_cost; double der_plus,der_minus,der_sec,der_sec_plus,der_sec_minus; double der_plusB,der_minusB,der_secB,der_sec_plusB,der_sec_minusB; /* Generalities; initializations -----------------------------*/ mu = *pmu; mu2 = *pmu2; lambda = *plambda; lambda2 = *plambda2; stagnant = *pstagnant; nscale = *pnscale; iteration = *piteration; c = *pc; sigsize = *psigsize; snakesize = *psnakesize; idum = (long)(*pseed); sub = *psub; blocksize = *pblocksize; smodsize = *psmodsize; recal = 100000; /* recompute cost function every 'recal' iterations */ if(!(bcost = (double *)S_alloc(blocksize,sizeof(double)))) Rf_error("Memory allocation failed for bcost at snake_annealing.c \n"); if(!(phi2 = (double *)S_alloc(sigsize,sizeof(double)))) Rf_error("Memory allocation failed for phi2 at snake_annealing.c \n"); if(!(posmap = (int *)S_alloc(smodsize * nscale,sizeof(int)))) Rf_error("Memory allocation failed for posmap at snake_annealing.c \n"); tbox = 0; ncount = 0; /* count for cost */ count = 0; /* total count */ temperature = c/log(2. + (double)count); /* Initial temperature */ cost1 = 0; tmp_cost = 0; /* mark the initial positions of snakes */ for(i = 0; i < snakesize; i++) { k = (int)(rho[i]) + smodsize * (int)(phi[i]); posmap[k] = 1; } /* Smooth and subsample the wavelet transform modulus --------------------------------------------------*/ snakesub(rho,sub,snakesize); /* Iterations: -----------*/ while(1) { for(costcount = 0; costcount < blocksize; costcount++) { /* Initialize the cost function ----------------------------*/ if(count == 0) { for(i = 1; i < snakesize-1; i++) { tmp = (double)((phi[i-1]+ phi[i+1] - 2 * phi[i])); tmp_cost = (double)((lambda * tmp * tmp)); tmp = (double)((phi[i] - phi[i+1])); tmp_cost += (double)((mu * tmp * tmp)); tmp = (double)((rho[i-1]+ rho[i+1] - 2 * rho[i])); tmp_cost += (double)((lambda2 * tmp * tmp)); tmp = (double)((rho[i] - rho[i+1])); tmp_cost += (double)((mu2 * tmp * tmp)); a = (int)phi[i]; b= (int)rho[i]; tmp = smodulus[smodsize * a + b]; cost1 -= (tmp * (1.-tmp_cost)); } tmp = (double)((phi[0] - phi[1])); tmp_cost = (double) ((mu * tmp * tmp)); tmp = (double)((rho[0] - rho[1])); tmp_cost += (double) ((mu2 * tmp * tmp)); a = (int)phi[0]; b= (int)rho[0]; tmp = smodulus[smodsize * a + b]; cost1 -= (tmp * (1.-tmp_cost)); a = (int)phi[snakesize-1]; b= (int)rho[snakesize-1]; tmp = smodulus[smodsize * a + b]; cost1 -= tmp; cost[ncount++] = (double)cost1; bcost[0] = (double)cost1; count ++; costcount = 1; Rprintf("Initialisation of cost function done\n"); if(costcount == blocksize) break; } /* Generate potential random move ------------------------------*/ again = YES; while(again) { randomsnaker(snakesize,&num); /* returns between 0 and 4 * snakesize - 1*/ pos = num/4; up = 0; right=0; if(num%4 == 0) up = 1; if(num%4 == 1) up = -1; if(num%4 == 2) right = 1; if(num%4 == 3) right = -1; again = NO; if((((int)phi[pos] == 0) && (up == -1)) || (((int)phi[pos] == (nscale-1)) && (up == 1)) || (((int)rho[pos] == (smodsize-1)) && (right == 1)) || (((int)rho[pos] == 0) && (right == -1)) || (posmap[(int)(rho[pos]+right + (phi[pos]+up) * smodsize)] == 1)) again = YES; /* boundary effects */ } /* Compute corresponding update of the cost function -------------------------------------------------*/ if(inrange(2,pos,snakesize-3)) { der_plus = (double)(phi[pos +1]-phi[pos]); der_minus = (double)(phi[pos] -phi[pos-1]); der_sec = der_plus - der_minus; der_sec_plus = (double)(phi[pos+2] - 2.*phi[pos+1] + phi[pos]); der_sec_minus = (double)(phi[pos-2] - 2.*phi[pos-1] + phi[pos]); der_plusB = (double)(rho[pos +1]-rho[pos]); der_minusB = (double)(rho[pos] -rho[pos-1]); der_secB = der_plusB - der_minusB; der_sec_plusB = (double)(rho[pos+2] - 2.*rho[pos+1] + rho[pos]); der_sec_minusB = (double)(rho[pos-2] - 2.*rho[pos-1] + rho[pos]); a = (int)phi[pos]; b = (int)rho[pos]; tmp_cost = (smodulus[smodsize*a+b]); a = (int)phi[pos] + up; b = (int)rho[pos] + right; tmp_cost -= (smodulus[smodsize*a+b]); tmp = tmp_cost*(-1.+mu*der_plus*der_plus+lambda*der_sec*der_sec +mu2*der_plusB*der_plusB+lambda2*der_secB*der_secB); tmp_cost = mu*(1. - 2.*up*der_plus); tmp_cost += 4.*lambda*(1.-up*der_sec); tmp_cost += mu2*(1. - 2.*right*der_plusB); tmp_cost += 4.*lambda2*(1.-right*der_secB); a = (int)phi[pos] + up; b = (int)rho[pos] + right; tmp += (tmp_cost*smodulus[smodsize*a+b]); tmp_cost = mu*(1. + 2.*up*der_minus); tmp_cost += 2.*lambda*(up*der_sec_minus +1.); tmp_cost += mu2*(1. + 2.*right*der_minusB); tmp_cost += 2.*lambda2*(right*der_sec_minusB +1.); a = (int)phi[pos-1]; b = (int)rho[pos-1]; tmp += (tmp_cost*smodulus[smodsize*a+b]); tmp_cost = 2.*lambda*(up*der_sec_plus +1.); tmp_cost += 2.*lambda2*(right*der_sec_plusB +1.); a = (int)phi[pos+1]; b = (int)rho[pos+1]; tmp += (tmp_cost*smodulus[smodsize*a+b]); } if(inrange(2,pos,snakesize-3) == NO) { if(pos == 0) { der_plus = (double)(phi[pos +1]-phi[pos]); der_sec_plus = (double)(phi[pos+2] - 2.*phi[pos+1] + phi[pos]); der_plusB = (double)(rho[pos +1]-rho[pos]); der_sec_plusB = (double)(rho[pos+2] - 2.*rho[pos+1] + rho[pos]); a = (int)phi[pos] + up; b = (int)rho[pos] + right; tmp_cost = smodulus[smodsize*a+b]; a = (int)phi[pos]; b = (int)rho[pos]; tmp_cost -= smodulus[smodsize*a+b]; tmp = tmp_cost*(-1.+mu*der_plus*der_plus + mu2*der_plusB*der_plusB); a = (int)phi[pos] + up; b = (int)rho[pos] + right; tmp_cost = mu*(1. - 2.*up*der_plus); tmp_cost += mu2*(1. - 2.*right*der_plusB); tmp += (tmp_cost*smodulus[smodsize*a+b]); a = (int)(phi[pos+1]); b = (int)(rho[pos+1]); tmp_cost = lambda*(1. + 2.*up*der_sec_plus); tmp_cost += lambda2*(1. + 2.*right*der_sec_plusB); tmp += (tmp_cost*smodulus[smodsize*a+b]); } else if(pos == (snakesize-1)) { der_minus = (double)(phi[pos] -phi[pos-1]); der_sec_minus = (double)(phi[pos-2] - 2.*phi[pos-1] + phi[pos]); der_minusB = (double)(rho[pos] -rho[pos-1]); der_sec_minusB = (double)(rho[pos-2] - 2.*rho[pos-1] + rho[pos]); a = (int)phi[pos] + up; b = (int)rho[pos] + right; tmp_cost = smodulus[smodsize*a+b]; a = (int)phi[pos]; b = (int)rho[pos]; tmp_cost -= smodulus[smodsize*a+b]; tmp = -tmp_cost; a = (int)(phi[pos-1]); b=(int)(rho[pos-1]); tmp_cost = mu*(1. +2.*up*der_minus); tmp_cost += mu2*(1. +2.*right*der_minusB); tmp_cost += lambda*(1.+2*up*der_sec_minus); tmp_cost += lambda2*(1.+2*right*der_sec_minusB); tmp += (tmp_cost*smodulus[smodsize*a+b]); } } /* To move or not to move: that's the question -------------------------------------------*/ if(tmp < (double)0.0) { posmap[(int)(rho[pos] + smodsize * phi[pos])] = 0; phi[pos] += up; rho[pos] += right; /* good move */ posmap[(int)(rho[pos] + smodsize * phi[pos])] = 1; cost1 += tmp; tbox = 0; } else { gibbs = exp(-tmp/temperature); ran = ran1(&idum); if(ran < gibbs) { posmap[(int)(rho[pos] + smodsize * phi[pos])] = 0; phi[pos] += up; rho[pos] += right; /* adverse move */ posmap[(int)(rho[pos] + smodsize * phi[pos])] = 1; cost1 += tmp; tbox = 0; } tbox ++; if(tbox >= stagnant) { cost[ncount++] = (double)cost1; *pcount = ncount; /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) REprintf( "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ /* if(sub != 1){ splsnake(sub, rho-1, phi-1, snakesize, phi2-1); Rprintf("interpolation done\n"); for(i=0;i= iteration) { cost[ncount++] = (double)cost1; *pcount = ncount; /* Write cost function to a file -----------------------------*/ /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) REprintf( "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge ---------------------------------*/ /* if(sub !=1){ splsnake(sub, rho-1, phi-1, snakesize, phi2-1); Rprintf("interpolation done\n"); for(i=0;i /*************************************************************** * $Log: cwt_maxima.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #define MAX(x,y) ((x)>(y) ? (x) : (y)) #include "Swave.h" #include "denoise.h" /**************************************************************** * function Scwt_gmax * compute the global maximum of cwt for fixed position * * input: cwt * output: cwt global maxima at fixed b * nrow,ncol: parameters of the cwt *****************************************************************/ void Scwt_gmax(input, output, pnrow, pncol, posvector) double *input, *output; int *pnrow, *pncol, *posvector; { int nrow, ncol, i, j; int pos; double tmp; nrow = *pnrow; ncol = *pncol; for(i = 0; i < nrow; i++) { tmp = -99999999.0; pos = -1; for(j = 0; j < ncol; j++) { tmp = MAX(tmp, input[j * nrow + i]); if(tmp == input[j * nrow + i]) pos = j; } posvector[i] = pos; output[pos * nrow + i] = tmp; } } /**************************************************************** * function Scwt_mridge * compute the local maxima of cwt for fixed position * * input: cwt * output: cwt global maxima at fixed b * nrow,ncol: parameters of the cwt *****************************************************************/ void Scwt_mridge(input, output, pnrow, pncol) double *input, *output; int *pnrow, *pncol; { int nrow, ncol, i, j; nrow = *pnrow; ncol = *pncol; for(i = 0; i < nrow; i++) { if(input[i] > input[nrow + i]) output[i] = input[i]; if(input[(ncol-1) * nrow + i] > input[(ncol-2) * nrow + 1]) output[(ncol-1) * nrow + i] = input[(ncol-1) * nrow + i]; for(j = 1; j < ncol-1; j++) { if(((input[j * nrow + i] > input[(j+1) * nrow + i]) && (input[j * nrow + i] >= input[(j-1) * nrow + i])) || ((input[j * nrow + i] > input[(j-1) * nrow + i]) && (input[j * nrow + i] >= input[(j+1) * nrow + i]))) output[j * nrow + i] = input[j * nrow + i]; } } } Rwave/src/pca_family.c0000644000176200001440000003044113064230076014400 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * function Stf_pcaridge * compute the local maxima along the minor direction of pca * * input: tf * output: tf local maxima * orientmap : orientation of pca * nrow,ncol: parameters of the cwt *****************************************************************/ void Stf_pcaridge(input, output, pnrow, pncol, orientmap) double *input, *output; int *pnrow, *pncol; int *orientmap; { int nrow, ncol, i, j,k; int dir; nrow = *pnrow; ncol = *pncol; for(i = 1; i < nrow-1; i++) { for(j = 1; j < ncol-1; j++) { k = j * nrow + i; dir = orientmap[k]; if(dir == 1) { /* minor direction at dir == 3 */ if(((input[k] > input[(j+1) * nrow + i]) && (input[k] >= input[(j-1) * nrow + i])) || ((input[k] > input[(j-1) * nrow + i]) && (input[k] >= input[(j+1) * nrow + i]))) output[k] = input[k]; } if(dir == 3) { /* minor direction at dir == 1 */ if(((input[k] > input[j * nrow + (i+1)]) && (input[k] >= input[j * nrow + (i-1)])) || ((input[k] > input[j * nrow + (i-1)]) && (input[k] >= input[j * nrow + (i+1)]))) output[k] = input[k]; } if(dir == 2) { /* minor direction at dir == 4 */ if(((input[k] > input[(j+1) * nrow + (i-1)]) && (input[k] >= input[(j-1) * nrow + (i+1)])) || ((input[k] > input[(j-1) * nrow + (i+1)]) && (input[k] >= input[(j+1) * nrow + (i-1)]))) output[k] = input[k]; } if(dir == 4) { /* minor direction at dir == 2 */ if(((input[k] > input[(j+1) * nrow + (i+1)]) && (input[k] >= input[(j-1) * nrow + (i-1)])) || ((input[k] > input[(j-1) * nrow + (i-1)]) && (input[k] >= input[(j+1) * nrow + (i+1)]))) output[k] = input[k]; } } } } /******************************************************************* * dir == 1 along x, dir == 2, along x=y, dir == 3 along y, dir ==4 * along x=-y *******************************************************************/ /* Three majors direction of dir going downwards and left */ void previous_a_b(int a,int b,int dir, int *a0,int *b0,int *a1,int *b1,int *a2,int *b2) { if(dir == 1) { *a0 = a; *b0 = b-1; *a1 = a-1; *b1 = b-1; *a2 = a+1; *b2 = b-1; } if(dir == 3) { *a0 = a-1; *b0 = b; *a1 = a-1; *b1 = b-1; *a2 = a-1; *b2 = b+1; } if(dir == 2) { *a0 = a-1; *b0 = b-1; *a1 = a-1; *b1 = b; *a2 = a; *b2 = b-1; } if(dir == 4) { *a0 = a-1; *b0 = b+1; *a1 = a-1; *b1 = b; *a2 = a; *b2 = b+1; } } /* Three major directions of dir going upwards or right */ void next_a_b(int a,int b,int dir, int *a0,int *b0,int *a1,int *b1,int *a2,int *b2) { if(dir == 1) { *a0 = a; *b0 = b+1; *a1 = a-1; *b1 = b+1; *a2 = a+1; *b2 = b+1; } if(dir == 3) { *a0 = a+1; *b0 = b; *a1 = a+1; *b1 = b-1; *a2 = a+1; *b2 = b+1; } if(dir == 2) { *a0 = a+1; *b0 = b+1; *a1 = a+1; *b1 = b; *a2 = a; *b2 = b+1; } if(dir == 4) { *a0 = a+1; *b0 = b-1; *a1 = a+1; *b1 = b; *a2 = a; *b2 = b-1; } } /**************************************************************** * Function: pca_orderedmap_thresholded * --------- * Organizes the thresholded chains into an image whose * size is the same as that of the time-frequency * transform * * orderedmap: image containing the ridges * sigsize: input signal size * nscale: number of scales (or frequencies) of the transform * nbchain: number of ridges * chain: array containing the ridges *****************************************************************/ void pca_orderedmap_thresholded(double *orderedmap,int sigsize,int nscale, int *chain,int nbchain) { int id, i, j, k; int a, b, count, chnlng; for(i = 0; i < sigsize; i++) for(j = 0; j < nscale; j++) { k = i + j * sigsize; orderedmap[k] = 0.0; } for(id = 0; id < nbchain; id++) { k = id; chnlng = chain[k]; k += nbchain; a = chain[k]; k += nbchain; b = chain[k]; count = 1; while((count <= chnlng)) { orderedmap[b + a * sigsize] = (double)(id + 1); k += nbchain; a = chain[k]; k += nbchain; b = chain[k]; count++; } } return; } /**************************************************************** * Function: pca_chain_thresholded * --------- * Check the length of chained ridges, and threshold them * * mridge: fixed time local maxima of transform (output of * Scwt_mridge * sigsize: input signal size * nscale: number of scales (or frequencies) of the transform * nbchain: number of ridges * chain: array containing the ridges; the first element * contains the starting point of the ridge, the * second contains the ridge length, and the other * are the values of the ridge * id: pointer containing the indes of the considered ridge * threshold: minimal value of transform modulus considered * on a ridge *****************************************************************/ void pca_chain_thresholded(double *mridge,int sigsize,int *chain,int *id, int nbchain,double threshold, int bstep) { int k, k1, a, b; int count; int kstart, kend; int chnlng; /* look for actual beginning of the chain */ k = (*id)-1; chnlng = chain[k]; k += nbchain; kstart = k; /* beginning of the chain */ a = chain[k]; k += nbchain; b = chain[k]; k1 = b + sigsize * a; count = 1; while((count <= chnlng)&&(mridge[k1]<(double)threshold)) { k += nbchain; kstart = k; a = chain[k]; k += nbchain; b = chain[k]; k1 = b + sigsize * a; count++; } /* Invalid chain (not enough energy) */ if(count > chnlng) { k = (*id)-1; chain[k] = -1; count = 0; while(count <= chnlng) { k += nbchain; chain[k] = -1; k += nbchain; chain[k] = -1; count++; } (*id)--; return; } /* move to the end of the chain */ while(count < chnlng){ k+= nbchain; k+= nbchain; count ++; } kend = k; b = chain[k]; k-= nbchain; a=chain[k]; k1 = b + sigsize * a; /* look for actual end of the chain */ while(mridge[k1] 0.000001) && (orderedmap[k] == 0.0)) { found = YES; /* backwarding: looking for previous points of the chain ----------------------------------------------------- */ while(found){ found = NO; previous_a_b(a,b,dir,&a0,&b0,&a1,&b1,&a2,&b2); if(inrange(0,a0,nscale-1) &&inrange(0,b0,sigsize-1)) { k1 = b0 + sigsize * a0; dir = orientmap[k1]; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; b = b0; a = a0; } } /* if (found == NO) { if(inrange(0,a1,nscale-1) &&inrange(0,b1,sigsize-1)) { k1 = b1 + sigsize * a1; dir = orientmap[k1]; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; b = b1; a = a1; } } } if(found == NO) { if(inrange(0,a2,nscale-1) &&inrange(0,b2,sigsize-1)) { k1 = b2 + sigsize * a2; dir = orientmap[k1]; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; b= b2; a= a2; } } } */ } /* forwarding ---------- */ id ++; if(id >= nbchain) { Rprintf("Nb of chains > reserved number %d. Returned. \n",nbchain); return; } count = 1; found = YES; while(found) { chain[(id-1)+count*nbchain] = a; count++; if(count/2 > maxchnlng) Rf_error("Longer than max chain length. Returned. \n"); chain[(id-1)+count*nbchain]= b; count++; k= b + sigsize * a; dir = orientmap[k]; next_a_b(a,b,dir,&a0,&b0,&a1,&b1,&a2,&b2); orderedmap[k] =(double)(id); found = NO; if(inrange(0,a0,nscale-1) && inrange(0,b0,sigsize-1)) { k1 = b0 + sigsize * a0; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; orderedmap[k1] =(double)(id); a = a0; b = b0; } } if(found == NO) { if(inrange(0,a1,nscale-1) && inrange(0,b1,sigsize-1)) { k1 = b1 + sigsize * a1; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; orderedmap[k1] =(double)(id); a = a1; b = b1; } } } if(found == NO) { if(inrange(0,a2,nscale-1) && inrange(0,b2,sigsize-1)) { k1 = b2 + sigsize * a2; if((mridge[k1]>0.000001)&&(orderedmap[k1]==0.0)) { found = YES; orderedmap[k1] =(double)(id); a = a2; b = b2; } } } } chain[(id-1)]= (count-1)/2; /* printf("number of chain %d with lng %d \n",id,chain[(id-1)]); */ /* Threshold and chain the ridges ------------------------------ */ pca_chain_thresholded(mridge,sigsize,chain,&id, nbchain,threshold,bstep); } } } /* Generate the image of the chains -------------------------------- */ pca_orderedmap_thresholded(orderedmap,sigsize,nscale,chain,nbchain); Rprintf("There are %d chains. \n", id); *pnbchain = id; return; } Rwave/src/splint2.c0000644000176200001440000000332613064230076013671 0ustar liggesusers#include #include /*************************************************************** * $Log: splint2.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "rwkernel.h" /*************************************************************** * Function: splint2 * --------- * Cubic spline interpolation (modified from Numerical * Recipes, in order to incorporate the computation * of the first derivative). * * xa,xb: arrays containing the x and y values at the nodes * ya2: second derivative. * x: value at which the function is to be estimated. * y: value of the function at point x. * yp: derivative of the function at point x. ***************************************************************/ void splint2(double xa[], double ya[], double y2a[], int n, double x, double *y, double *yp) { int klo,khi,k; double h,b,a; klo=1; khi=n; while (khi-klo > 1) { k=(khi+klo) >> 1; if (xa[k] > x) khi=k; else klo=k; } h=xa[khi]-xa[klo]; if (h == 0.0) { Rprintf("Bad xa input to routine splint2 \n"); /* exit(1); */ return; } a=(xa[khi]-x)/h; b=(x-xa[klo])/h; *y=a*ya[klo]+b*ya[khi]+((a*a*a-a)*y2a[klo]+(b*b*b-b)*y2a[khi])*(h*h)/6.0; *yp = (ya[khi]-ya[klo] - ((3*a*a -1)*y2a[klo] - (3*b*b -1)*y2a[khi])*h*h/6)/h; } Rwave/src/denoise.h0000644000176200001440000002734213064230076013735 0ustar liggesusers/**************************************************************** * $ Log: denoise.h,v $ * * (c) Copyright 1994 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * University of California, Irvine * * All right reserved * ****************************************************************/ /************************************************************************** Type definitions: wave WT **************************************************************************/ #include "complex.h" /************************************************************************** * Function declarations: **************************************************************************/ /* In FFT.c --------*/ void double_fft(double *Or,double *Oi,double *Ir,double *Ii, int isize,int isign); /* In four1.c ----------*/ void four1(double data[],int nn,int isign); /* In cwt_maxima.c ---------------*/ void Scwt_gmax(double *input, double *output, int *pnrow, int *pncol, int *posvector); void Scwt_mridge(double *input, double *output, int *pnrow, int *pncol); /* In cwt_phase.c --------------*/ void morlet_frequencyph(double cf,double scale,double *w, double *wd,int isize); void normalization(double *Oreal, double *Oimage, double *Odreal, double *Odimage, int cwtlength); void f_function(double *Oreal, double *Oimage, double *Odreal, double *Odimage, double *f, double cf,int inputsize,int nbvoice, int nboctave); void Scwt_phase(double *input, double *Oreal, double *Oimage, double *f, int *pnboctave, int *pnbvoice, int *pinputsize, double *pcenterfrequency); void w_reassign(double *Oreal, double *Oimage, double *Odreal, double *Odimage, double *squeezed_r, double *squeezed_i, double cf, int inputsize,int nbvoice,int nboctave); void Scwt_squeezed(double *input, double *squeezed_r, double *squeezed_i, int *pnboctave, int *pnbvoice, int *pinputsize, double *pcenterfrequency); /* In cwt_morlet.c ---------------*/ void multi(double *Ri1, double *Ii1, double *Ri2, double *Or, double *Oi, int isize); void morlet_frequency(double cf,double scale,double *w,int isize); void morlet_time(double *pcf, double *pscale, int *pb, double *w_r, double *w_i, int *pisize); //void morlet_time(double *pcf, double *pscale, int *pb, // fcomplex *w, int *pisize); void vmorlet_time(double *pcf,double *pscale, int *b, double *w_r, double *w_i,int *pisize, int *pnbnode); void Scwt_morlet_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, double *pcenterfrequency); void Scwt_morlet(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,double *pcenterfrequency); void Svwt_morlet(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, double *pcenterfrequency); /* In cwt_thierry.c ----------------*/ void thierry_frequency(int M,double scale,double *w,int isize); void Scwt_thierry_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, int *pM); void Scwt_thierry(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,int *pM); void Svwt_thierry(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, int *pM); /* In cwt_DOG.c ------------*/ void DOG_frequency(int M,double scale,double *w,int isize); void Scwt_DOG_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, int *pM); void Scwt_DOG(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,int *pM); void Svwt_DOG(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, int *pM); /* In icm.c --------*/ void Sridge_icm(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, int *psigsize, int *pnscale, int *piteration,int *pcount, int *psub, int *psmodsize); /* In gabor.c ----------*/ void gabor_frequency(double sigma,double frequency,double *w,int isize); void Sgabor(double *input, double *Oreal, double *Oimage, int *pnbfreq, double *pfreqstep, int *pinputsize, double *pscale); void Svgabor(double *input,double *Oreal,double *Oimage,double *pfreq, int *pinputsize,double *pscale); void vgabor_time(double *frequency,double *pscale, int *b, double *g_r, double *g_i,int *pisize, int *pnbnode); /* In randomwalker.c -----------------*/ double ran1(long *idum); void randomwalker(int sigsize,int *num); void randomsnaker(int sigsize,int *num); void randomwalker2(int sigsize,int *num, long *seed); /* In randomwalker.c -----------------*/ double oldran1(long *idum); /* In smoothwt.c -------------*/ void smoothwt(double *wt, double *swt, int sigsize, int nbscale, int windowlength); void smoothwt1(double *wt, double *swt, int sigsize, int nbscale, int windowlength); void smoothwt2(double *wt, double *swt, int sigsize, int nbscale, int windowlength, int *smodsize); void Smodulus_smoothing(double *modulus, double *smodulus, int *psigsize, int *psmodsize, int *pnscale, int *psubrate); void Ssmoothwt(double *smodulus,double * modulus, int *psigsize, int *pnscale, int *psubrate, int *pflag); /* In splridge.c -------------*/ void splridge(int rate, double *y, int n, double *yy); /* In splsnake.c -------------*/ void splsnake(int rate, double *x, double *y, int n, double *yy); /* In snakesub.c -------------*/ void snakesub(double *rho,int rate,int snakesize); void snakexpand(double *rho,int rate,int snakesize); /* In ridge_annealing.c --------------------*/ void Sridge_annealing(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, double *pc, int *psigsize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize); /* In ridge_coronoid.c -------------------*/ void Sridge_coronoid(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, double *pc, int *psigsize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize); /* In snake_annealing.c --------------------*/ void Ssnake_annealing(double *cost, double *smodulus, double *phi, double *rho, double *plambda, double *pmu, double *plambda2, double *pmu2, double *pc, int *psigsize, int *psnakesize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize); /* In multiply.c -------------*/ void multiply(double *Ri1, double *Ii1, double *Ri2, double *Ii2, double *Or,double *Oi, int isize); /* In spline.c -----------*/ void spline(double x[], double y[], int n, double yp1, double ypn, double y2[]); /* In splint.c -----------*/ void splint(double xa[], double ya[], double y2a[], int n, double x, double *y); /* In splint2.c ------------*/ void splint2(double xa[], double ya[], double y2a[], int n, double x, double *y, double *yp); /* In Util_denoising.c -------------------*/ int find2power(int n); /******************* edit by xian Mon 14 Dec 2009 09:14:33 PM MST ****** void error(char *s); ******************** edit by xian *****/ /* In bee_annealing.c ------------------*/ void Sbee_annealing(double *smodulus, double *beemap, double *pc, int *psigsize, int *pnscale, int *piteration, int *pseed, int *pbstep, int *pnbbee, int *pintegral, int *pchain, int *flag); /* In ridrep.c -----------*/ void ridrep(double *signal,double *transform,double *phi,int length, int width, int bmin, int bmax, int amin, int amax,char *filename); void snakerep(double *signal,double *transform,double *phi,double *rho, int nb_nodes,int length,int width, int bmin, int bmax, int amin, int amax,char *filename); void marsrep(double *signal,double *transform,double *phi, int length, int width, int b_start, int b_end, int bmin, int bmax, int amin, int amax,char *filename); /* In delog.c ----------*/ void delog(double *phi, double *phi2, int A, int nvoice, int B); void delog_inv(double *phi, double *phi2, int A, int nvoice, int B); /* In initialization.c -------------------*/ void initialization(int *b_start , int *b_end,int *nitermax, double *a_0, int *rate); /* In ridrecon.c ------------- void ridrecon(double *ridge, double *skel,double *signal, wave *W, int start, int end, double omega); */ /* In variance.c -------------*/ double variance(double *signal, int length); /* In normalize.c --------------*/ void normalize(double *signal, double norm, int length); void dnormalize(double *signal, double norm, int length); /* In V_pot.c ----------*/ void V_pot(double *modulus, double *V, int B, int A); /* In clean.c ----------*/ void fclean(double *array, int length); void dclean(double *array, int length); void iclean(int *array, int length); /* In power_law.c --------------*/ void power_law(double *V, double alpha, double cst, int nscale, int nvoice); /* In ridge_rec.c --------------*/ void Sridge_rec(double *chain, double *recsig, double *gabor, int *pnbchain, int *psigsize, int *pnfreq); /* In crazy_family.c -----------------*/ void Scrazy_family(double *ridgemap,double *orderedmap,int *chain, int *pnbchain,int *psigsize,int *pnscale,int *pbstep,double *pthreshold); void orderedmap_thresholded(double *orderedmap,int sigsize,int nscale, int *chain,int nbchain); void chain_thresholded(double *mridge,int sigsize,int *chain,int *id, int nbchain,double threshold, int bstep); void reordering(int *chain, int sigsize, int nbchain); /* In transpose.c --------------*/ void transpose(double *inmat, double *outmat, int length1, int length2); void itranspose(int *inmat, int *outmat, int length1, int length2); void dtranspose(double *inmat, double *outmat, int length1, int length2); /* in simul.c --------- */ void local_mean(double *mean, double *s, int np ); double gasdev(long *idum); double variance(double *s, int np ); double denominator(double *Wf, int np ); double numerator(double *Wf, int resoln, int np ); void normal_histo( double ***histo, int max_resoln, int sample_size ); void bootstrap_histo(double ***histo, double *s, int max_resoln, int sample_size ); void normal_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ); void bootstrap_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ); void nthresh_compute(double *nthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ); void bthresh_compute(double *bthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ); double p_value(double T, double **histo, int resoln, int histo_size ); void compute_pval_average(double *pval, double **p, int max_resoln, int np, int num_of_windows, int window_size ); /* in qcksrt.c ----------- */ void qcksrt(int n,double arr[]); /* in WV.c ------- */ void freq_parity(double frequency,double *win,double *wout, int isize,int sign); void WV_freq_mult(double frequency,double *Ri,double *Ii, double *Ro, double *Io,int isize); void WV(double *input, double *Oreal,double *Oimage,int *pnbfreq, double *pfreqstep,int *pinputsize); /* in optimize.c ------------- */ void Lpnorm(double *norm, double *p, double *Rmat, double *Imat, int *length, int *width); void entropy(double *entr, double *Rmat, double *Imat, int *length, int *width); Rwave/src/splsnake.c0000644000176200001440000000623713064230076014122 0ustar liggesusers#include /****************************************************************/ /* (c) Copyright 1997 */ /* by */ /* Author: Rene Carmona, Andrea Wang, Wen-Liang Hwang */ /* Princeton University */ /* All right reserved */ /****************************************************************/ /**************************************************************************** * $Log: splsnake.c,v $ ***************************************************************************** * * * This file contains proprietary information * * * ***************************************************************************** * Cubic spline interpolation of the ridge of wavelet transform * * of amplitude and frequency modulated signals * * Modification of the routines spline.c and splint.c * * (numerical Recipes) * * * * y: input vector * * yy: output (interpolated) vector * * rate: subsampling rate * ****************************************************************************/ #include "Swave.h" /*************************************************************************** * n: number of elements of the snake * rate: subsampling rate for the wavelet transform (b direction) * ***************************************************************************/ void splsnake(rate, x, y, n, yy) int rate,n; double *x, *y, *yy; { int i,k, khi, klo, ilo, ihi; double p,qn,sig,un,*u,yp1,ypn,a,b,h; double *y2; u=(double *)S_alloc(n,sizeof(double)); y2=(double *)S_alloc(n+1,sizeof(double)); yp1 = ypn =0; if (yp1 > 0.99e30) y2[1]=u[1]=0.0; else { y2[1] = -0.5; u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1); } for (i=2;i<=n-1;i++) { sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]); p=sig*y2[i-1]+2.0; y2[i]=(sig-1.0)/p; u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]); u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p; } if (ypn > 0.99e30) qn=un=0.0; else { qn=0.5; un=(3.0/(x[n]-x[n-1]))*(ypn-(y[n]-y[n-1])/(x[n]-x[n-1])); } y2[n]=(un-qn*u[n-1])/(qn*y2[n-1]+1.0); for (k=n-1;k>=1;k--){ y2[k]=y2[k]*y2[k+1]+u[k]; } /* Interpolation */ ilo = (int)(x[1])*rate; ihi = (int)(x[n])*rate; for(i=ilo;i 1) { k=(khi+klo) >> 1; if (x[k]*rate > (double)i) khi=k; else klo=k; } h=(x[khi]-x[klo])*rate; if (h == 0.0) Rf_error("Impossible interpolation"); a=(rate*x[khi]-i)/h; b=(i-x[klo]*rate)/h; yy[i]=a*y[klo]+b*y[khi]+((a*a*a-a)*y2[klo]+(b*b*b-b)*y2[khi])*(h*h)/6.0; } return; } Rwave/src/crazy_family.c0000644000176200001440000002164113064230076014767 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ /*************************************************************** * * * * * Bug fix by Tom Price 2007, t0mpr1c3@gmail.com * * * * * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Scrazy_family * --------- * Organize the output of the crazy climber algorithm into * a series of connected ridges. * * ridgemap: output of the crazy climber algorithm * sigsize: input signal size * nscale: number of scales (or frequencies) of the transform * nbchain: number of ridges * chain: array containing the ridges; the first element * contains the starting point of the ridge, the * second contains the ridge length, and the other * are the values of the ridge * id: pointer containing the indes of the considered ridge * threshold: minimal value of transform modulus considered * on a ridge *****************************************************************/ void Scrazy_family(double *ridgemap,double *orderedmap,int *chain, int *pnbchain,int *psigsize,int *pnscale, int *pbstep,double *pthreshold) { int bstep, nscale, sigsize, nbchain; int i, j, k, id, count, a, b, found, k1; double *mridge; double threshold; threshold = *pthreshold; bstep = *pbstep; nscale = *pnscale; sigsize = *psigsize; nbchain = *pnbchain; if(!(mridge = (double *)S_alloc(sigsize * nscale, sizeof(double)))) Rf_error("Memory allocation failed for mridge in crazy_family.c \n"); /* Compute local maxima of modulus (for fixed b) -------------------------------------------- */ Scwt_mridge(ridgemap,mridge,psigsize,pnscale); id = 0; /* Start looking for ridges as connected curves -------------------------------------------- */ for(i = 0; i < sigsize; i+= bstep) { for(j = 0; j < nscale; j++) { b = i; a = j; k = b + sigsize * a; if((mridge[k] > 0.000001) && (orderedmap[k] == 0.0)) { found = YES; /* backwarding: looking for previous points of the chain ----------------------------------------------------- */ while(found && (b > 0)) { found = NO; b = b-1; k1 = b + sigsize * max(a-1, 0); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; a = max(a-1,0); } else { k1 = b + sigsize * max(a, 0); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; } else { k1 = b + sigsize * min(a+1, nscale-1); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; a = min(a+1,nscale-1); } } } } /* forwarding ---------- */ id ++; if(id > nbchain) { Rprintf("Nb of chains > reserved number. Increase the nbchain. \n"); return; } b = b+1; k = b + sigsize * a; chain[(id-1)] = b; chain[(id-1) + nbchain]= a; count = 2; found = YES; while(found) { orderedmap[k] =(double)(id); found = NO; b = min(b+1, sigsize-1); k1 = b + sigsize * max(a-1, 0); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; a = max(a-1,0); } else { k1 = b + sigsize * max(a, 0); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; } else { k1 = b + sigsize * min(a+1, nscale-1); if((mridge[k1] > 0.000001) && (orderedmap[k1] == 0.0)) { found = YES; a = min(a+1,nscale-1); } } } if(found) { k = b + sigsize * a; chain[(id -1) + nbchain * count] = a; count ++; } } /* Threshold and chain the ridges ------------------------------ */ chain_thresholded(mridge,sigsize,chain,&id,nbchain,threshold,bstep); } } } /* Generate the image of the chains -------------------------------- */ orderedmap_thresholded(orderedmap,sigsize,nscale,chain,nbchain); /* Order the output according to the chosen data structure ------------------------------------------------------- */ reordering(chain, sigsize, nbchain); Rprintf("There are %d chains. \n", id); *pnbchain = id; return; } /**************************************************************** * Function: orderedmap_thresholded * --------- * Organizes the thresholded chains into an image whose * size is the same as that of the time-frequency * transform * * orderedmap: image containing the ridges * sigsize: input signal size * nscale: number of scales (or frequencies) of the transform * nbchain: number of ridges * chain: array containing the ridges *****************************************************************/ void orderedmap_thresholded(double *orderedmap,int sigsize,int nscale, int *chain,int nbchain) { int id, i, j, k; int a, b; for(i = 0; i < sigsize; i++) for(j = 0; j < nscale; j++) { k = i + j * sigsize; orderedmap[k] = 0.0; } for(id = 0; id < nbchain; id++) { k = id; b = chain[k]; k += nbchain; a = chain[k]; while((a != -1)) { orderedmap[b + a * sigsize] = (double)(id + 1); b++; k += nbchain; a = chain[k]; } } return; } /**************************************************************** * Function: chain_thresholded * --------- * Check the length of chained ridges, and threshold them * * mridge: fixed time local maxima of transform (output of * Scwt_mridge * sigsize: input signal size * nscale: number of scales (or frequencies) of the transform * nbchain: number of ridges * chain: array containing the ridges; the first element * contains the starting point of the ridge, the * second contains the ridge length, and the other * are the values of the ridge * id: pointer containing the indes of the considered ridge * threshold: minimal value of transform modulus considered * on a ridge *****************************************************************/ void chain_thresholded(double *mridge,int sigsize,int *chain,int *id, int nbchain,double threshold, int bstep) { int i, k, k1, a, b; int count, lng; int bstart, astart, bend, aend, oldbstart; int chnlng; /* look for actual beginning of the chain */ k = (*id)-1; b = chain[k]; k += nbchain; a = chain[k]; k1 = b + sigsize * a; while((chain[k] != -1) && (mridge[k1] < (double)threshold)) { k += nbchain; a = chain[k]; b ++; k1 = b + sigsize * a; } /* Invalid chain (not enough energy) */ if(chain[k] == -1) { chnlng = sigsize + 2; k = (*id)-1; for(i = 0; i < chnlng; i++) { chain[k] = -1; k += nbchain; } (*id)--; return; } astart = a; bstart = b; /* move along the non-thresholded chain */ while((b bstart ) { b--; k-= nbchain; } /* end of code inserted for bug fix */ a=chain[k]; k1 = b + sigsize * a; /* look for actual end of the chain */ while(mridge[k1] < threshold) { k -= nbchain; a = chain[k]; b--; k1 = b + sigsize * a; } aend=a; bend=b; /* shift */ oldbstart = chain[(*id)-1]; chain[(*id)-1]=bstart; lng = bend-bstart+1; if(lng <= bstep) { (*id) --; return; } b = (bstart-oldbstart); for(count = 1; count < lng; count++){ b ++; k = (*id)-1 + b * nbchain; chain[(*id)-1 + count * nbchain] = chain[k]; } b++; k = (*id) - 1 + count * nbchain; while((b < (sigsize+bstart-oldbstart)) && ((int)(chain[k]) != -1)) { chain[k] = -1; b++; k += nbchain; } return; } /**************************************************************** * Function: reordering * --------- * Organizes chain[] according to the chosen data structure *****************************************************************/ void reordering(int *chain,int sigsize,int nbchain) { int i,j,cnt; for(i=0; i0)&&(chain[i+j*nbchain]==-1)) j--; while((j>0)&&(chain[i+j*nbchain]!=-1)){ chain[i+(j+1)*nbchain]=chain[i+j *nbchain]; j--; cnt++; } chain[i+nbchain] = cnt; } return; } Rwave/src/dau_wave.h0000644000176200001440000000167113064230076014077 0ustar liggesusers #define NMIN 2 #define NMAX 10 /****************************************************************************/ #define max( a, b ) ( (a) > (b) ? (a) : (b) ) #define min( a, b ) ( (a) < (b) ? (a) : (b) ) #define minus1to( n ) ( ( (n) % 2 == 0 ) ? (1) : -1 ) #define STRING_SIZE 256 /**************************** * Global Variables * ****************************/ extern double *a, **c; extern int NW; extern int *twoto; /**************************** // already in dyadic.h * Structure Definition * typedef struct { int lb; int ub; int size; } bound; ****************************/ /****************************************************************************/ int open_read( void ); int compute_a( void ); double phi( double x ); double psi( double x ); void init_twoto( int max_resoln ); void init_phi_array( double **phi_array, int max_resoln ); void init_psi_array( double **psi_array, int max_resoln ); Rwave/src/cwt_thierry.c0000644000176200001440000001620613064230076014642 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" /*************************************************************** * Function: thierry_frequency: * --------- * Generates a Thierry Paul wavelet in the frequency domain. * The wavelet is centered at the origin, and normalized so * that psi(0) =1/sqrt(2 pi) * * w: wavelet * scale: scale of the wavelet * isize: window size * M: number of vanishing moments ***************************************************************/ void thierry_frequency(int M,double scale,double *w,int isize) { double tmp; int i; for(i = 0; i < isize; i++) { tmp = (double)(scale * (double)i * (double)M/(double)isize); *w = exp(-tmp) * pow(tmp,(double)M); w++; } return; } /***************************************************************** * function: Scwt_thierry_r * Continuous wavelet transform : * * input: (real-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pcenterfrequency: centralfrequency of Morlet wavelet ******************************************************************/ void Scwt_thierry_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, int *pM) { int nboctave, nbvoice, i, j, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M= *pM; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri2 in cwt_morlet.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_morlet.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_morlet.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_morlet.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_morlet.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)input[i]; Ii[i] = 0.0; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); thierry_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /***************************************************************** * function: Scwt_thierry * Continuous wavelet transform : * * input: (a priori complex-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pM: number of vanishing moments ******************************************************************/ void Scwt_thierry(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,int *pM) { int nboctave, nbvoice, i, j, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M = *pM; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; /********* edit by xian, Mon 14 Dec 2009 09:19:33 PM MST ****** Changing from malloc(sizeof(double) * inputsize) to R_alloc() ******************** edit by xian *****/ if(!(Ri2 = (double *) R_alloc((size_t) inputsize, sizeof(double)) )) Rf_error("Memory allocation failed for Ri2 in cwt_thierry.c \n"); if(!(Ri1 = (double *) R_alloc((size_t) inputsize, sizeof(double)) )) Rf_error("Memory allocation failed for Ri1 in cwt_thierry.c \n"); if(!(Ii1 = (double *) R_alloc((size_t) inputsize, sizeof(double)) )) Rf_error("Memory allocation failed for Ii1 in cwt_thierry.c \n"); if(!(Ri = (double *) R_alloc((size_t) inputsize, sizeof(double)) )) Rf_error("Memory allocation failed for Ri in cwt_thierry.c \n"); if(!(Ii = (double *) R_alloc((size_t) inputsize, sizeof(double)) )) Rf_error("Memory allocation failed for Ii in cwt_thierry.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); thierry_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /*************************************************************** * Function: Svwt_thierry: * --------- * Computes the continuous wavelet transform of input * signal with Morlet wavelet, a fixed scale a * * Rinput, Iinput: real and imaginary parts of the signal * Oreal, Oimage: real and imaginary parts of the cwt. ***************************************************************/ void Svwt_thierry(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, int *pM) { int i, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M = *pM; a = *pa; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc((size_t) inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_morlet.c \n"); if(!(Ri1 = (double *) R_alloc((size_t) inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_morlet.c \n"); if(!(Ii1 = (double *) R_alloc((size_t) inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_morlet.c \n"); if(!(Ri = (double *) R_alloc((size_t) inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_morlet.c \n"); if(!(Ii = (double *) R_alloc((size_t) inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_morlet.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); thierry_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,2); } Rwave/src/choldc.c0000644000176200001440000002100213064230076013521 0ustar liggesusers#include /*************************************************************** * $Log: cholde.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ /* Numeric Recipe of C */ #include "Swave.h" #include "dyadic.h" #ifndef _NR_UTILS_H_ #define _NR_UTILS_H_ #define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg) #define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg) #define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\ (dmaxarg1) : (dmaxarg2)) #define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\ (dminarg1) : (dminarg2)) #define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\ (maxarg1) : (maxarg2)) #define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\ (minarg1) : (minarg2)) #define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\ (lmaxarg1) : (lmaxarg2)) #define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\ (lminarg1) : (lminarg2)) #define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\ (imaxarg1) : (imaxarg2)) #define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\ (iminarg1) : (iminarg2)) #define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) #if defined(__STDC__) || defined(ANSI) || defined(NRANSI) /* ANSI */ void nrRf_error(char error_text[]); double *vector(long nl, long nh); int *ivector(long nl, long nh); unsigned char *cvector(long nl, long nh); unsigned long *lvector(long nl, long nh); double *dvector(long nl, long nh); double **matrix(long nrl, long nrh, long ncl, long nch); double **dmatrix(long nrl, long nrh, long ncl, long nch); int **imatrix(long nrl, long nrh, long ncl, long nch); double **submatrix(double **a, long oldrl, long oldrh, long oldcl, long oldch, long newrl, long newcl); double **convert_matrix(double *a, long nrl, long nrh, long ncl, long nch); double ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh); void free_vector(double *v, long nl, long nh); void free_ivector(int *v, long nl, long nh); void free_cvector(unsigned char *v, long nl, long nh); void free_lvector(unsigned long *v, long nl, long nh); void free_dvector(double *v, long nl, long nh); void free_matrix(double **m, long nrl, long nrh, long ncl, long nch); void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch); void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch); void free_submatrix(double **b, long nrl, long nrh, long ncl, long nch); void free_convert_matrix(double **b, long nrl, long nrh, long ncl, long nch); void free_f3tensor(double ***t, long nrl, long nrh, long ncl, long nch, long ndl, long ndh); #else /* ANSI */ /* traditional - K&R */ void nrRf_error(); double *vector(); double **matrix(); double **submatrix(); double **convert_matrix(); double ***f3tensor(); double *dvector(); double **dmatrix(); int *ivector(); int **imatrix(); unsigned char *cvector(); unsigned long *lvector(); void free_vector(); void free_dvector(); void free_ivector(); void free_cvector(); void free_lvector(); void free_matrix(); void free_submatrix(); void free_convert_matrix(); void free_dmatrix(); void free_imatrix(); void free_f3tensor(); #endif /* ANSI */ #endif /* _NR_UTILS_H_ */ /*****************************************************************************/ /* choldc, cholsl */ /* ludcmp, lubksb */ /*****************************************************************************/ void double_choldc(double **a, int n, double p[]) { int i,j,k; double sum; for (i=1;i<=n;i++) { for (j=i;j<=n;j++) { for (sum=a[i][j],k=i-1;k>=1;k--) sum -= a[i][k]*a[j][k]; if (i == j) { if (sum <= 0.0) Rprintf("choldc failed"); p[i]=sqrt(sum); } else a[j][i]=sum/p[i]; } } } /*****************************************************************************/ /* cholde : double precision with C language array format */ /*****************************************************************************/ void choldc(double **a, int n, double p[]) { double *P; int i; /* if(!(A = (double **)(malloc(sizeof(double *) * (n+1))))) Rf_error("Memory allocation failed for A in choldc.c \n"); */ if(!(P = (double *)(R_alloc((n+1), sizeof(double) )))) Rf_error("Memory allocation failed for P in choldc.c \n"); /* for(i = 0; i <= n; i++) { if(!(A[i] = (double *)(malloc(sizeof(double) * (n+1))))) Rf_error("Memory allocation failed for A in choldc.c \n"); } */ for(i = 0; i < n; i++) { P[i+1] = (double)(p[i]); /* for(j = 0; j =1;k--) sum -= a[i][k]*x[k]; x[i]=sum/p[i]; } for (i=n;i>=1;i--) { for (sum=x[i],k=i+1;k<=n;k++) sum -= a[k][i]*x[k]; x[i]=sum/p[i]; } } void cholsl(double **a, int n, double p[], double b[], double x[]) { double *P; int i; double *B, *X; /* if(!(A = (double **)(malloc(sizeof(double *) * (n+1))))) Rf_error("Memory allocation failed for A in choldc.c \n"); */ if(!(P = (double *)(R_alloc((n+1), sizeof(double) )))) Rf_error("Memory allocation failed for P in choldc.c \n"); if(!(B = (double *)(R_alloc((n+1), sizeof(double) )))) Rf_error("Memory allocation failed for B in choldc.c \n"); if(!(X = (double *)(R_alloc((n+1), sizeof(double) )))) Rf_error("Memory allocation failed for X in choldc.c \n"); /* for(i = 0; i <= n; i++) { if(!(A[i] = (double *)(malloc(sizeof(double) * (n+1))))) Rf_error("Memory allocation failed for A in choldc.c \n"); } */ for(i = 0; i < n; i++) { P[i+1] = (double)(p[i]); X[i+1] = (double)(x[i]); B[i+1] = (double)(b[i]); /* for(j = 0; j big) big=temp; if (big == 0.0) Rprintf("Singular matrix in routine ludcmp"); vv[i]=1.0/big; } for (j=1;j<=n;j++) { for (i=1;i= big) { big=dum; imax=i; } } if (j != imax) { for (k=1;k<=n;k++) { dum=a[imax][k]; a[imax][k]=a[j][k]; a[j][k]=dum; } *d = -(*d); vv[imax]=vv[j]; } indx[j]=imax; if (a[j][j] == 0.0) a[j][j]=TINY; if (j != n) { dum=1.0/(a[j][j]); for (i=j+1;i<=n;i++) a[i][j] *= dum; } } } #undef TINY #undef NRANSI /*****************************************************************************/ void lubksb(double **a, int n, int *indx, double b[]) { int i,ii=0,ip,j; double sum; for (i=1;i<=n;i++) { ip=indx[i]; sum=b[ip]; b[ip]=b[i]; if (ii) for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j]; else if (sum) ii=i; b[i]=sum; } for (i=n;i>=1;i--) { sum=b[i]; for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j]; b[i]=sum/a[i][i]; } } Rwave/src/cwt_dog.c0000644000176200001440000001553713064230076013733 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" /*************************************************************** * Function: DOG_frequency: * --------- * Generates a DOG wavelet in the frequency domain. * The wavelet is centered at the origin, and normalized so * that psi(0) =1/sqrt(2 pi) * * w: wavelet * scale: scale of the wavelet * isize: window size * M: number of vanishing moments ***************************************************************/ void DOG_frequency(int M,double scale,double *w,int isize) { double tmp, cst; int i; cst = exp(-(double)M*(1.-log((double)M)))/2.; for(i = 0; i < isize; i++) { tmp = (double)(scale * (double)i * sqrt((double)M)/(double)isize); *w = exp(-tmp*tmp/2.)*pow(tmp,(double)M)/cst; w++; } return; } /***************************************************************** * function: Scwt_DOG_r * Continuous wavelet transform : * * input: (real-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pcenterfrequency: centralfrequency of Morlet wavelet ******************************************************************/ void Scwt_DOG_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, int *pM) { int nboctave, nbvoice, i, j, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M= *pM; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_DOG.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_DOG.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_DOG.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_DOG.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_DOG.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)input[i]; Ii[i] = 0.0; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); DOG_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /***************************************************************** * function: Scwt_DOG * Continuous wavelet transform : * * input: (a priori complex-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pM: number of vanishing moments ******************************************************************/ void Scwt_DOG(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,int *pM) { int nboctave, nbvoice, i, j, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M = *pM; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_DOG.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_DOG.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_DOG.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_DOG.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_DOG.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); DOG_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /*************************************************************** * Function: Svwt_DOG: * --------- * Computes the continuous wavelet transform of input * signal with Morlet wavelet, a fixed scale a * * Rinput, Iinput: real and imaginary parts of the signal * Oreal, Oimage: real and imaginary parts of the cwt. ***************************************************************/ void Svwt_DOG(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, int *pM) { int i, inputsize, M; double a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; M = *pM; a = *pa; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_DOG.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_DOG.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_DOG.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_DOG.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_DOG.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); DOG_frequency(M,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); } Rwave/src/cwt_morlet.c0000644000176200001440000002412613064230076014456 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" /*************************************************************** * Function: multi: * --------- * Multiplication of 2 vectors in the Fourier domain; the * first one is complex-valued, as well as the output; the * second one is real-valued. * * Ri1, Ii1: first input vector. * Ri2: second input vector (real). * Or, Oi: output vector. * isize: length of the vectors. ***************************************************************/ void multi(double *Ri1, double *Ii1, double *Ri2, double *Or, double *Oi, int isize) { int i; for(i = 0; i < isize; i++) { Or[i] = Ri1[i] * Ri2[i]; Oi[i] = Ii1[i] * Ri2[i]; } return; } /*************************************************************** * Function: morlet_frequency: * --------- * Generates a Morlet wavelet in the frequency domain. * The wavelet is centered at the origin, and normalized so * that psi(0) =1/sqrt(2 pi) * * w: wavelet * scale: scale of the wavelet * isize: window size * cf: central frequency of the wavelet ***************************************************************/ void morlet_frequency(double cf,double scale,double *w,int isize) { double tmp; int i; double twopi; twopi = 6.28318530717959; /* tmp1 = exp(-(cf * cf)/2); */ for(i = 0; i < isize; i++) { tmp = (double)(scale * i * twopi/isize - cf); tmp = -(tmp * tmp)/2; /* w[i] = exp(tmp) - tmp1; */ w[i] = exp(tmp); } return; } /*************************************************************** * Function: morlet_time: * --------- * Generates a Morlet wavelet in the time domain. * The wavelet is centered at the origin, and normalized so * that psi(0) = 1 * * w: wavelet * scale: scale of the wavelet * isize: window size * cf: central frequency of the wavelet * * remark: unlike the other functions, this one generates an * array starting at 1, for compatibility with S. ***************************************************************/ void morlet_time(double *pcf,double *pscale, int *pb, double *w_r, double *w_i,int *pisize) { double tmp, tmp2; double cf = *pcf, scale = *pscale; int b = *pb, isize = *pisize; int i; for(i = 1; i <= isize; i++) { tmp = (double)((double)(i-b)/scale); tmp2 = exp(-(tmp * tmp)/2.); w_r[i-1] = tmp2*cos(tmp*cf)/scale; w_i[i-1] = tmp2*sin(tmp*cf)/scale; } return; } /*************************************************************** * Function: vmorlet_time: * --------- * Generates Morlet wavelets located on nodes of the ridge, * in the time domain. * The mother wavelet is centered at the origin, and normalized so * that psi(0) = 1/sqrt(2 pi) * * w_r, w_i: wavelet (real and imaginary parts) * scale: scale of the wavelets on the ridge samples * b: position of the wavelets on the ridge samples * isize: window size * cf: central frequency of the wavelet * nbnodes: number of ridge samples * * remark: unlike the other functions, this one generates an * array starting at 1, for compatibility with S. ***************************************************************/ void vmorlet_time(double *pcf,double *pscale, int *b, double *w_r, double *w_i,int *pisize, int *pnbnode) { double tmp, tmp2; double cf = (double)(*pcf); int isize = *pisize; int i, j, nbnode = *pnbnode; int position; double sqtwopi; sqtwopi = sqrt(6.28318530717959); for(j = 0; j < nbnode; j++) { position = b[j]; for(i = 1; i <= isize; i++) { tmp = (double)((double)(i-position)/pscale[j]); tmp2 = exp(-(tmp * tmp)/2.)/pscale[j]/sqtwopi; w_r[j * isize + i-1] = tmp2*cos(tmp*cf); w_i[j * isize + i-1] = tmp2*sin(tmp*cf); } } return; } /***************************************************************** * function: Scwt_morlet_r * Continuous wavelet transform : * * input: (real-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pcenterfrequency: centralfrequency of Morlet wavelet ******************************************************************/ void Scwt_morlet_r(double *input, double *Oreal, double *Oimage, int *pnboctave, int *pnbvoice, int *pinputsize, double *pcenterfrequency) { int nboctave, nbvoice, i, j, inputsize; double centerfrequency, a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; centerfrequency = *pcenterfrequency; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_morlet.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_morlet.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_morlet.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_morlet.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_morlet.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)input[i]; Ii[i] = 0.0; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); morlet_frequency(centerfrequency,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /***************************************************************** * function: Scwt_morlet * Continuous wavelet transform : * * input: (a priori complex-valued) input signal * Ri1, Ii1: Fourier transform of input signal (real and * imaginary parts). * Ri2: Real part of Fourier transform of Morlet wavelet * Oreal,Oimage: real and imaginary parts of CWT * pinputsize: signal size * pnboctave: number of scales (powers of 2) * pnvoice: number of scales between 2 consecutive powers of 2 * pcenterfrequency: centralfrequency of Morlet wavelet ******************************************************************/ void Scwt_morlet(double *Rinput,double *Iinput,double *Oreal, double *Oimage,int *pnboctave,int *pnbvoice, int *pinputsize,double *pcenterfrequency) { int nboctave, nbvoice, i, j, inputsize; double centerfrequency, a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; centerfrequency = *pcenterfrequency; nboctave = *pnboctave; nbvoice = *pnbvoice; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_morlet.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_morlet.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_morlet.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_morlet.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_morlet.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); for(i = 1; i <= nboctave; i++) { for(j=0; j < nbvoice; j++) { a = (double)(pow((double)2,(double)(i+j/((double)nbvoice)))); morlet_frequency(centerfrequency,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal = Oreal + inputsize; Oimage = Oimage + inputsize; } } } /*************************************************************** * Function: Svwt_morlet: * --------- * Computes the continuous wavelet transform of input * signal with Morlet wavelet, a fixed scale a * * Rinput, Iinput: real and imaginary parts of the signal * Oreal, Oimage: real and imaginary parts of the cwt. ***************************************************************/ void Svwt_morlet(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, double *pcenterfrequency) { int i, inputsize; double centerfrequency, a; double *Ri2, *Ri1, *Ii1, *Ii, *Ri; centerfrequency = *pcenterfrequency; a = *pa; inputsize = *pinputsize; if(!(Ri2 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri2 in cwt_morlet.c \n"); if(!(Ri1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri1 in cwt_morlet.c \n"); if(!(Ii1 = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii1 in cwt_morlet.c \n"); if(!(Ri = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ri in cwt_morlet.c \n"); if(!(Ii = (double *) R_alloc(inputsize, sizeof(double) ))) Rf_error("Memory allocation failed for Ii in cwt_morlet.c \n"); for(i = 0; i < inputsize; i++) { Ri[i] = (double)Rinput[i]; Ii[i] = (double)Iinput[i]; } double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); morlet_frequency(centerfrequency,a,Ri2,inputsize); multi(Ri1,Ii1,Ri2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); } Rwave/src/init.c0000644000176200001440000001121514071031313013225 0ustar liggesusers #include #include #include #include #include // for NULL #include "denoise.h" #include "dyadic.h" void Shessianmap(double *sqmodulus, int *psigsize, int *pnscale, int *pnbblock, int *pgridx, int *pgridy, double *tst); void Spca_annealing(double *smodulus, double *beemap, int *crazymap, double *pc, int *psigsize, int *pnscale, int *piteration, int *pseed, int *pbstep, int *pnbbee, int *pintegral, int *pchain, int *flag); void Spca_family(double *ridgemap,int *orientmap, double *orderedmap,int *chain, int *pnbchain, int *psigsize,int *pnscale, int *pbstep,double *pthreshold, int* pmaxchnlng) ; void Ssnakenoid_annealing(double *cost, double *smodulus, double *phi, double *rho, double *plambda, double *pmu, double *plambda2, double *pmu2, double *pc, int *psigsize, int *psnakesize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize); void daubechies_wt(void *,void *,void *,void *,void *,void *); void compute_ddwave( double *phi, double *psi, double *s, int *max_resoln_ptr, int *np_ptr, int *NW_ptr ); void Sinverse_wavelet_transform(double *f_back,double *Sf,double *Wf,int *pmax_resoln,int *pnp,char **pfiltername); void Spointmap(double *sqmodulus, int *psigsize, int *pnscale, int *pgridx, int *pgridy, int *pnbblock, int *pnbpoint, int *pointmap, double *tst, int *ptstsize, int *pcount, int *pseed); void Stf_pcaridge(double *input, double *output, int *pnrow, int *pncol, int *orientmap); void gabor_time(double *pfrequency,double *pscale, int *pb, double *g_r, double *g_i,int *pisize); void modulus_maxima(double *extrema, double *wt, int *resoln_ptr, int *np_ptr ); void nthresh_compute(double *nthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ); void Svwt_thierry(double *Rinput,double *Iinput,double *Oreal, double *Oimage,double *pa,int *pinputsize, int *pM); void normal_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ); void bootstrap_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ); void bthresh_compute(double *bthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ); void rkernel(double *ker,int *px_min,int *px_max,int *px_inc, int *plng, double *nodes,double *phi_nodes,int *pnb_nodes, double *pw0,double *pb_start,double *pb_end); void fastkernel(double *ker_r, double *ker_i,int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pw0,double *pb_start,double *pb_end); void gkernel(double *ker, int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pscale,double *pb_start,double *pb_end); void fastgkernel(double *ker, int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pscale,double *pb_start,double *pb_end); #define CDEF(name, n) {#name, (DL_FUNC) &name, n} static const R_CMethodDef CEntries[] = { CDEF(Svwt_thierry , 7), CDEF(normal_pval_compute , 6), CDEF(bootstrap_pval_compute ,6 ), CDEF(bthresh_compute ,5 ), CDEF( rkernel,11 ), CDEF(fastkernel ,12 ), CDEF( gkernel , 11), CDEF(fastgkernel ,11 ), CDEF(nthresh_compute, 5), CDEF(modulus_maxima, 4), CDEF(Ssmoothwt, 6), CDEF(Smodulus_smoothing, 6), CDEF(Sbee_annealing, 12), CDEF(Scrazy_family, 8 ), CDEF(Scwt_morlet, 8), CDEF(Svwt_morlet, 7 ), CDEF(morlet_time, 6 ), CDEF(vmorlet_time, 7), CDEF(Scwt_squeezed, 7 ), CDEF(Scwt_thierry, 8 ), CDEF(Scwt_phase, 8 ), CDEF(Shessianmap, 7), CDEF(Spca_annealing, 13), CDEF(Spointmap, 12), CDEF(Spca_family, 10 ), CDEF(Stf_pcaridge, 5), CDEF(Sridge_annealing, 15 ), CDEF(Sridge_coronoid, 15 ), CDEF(Sridge_icm, 11), CDEF(Ssnake_annealing, 19), CDEF(Ssnakenoid_annealing, 19), CDEF(Scwt_gmax, 5), CDEF(Scwt_mridge, 4), CDEF(Scwt_DOG, 8 ), CDEF(Svwt_DOG, 7), CDEF(Svgabor, 6), CDEF(gabor_time, 6), CDEF(vgabor_time, 7), CDEF(daubechies_wt, 6), CDEF(compute_ddwave, 6 ), CDEF(Sgabor, 7), CDEF(entropy, 5 ), CDEF(Lpnorm, 6), CDEF(extrema_reconst, 6 ), CDEF(Sinverse_wavelet_transform, 6), CDEF(Sf_compute, 5), CDEF(Wf_compute, 5), CDEF(Ssvdecomp, 5 ), CDEF(WV,6), {NULL, NULL, 0} }; void R_init_Rwave(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } Rwave/src/pvalue.h0000644000176200001440000000055213064230076013575 0ustar liggesusers double p_value( double T, double **histo, int resoln, int histo_size ); void compute_pval_average( double *pval, double **p, int max_resoln, int np, int num_of_windows, int window_size ); void local_mean( double *mean, double *s, int np ); double variance( double *s, int np ); void local_var( double *var, double *s, int *resoln_ptr, int *np_ptr ); Rwave/src/cwt_phase.c0000644000176200001440000003067113064230076014256 0ustar liggesusers#include /**************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /***************************************************************** * Function: morlet_frequencyph: * Generation of Morlet wavelet and derivative (frequency domain) * * cf: central frequency * w: scaled wavelet (real part) * wd: scaled derivative of wavelet (imaginary part,up to a * - sign and scale factor) * isize: signal size ******************************************************************/ void morlet_frequencyph(double cf,double scale,double *w, double *wd,int isize) { double tmp, tmp1, tmp0; int i; double twopi; twopi = 6.28318530717959; tmp1 = exp(-(cf * cf)/2); for(i = 0; i < isize; i++) { tmp0 = (double)(scale * i * twopi/isize); tmp = (double)(tmp0 - cf); tmp = -(tmp * tmp)/2; w[i] = exp(tmp) - tmp1; wd[i]= w[i]*tmp0/(double)scale; } return; } /***************************************************************** * function normalization * Normalize the derivative of CWT by the square-modulus of CWT * * Oreal, Oimage: real and imaginary parts of wavelet transform. * Odreal, Odimage: real and imaginary parts of wavelet transform * derivative. ******************************************************************/ void normalization(double *Oreal, double *Oimage, double *Odreal, double *Odimage, int cwtlength) { double tmp; int i; for(i=0;i #include "Swave.h" /*************************************************************** * $log: gkernel.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "rwkernel.h" /********************************************************* * Function: ghermite_sym * --------- * Complete a matrix by symmetry * * ker: matrix to be filled in. * lng: number of rows (and columns) of the matrix. **********************************************************/ void ghermite_sym(double *ker,int lng) { int i,j; for (i=0;ii;j--){ ker[i*lng +j] = ker[j*lng +i]; } } return; } /****************************************************************** * Function: gintegrand * --------- * Evaluates the integrand for Romberg integration. * (case of the Gabor transform) * * b: center position of wavelets and derivatives. * x,y: Integration variables. * nodes, phi_nodes: position and scale of the nodes of the ridge. * nb_nodes: number of nodes of the ridge. *******************************************************************/ double gintegrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double scale) { double xpos,ypos,tmp,tmp2, phi_b,phip_b, u; double g_x,g_y,gprime_x,gprime_y; double integ=0; /* Spline interpolation of the ridge; computation of its derivative ---------------------------------------------------------------*/ splint2(nodes,phi_nodes,p2,nb_nodes,b,&phi_b,&phip_b); /* Evaluation of the integrand --------------------------*/ xpos = (x-b); g_x = gfunc(xpos,scale); gprime_x = gprime(xpos,scale); ypos = (y-b); g_y = gfunc(ypos,scale); gprime_y = gprime(ypos,scale); u = phi_b*(x-y); /* First part */ tmp= (phip_b*phip_b*xpos*ypos - phi_b*phip_b*(xpos+ypos)); tmp *= g_x*g_y; integ = tmp; tmp=gprime_x*gprime_y; integ += tmp; integ *= cos(u); /* Second part */ tmp2 = phip_b*xpos -phi_b; tmp2 *= (gprime_y*g_x); tmp = phip_b*ypos -phi_b; tmp *= (gprime_x*g_y); tmp2 -= tmp; tmp2 *= sin(u); integ += tmp2; return integ; } /*********************************************************** * Function: gkernel * --------- * Computation of the kernel * * ker_r, ker_i: real and imaginary parts of the kernel. * x_min, x_max: limiting values for the integration. * x_inc: distance between 2 consecutive x,y values. * nodes, phi_nodes: position and scale of the samples * of the ridge. * nb_nodes: number of nodes of the sampled ridge. * b_start, b_end: integration bounds. ************************************************************/ void gkernel(double *ker, int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pscale,double *pb_start,double *pb_end) { double *p2, b_start=*pb_start, b_end=*pb_end, scale=*pscale; double phimax, b_lo,b_hi; int x,y; int x_min=*px_min,x_max=*px_max,x_inc=*px_inc,lng=*plng,nb_nodes=*pnb_nodes; int i=0,up_bound,gamma_min,lng2; double *p_tmp; /* printf("xmin=%d, xmax=%d\n",x_min,x_max); */ p2 = (double *)S_alloc(nb_nodes,sizeof(double)); p_tmp=ker; /* mark the first element of ker */ phimax = scale; up_bound = (int)(phimax * sqrt(-2.0 * log(EPS))+1); lng2=lng*lng; /* Compute second derivative of the ridge for spline interpolation ---------------------------------------------------------------*/ spline(nodes-1,phi_nodes-1,nb_nodes,(double)0,(double)0,p2-1); /* printf("spline done\n"); */ /* Integrate --------*/ for(x=x_min;x<=x_max;x+=x_inc){ /* fprintf(stderr,"x = %d; ", x); fflush(stderr); */ /* Evaluate the range of computation of the kernel */ gamma_min = MAX(x_min,(x-2*up_bound) -(x-x_min-2*up_bound)%x_inc); ker += (gamma_min-x_min)/x_inc; i = (gamma_min-x_min)/x_inc; for(y = gamma_min; y <= x; y+=x_inc){ /* Estimation of integration bounds */ b_lo = MAX(MAX(x-2*up_bound,y-2*up_bound),b_start); b_hi = MIN(MIN(x+2*up_bound,y+2*up_bound),b_end); /* Evaluation of the kernel */ *ker = gqrombmod(x,y,p2-1,nodes,phi_nodes,nb_nodes,scale,b_lo,b_hi); ker++; i++; } ker -= (i - lng) ; } ker = p_tmp; /* Finish to fill in the kernel by Hermite symmetry ------------------------------------------------ */ ghermite_sym(ker,lng); } /*********************************************************** * Function: fastgkernel * --------- * Computation of the kernel (Gabor case); * the integral is approximated by a Riemann sum * * ker_r, ker_i: real and imaginary parts of the kernel. * x_min, x_max: limiting values for the integration. * x_inc: distance between 2 consecutive x,y values. * nodes, phi_nodes: position and scale of the samples * of the ridge. * nb_nodes: number of nodes of the sampled ridge. * b_start, b_end: integration bounds. ************************************************************/ void fastgkernel(double *ker, int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pscale,double *pb_start,double *pb_end) { double *p2, b_start=*pb_start, b_end=*pb_end, scale=*pscale; double phimax, b_lo,b_hi; int x,y,b; int x_min=*px_min,x_max=*px_max,x_inc=*px_inc,lng=*plng,nb_nodes=*pnb_nodes; int i=0,up_bound,gamma_min,lng2; double *p_tmp; p2 = (double *)S_alloc(nb_nodes,sizeof(double)); p_tmp=ker; /* mark the first element of ker */ phimax = scale; up_bound = (int)(phimax * sqrt(-2.0 * log(EPS))+1); lng2=lng*lng; /* Compute second derivative of the ridge for spline interpolation ---------------------------------------------------------------*/ spline(nodes-1,phi_nodes-1,nb_nodes,(double)0,(double)0,p2-1); /* Integrate --------*/ for(x=x_min;x<=x_max;x+=x_inc){ /* fprintf(stderr,"x = %d; ", x); fflush(stderr); */ /* Evaluate the range of computation of the kernel */ gamma_min = MAX(x_min,(x-2*up_bound) -(x-x_min-2*up_bound)%x_inc); /* fprintf(stderr,"gamma_min = %d; \n ", gamma_min); fflush(stderr); */ ker += (gamma_min-x_min)/x_inc; i = (gamma_min-x_min)/x_inc; for(y = gamma_min; y <= x; y+=x_inc){ /* Estimation of integration bounds */ b_lo = MAX(MAX(x-2*up_bound,y-2*up_bound),b_start); b_hi = MIN(MIN(x+2*up_bound,y+2*up_bound),b_end); /* Evaluation of the kernel */ for(b = (int)b_lo; b<= (int)b_hi;b++){ *ker += gintegrand(b,x,y,p2-1,nodes,phi_nodes,nb_nodes,scale); /* to be checked */ } ker++; i++; } ker -= (i - lng) ; } ker = p_tmp; /* Finish to fill in the kernel by Hermite symmetry -----------------------------------------------*/ ghermite_sym(ker,lng); } /********************************************************* * Computation of the gabor window **********************************************************/ double gfunc(double x, double scale) { double u,v; v = x/scale; u=exp(-v*v/(double)2)/scale; return u; } /********************************************************* * Computation of the window derivative **********************************************************/ double gprime(double x,double scale) { double u, v; v = x/scale; u= - v*exp(-v*v/(double)2.)/scale/scale; return u; } Rwave/src/randomwalker.c0000644000176200001440000000614613064230076014767 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" /* int idum = -7; */ extern long idum; /****************************************************************** * UNIFORM RANDOM NUMBER GENERATOR *******************************************************************/ #define M1 259200 #define IA1 7141 #define IC1 54773 #define RM1 (1.0/M1) #define M2 134456 #define IA2 8121 #define IC2 28411 #define RM2 (1.0/M2) #define M3 243000 #define IA3 4561 #define IC3 51349 /* ran1 (from Numerical Recipes): uniform random numbers between 0 and 1 */ double oldran1(long *idum) { static long ix1,ix2,ix3; static double r[98]; double temp; static int iff=0; int j; if (*idum < 0 || iff == 0) { iff=1; ix1=(IC1-(*idum)) % M1; ix1=(IA1*ix1+IC1) % M1; ix2=ix1 % M2; ix1=(IA1*ix1+IC1) % M1; ix3=ix1 % M3; for (j=1;j<=97;j++) { ix1=(IA1*ix1+IC1) % M1; ix2=(IA2*ix2+IC2) % M2; r[j]=(ix1+ix2*RM2)*RM1; } *idum=1; } ix1=(IA1*ix1+IC1) % M1; ix2=(IA2*ix2+IC2) % M2; ix3=(IA3*ix3+IC3) % M3; j=1 + ((97*ix3)/M3); if (j > 97 || j < 1) { REprintf("RAN1: This cannot happen.\n"); REprintf("Exiting now.\n"); return(1); } temp=r[j]; r[j]=(ix1+ix2*RM2)*RM1; return temp; } #undef M1 #undef IA1 #undef IC1 #undef RM1 #undef M2 #undef IA2 #undef IC2 #undef RM2 #undef M3 #undef IA3 #undef IC3 /*************************************************************** * Function: randomwalker * --------- * random number between 0 and 2* sigsize ***************************************************************/ void randomwalker(int sigsize,int *num) { int conf; double tmp; conf = 2 * sigsize; tmp = (double)ran1(&idum); *num = (int)((double)conf * ran1(&idum)); if(*num >= 2 * sigsize) *num = 2 * sigsize -1; return; } /*************************************************************** * Function: randomwalker2 * --------- * random number between 0 and 2* sigsize ***************************************************************/ void randomwalker2(int sigsize,int *num, long *seed) { int conf; conf = 2 * sigsize; *num = floor((double)conf * ran1(seed)); if(*num >= 2 * sigsize) *num = 2 * sigsize -1; return; } /*************************************************************** * Function: randomsnaker * --------- * random number between 0 and 4* sigsize ***************************************************************/ void randomsnaker(int sigsize,int *num) { int conf; double tmp; conf = 4 * sigsize; tmp = (double)ran1(&idum); *num = (int)((double)conf * ran1(&idum)); if(*num >= 4 * sigsize) *num = 4 * sigsize -1; return; } Rwave/src/pca_climbers.c0000644000176200001440000004040113064230076014714 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Spointmap: * -------------------- * Road map designed using principle component analysis * * smodulus: squared-modulus of the wavelet transform * (coming from learning the noise) * sigsize: signal size * nscale: total number of scales for CWT * gridx : the window size for pca along x * gridy : the window size for pac along y * nbblock: number of window used by pca * nbpoint: number of sampler each window by pca * pointmap: map of sampling points * tst: the first 4 locations containing the coordinates of left * and right corner, followed with a sequence of the coor- * dinates of sampled points in each block. * tstsize: equal to 4 + 2 * number of sampled point each pca block * count: the maximal number of repetition if location is chosen in * a block * seed: seed for random number generator ****************************************************************/ void Spointmap(double *sqmodulus, int *psigsize, int *pnscale, int *pgridx, int *pgridy, int *pnbblock, int *pnbpoint, int *pointmap, double *tst, int *ptstsize, int *pcount, int *pseed) { int sigsize, nscale, i, j, k, tstsize; int gridx, gridy, nbpoint; long u1, u2; double um, pm, largest; long seed; double p1, p2; int a, b, t, up, down, left, right; int count1, count2, nbblock, bnumber; int lefto, righto, upo, downo; /* seed for random number ---------------------- */ seed = (*pseed); sigsize = *psigsize; nscale = *pnscale; /* size of grid along b and a -------------------- */ gridx = *pgridx; gridy = *pgridy; tstsize = *ptstsize; /* for(l = 0; l < sigsize * nscale; l++) pointmap[l] = 0; */ /* number of points to be in a block and the total number of block --------------------------------- */ nbblock = *pnbblock; nbpoint = *pnbpoint; bnumber = 0; for(a = 0; a < nscale; a+= gridy) { down = a; up = min(nscale-1, a + gridy); /* overlapping with neighborhood block -----------------------------------*/ downo = max(0,a - gridy/2); upo = min(nscale-1, a + gridy + gridy/2); for(b = 0; b < sigsize; b += gridx) { left = b; right = min(sigsize-1,b + gridx); /* overlapping with neighborhood block -----------------------------------*/ lefto = max(0,b - gridx/2); righto = min(sigsize-1, b + gridx + gridx/2); /* largest sqared modulus in a block --------------------------------- */ largest = 0.0; /* for(i = left; i < right; i++) { for(j = down; j < up; j++) { k = j * sigsize + i; largest = max(sqmodulus[k], largest); } } */ for(i = lefto; i < righto; i++) { for(j = downo; j < upo; j++) { k = j * sigsize + i; pointmap[k] = 0; largest = max(sqmodulus[k], largest); } } /* locations of the block; Add 1 to compensate difference between S and c ---------------------------------------------------------------------- */ tst[tstsize*bnumber] = (double)(left + 1.0); tst[tstsize*bnumber+1] = (double)(down + 1.0); tst[tstsize*bnumber+2] = (double)(right + 1.0); tst[tstsize*bnumber+3] = (double)(up + 1.0); for(t = 1; t <= nbpoint; t++) { count2 = 0; while(1) { /* p1 = (double)(ran1(&seed)); u1 = (long)min((right-left-1) * p1 + left, sigsize-1); p2 = (double)(ran1(&seed)); u2 = (long)min((up-down-1) * p2 + down, nscale-1); */ p1 = (double)(ran1(&seed)); u1 = (long)min((righto-lefto-1) * p1 + lefto, sigsize-1); p2 = (double)(ran1(&seed)); u2 = (long)min((upo-downo-1) * p2 + downo, nscale-1); count1 = 0; while(1) { k = u1 + u2 * sigsize; /* does the position chosen ? -------------------------- */ if((pointmap[k] == 0) || (count1 > (*pcount))) break; /* p1 = (double)(ran1(&seed)); u1 = (long)((right-left-1) * p1 + left); u1 = min(u1, sigsize-1); p2 = (double)(ran1(&seed)); u2 = (long)((up-down-1) * p2 + down); u2 = min(u2, nscale-1); */ p1 = (double)(ran1(&seed)); u1 = (long)((righto-lefto-1) * p1 + lefto); u1 = min(u1, sigsize-1); p2 = (double)(ran1(&seed)); u2 = (long)((upo-downo-1) * p2 + downo); u2 = min(u2, nscale-1); count1 ++; } k = u2 * sigsize + u1; pm = ran1(&seed); um = pm * largest; if((sqmodulus[k] >= um) || (count2 > (*pcount))) { /* choose only when modulus at (u1, u2) is at least * * as large as a random reference. * ------------------------------------------------ */ pointmap[k] = 1; /* the locations of selected points, normalized as prob. --------------------------------------------------- */ tst[tstsize*bnumber+ 2*(t+1)] = p1; tst[tstsize*bnumber+ 2*(t+1)+1] = p2; break; } count2 ++; } } /* advance to next block --------------------- */ bnumber ++; } } } /**************************************************************** * Function: Spca_annealing: * -------------------------- * Ridges characterisation with pca climber algorithm * * smodulus: squared-modulus of the wavelet transform * (coming from learning the noise) * beemap: ridges * crazymap: roadmap for pca * c: constant on the temperature schedule * sigsize: signal size * nscale: total number of scales for CWT * (or frequencies for Gabor) * nbbee: number of crazy climbers * iteration: number of moves for each climber * seed: seed for random number generator * bstep: stepsize for moves in b direction * integral: flag; if set to FALSE, the function computes * the "characteristic function" of the ridge; if set to * TRUE, computes the characteristic function, weighted by * the value of the modulus. * chain: flag; if set to TRUE, returns "chained ridges" * ****************************************************************/ void Spca_annealing(double *smodulus, double *beemap, int *crazymap, double *pc, int *psigsize, int *pnscale, int *piteration, int *pseed, int *pbstep, int *pnbbee, int *pintegral, int *pchain, int *flag) { double r, dd, ee; int i, bstep, k, k1, k2, bee; int *a, *b, integral, chain, count, dir; int arest, brest, afree, bfree; int seed, nscale, iteration, sigsize, nbbee; long idum; double c; double ran1(); chain = *pchain; integral = *pintegral; nbbee = *pnbbee; bstep = *pbstep; nscale = *pnscale; iteration = *piteration; c = *pc; sigsize = *psigsize; seed = *pseed; idum = (long)seed; if(!(a = (int *) R_alloc(iteration, sizeof(int) ))) Rf_error("Memory allocation failed for a in bee_annealing.c \n"); if(!(b = (int *) R_alloc(iteration, sizeof(int) ))) Rf_error("Memory allocation failed for b in bee_annealing.c \n"); /* generation of the random moves of the climbers ----------------------------------------------*/ for(bee = 0; bee < nbbee; bee++) { /* Initialisation */ a[0] = (int)((nscale-1) * ran1(&idum)); b[0] = (int)((sigsize-1) * ran1(&idum)); a[0] = min(nscale-1, a[0]); b[0] = min(sigsize-1, b[0]); a[0] = max(0, a[0]); b[0] = max(0, b[0]); k = b[0] + a[0] * sigsize; if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; /* Iterations */ for(i =1; i < iteration; i++) { dir = crazymap[k]; /* free along a or along b -----------------------*/ if((dir == 1) || (dir == 3)) { if(dir == 1) { /* more freely along b */ r = (double)ran1(&idum); if (r >= 0.5) b[i] = min(sigsize-1,b[i-1]+bstep); else b[i] = max(0,b[i-1]-bstep); r = (double)ran1(&idum); if (r >= 0.5) a[i] = min(nscale-1,a[i-1]+1); else a[i] = max(0,a[i-1]-1); k1 = b[i] + sigsize * a[i]; k2 = b[i] + sigsize * a[i-1]; } if(dir == 3) { /* mover freely along b */ r = (double)ran1(&idum); if (r >= 0.5) b[i] = min(sigsize-1,b[i-1]+1); else b[i] = max(0,b[i-1]-1); r = (double)ran1(&idum); if (r >= 0.5) a[i] = min(nscale-1,a[i-1]+bstep); else a[i] = max(0,a[i-1]-bstep); k1 = b[i] + sigsize * a[i]; k2 = b[i-1] + sigsize * a[i]; } dd = smodulus[k1] - smodulus[k2]; if (dd<0) { r = (double)ran1(&idum); ee = exp(dd * log((double)(3.0 + i))/c); if((*flag)==1) ee=exp(dd * log((double)(3.0))/c); /* constant temperature */ /* freeze ------ */ if (r>ee) { if(dir == 1) a[i] = a[i-1]; else b[i] = b[i-1]; } } } /* free along a=b or a=-b ----------------------*/ if((dir == 2) || (dir == 4)) { if(dir == 2) { /* move freely along a = -b */ r = (double)ran1(&idum); /* choose free move ----------------*/ if (r >= 0.5) { bfree = min(sigsize-1,b[i-1]+bstep); afree = max(0,a[i-1]-bstep); } else { bfree = max(0,b[i-1]-bstep); afree = min(nscale-1,a[i-1]+bstep); } /* choose restricted move ----------------------*/ r = (double)ran1(&idum); if (r >= 0.5) { arest = max(0,afree - 1); brest = max(0,bfree - 1); } else { arest = min(nscale-1,afree + 1); brest = min(sigsize-1,bfree + 1); } } if(dir == 4) { /* more freely along a = b */ r = (double)ran1(&idum); /* choose free move ----------------*/ if (r >= 0.5) { bfree = min(sigsize-1,b[i-1]+bstep); afree = min(nscale-1,a[i-1]+bstep); } else { bfree = max(0,b[i-1]-bstep); afree = max(0,a[i-1]-bstep); } /* choose restricted move ----------------------*/ r = (double)ran1(&idum); if (r >= 0.5) { arest = min(nscale-1,afree+1); brest = max(0,bfree-1); } else { arest = max(0,afree-1); brest = min(sigsize-1,bfree+1); } } k1 = brest + arest * sigsize; k2 = bfree + afree * sigsize; dd = smodulus[k1] - smodulus[k2]; b[i] = brest; a[i] = arest; if (dd<0) { r = (double)ran1(&idum); if((*flag) == 1) ee=exp(dd * log((double)(3.0))/c); else ee = exp(dd * log((double)(3.0 + i))/c); /* freeze ------ */ if (r>ee) { a[i] = afree; b[i] = bfree; } } } /* Chaining a curve between (a[i-1],b[i-1]) and (a[i],b[i]) with larger modulus ---------------------------------------------------------------------------- */ if(chain) { if(dir == 1) { count = 1; while(count < bstep) { if(b[i] - b[i-1] > 0) { if(b[i-1] + count >= sigsize) break; k1 = b[i-1] + count + sigsize * a[i]; k2 = b[i-1] + count + sigsize * a[i-1]; if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } else { if(b[i-1] - count < 0) break; k1 = b[i-1] - count + sigsize * a[i]; k2 = b[i-1] - count + sigsize * a[i-1]; if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } if(dir == 3) { count = 1; while(count < bstep) { if(a[i] - a[i-1] > 0) { if(a[i-1] + count >= nscale) break; k1 = b[i] + sigsize * (a[i-1] + count); k2 = b[i-1] + sigsize * (a[i-1] + count); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } else { if((a[i-1] - count) < 0 ) break; k1 = b[i] + sigsize * (a[i-1] - count); k2 = b[i-1] + sigsize * (a[i-1] - count); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } if(dir == 2) { if((a[i] < a[i-1]) || (b[i] > b[i-1])) { count = 1; while(count < bstep) { if( ((b[i-1] + count + 1) >= sigsize) || ((a[i-1] - count - 1) < 0)) break; if((bfree == brest) && (afree == arest)) { k = b[i-1] + count + sigsize * (a[i-1] - count); } if(arest > afree) { k1 = (b[i-1] + count) + sigsize * (a[i-1] - count); k2 = (b[i-1] + count + 1) + sigsize * (a[i-1] - count + 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } if(arest < afree) { k1 = (b[i-1] + count) + sigsize * (a[i-1] - count); k2 = (b[i-1] + count - 1) + sigsize * (a[i-1] - count - 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } if((a[i] > a[i-1]) || (b[i] < b[i-1])) { count = 1; while(count < bstep) { if( ((b[i-1] - count - 1) < 0) || ((a[i-1] + count + 1) >= nscale) || ((a[i-1] - count - 1) < 0)) break; if((bfree == brest) && (afree == arest)) { k = b[i-1] - count + sigsize * (a[i-1] + count); } if(arest > afree) { k1 = (b[i-1] - count) + sigsize * (a[i-1] + count); k2 = (b[i-1] - count + 1) + sigsize * (a[i-1] + count + 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } if(arest < afree) { k1 = (b[i-1] - count) + sigsize * (a[i-1] + count); k2 = (b[i-1] - count - 1) + sigsize * (a[i-1] - count - 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } } if(dir == 4) { /* free along a = b */ if((a[i] > a[i-1]) || (b[i] > b[i-1])) { count = 1; while(count < bstep) { if( ((b[i-1] + count + 1) >= sigsize) || (a[i-1] + count + 1>= nscale)) break; if((bfree == brest) && (afree == arest)) { k = b[i-1] + count + sigsize * (a[i-1] + count); } if(arest > afree) { k1 = (b[i-1] + count) + sigsize * (a[i-1] + count); k2 = (b[i-1] + count - 1) + sigsize * (a[i-1] + count + 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } if(arest < afree) { k1 = (b[i-1] + count) + sigsize * (a[i-1] + count); k2 = (b[i-1] + count + 1) + sigsize * (a[i-1] + count - 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } if((a[i] < a[i-1]) || (b[i] < b[i-1])) { count = 1; while(count < bstep) { if( ((b[i-1] - count - 1) < 0) || (a[i-1] - count - 1 < 0)) break; if((bfree == brest) && (afree == arest)) { k = b[i-1] - count + sigsize * (a[i-1] - count); } if(arest > afree) { k1 = (b[i-1] - count) + sigsize * (a[i-1] - count); k2 = (b[i-1] - count - 1) + sigsize * (a[i-1] - count + 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } if(arest < afree) { k1 = (b[i-1] - count) + sigsize * (a[i-1] - count); k2 = (b[i-1] - count + 1) + sigsize * (a[i-1] - count - 1); if(smodulus[k1] > smodulus[k2]) k = k1; else k = k2; } /* update of the ridges */ if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; count ++; } } } } /* advance to next postion -----------------------*/ k = b[i] + a[i] * sigsize; if(integral) beemap[k] = beemap[k] + smodulus[k]; else beemap[k] = beemap[k] +1; } } } Rwave/src/dwfilter.c0000644000176200001440000006226513064230076014125 0ustar liggesusers/* ***************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang and A. Wang * * Princeton University * * All right reserved * *******************************************************************/ #include #include "dau_wave.h" #include "dyadic.h" #include "Swave.h" /**************************************************************** * Function: iexp2: * ---------------- * returning interger which is the jth power of 2 * * j: interger * ****************************************************************/ /* 2^j (j > 0) */ int iexp2(j) int j; { if(j == 0) return(1); return( 1 << j); } /**************************************************************** * Function: Hfilter_compute: * -------------------------- * Computation of H filter * * filename: filter name * H: H filters * H_bound: size of H filters * max_resoln: number of decomposition * ****************************************************************/ void Hfilter_compute(filtername,H,H_bound,max_resoln ) char *filtername; double ***H; bound *H_bound; int max_resoln; { int j, i; if(!(*H = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for *H in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*H)[j] = (double *) R_alloc( H_bound[j].size , sizeof(double)))) Rf_error("Memory allocation failed for H[] in filter.c \n"); signal_zero((*H)[j],H_bound[j].size); if ( j == 0 ) { if(strcmp(filtername,"Haar") == 0) { (*H)[0][0] = 0.5; (*H)[0][1] = 0.5; } else { (*H)[0][0] = 0.125; (*H)[0][1] = 0.375; (*H)[0][2] = 0.375; (*H)[0][3] = 0.125; } } else { for ( i = 0; i < H_bound[j-1].size; i++ ) (*H)[j][2 * i] = (*H)[j-1][i]; } } } /**************************************************************** * Function: Gfilter_compute: * -------------------------- * Computation of G filter * * filename: filter name * G: G filters * G_bound: size of G filters * max_resoln: number of decomposition * ****************************************************************/ void Gfilter_compute(filtername,G,G_bound,max_resoln) char *filtername; double ***G; bound *G_bound; int max_resoln; { int j, i; if(!(*G = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for G in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*G)[j] = (double *) R_alloc( G_bound[j].size , sizeof(double)))) Rf_error("Memory allocation failed for G[] in filter.c \n"); signal_zero((*G)[j],G_bound[j].size); if ( j == 0 ) { if(strcmp(filtername,"Haar") == 0) { (*G)[0][0] = 0.5; (*G)[0][1] = -0.5; } else { (*G)[0][0] = 0.5; (*G)[0][1] = -0.5; } } else { for ( i = 0; i < G_bound[j-1].size; i++ ) (*G)[j][2 * i] = (*G)[j-1][i]; } } } /**************************************************************** * Function: HGfilter_bound: * ------------------------- * Computation of filter bound for each resolution * * filterename: filter name * H_bound: size of H filters * G_bound: size of G filters * max_resoln: number of decomposition * ****************************************************************/ void HGfilter_bound(filtername,H_bound,G_bound,max_resoln ) char *filtername; bound **H_bound, **G_bound; int max_resoln; { int j; int iexp2(); if(!(*H_bound = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *H_bound in filter.c \n"); if(!(*G_bound = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *G_bound in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(strcmp(filtername,"Haar") == 0) { if(j == 0) { (*H_bound)[j].lb = 0; (*H_bound)[j].ub = 1; (*H_bound)[j].size = (*H_bound)[j].ub - (*H_bound)[j].lb + 1; (*G_bound)[j].lb = 0; (*G_bound)[j].ub = 1; (*G_bound)[j].size = (*G_bound)[j].ub - (*G_bound)[j].lb + 1; } else { (*H_bound)[j].lb = -iexp2(j-1); (*H_bound)[j].ub = iexp2(j-1); (*H_bound)[j].size = (*H_bound)[j].ub - (*H_bound)[j].lb + 1; (*G_bound)[j].lb = -iexp2(j-1); (*G_bound)[j].ub = iexp2(j-1); (*G_bound)[j].size = (*G_bound)[j].ub - (*G_bound)[j].lb + 1; } } else { if(j == 0) { (*H_bound)[j].lb = -1; (*H_bound)[j].ub = 2; (*H_bound)[j].size = (*H_bound)[j].ub - (*H_bound)[j].lb + 1; (*G_bound)[j].lb = 0; (*G_bound)[j].ub = 1; (*G_bound)[j].size = (*G_bound)[j].ub - (*G_bound)[j].lb + 1; } else { (*H_bound)[j].lb = -iexp2(j-1) * 3; (*H_bound)[j].ub = 3 * iexp2(j-1); /* changed 2/1/94 j to j-1 */ (*H_bound)[j].size = (*H_bound)[j].ub - (*H_bound)[j].lb + 1; (*G_bound)[j].lb = -iexp2(j-1); (*G_bound)[j].ub = iexp2(j-1); /* changed 2/1/94 j to j-1 */ (*G_bound)[j].size = (*G_bound)[j].ub - (*G_bound)[j].lb + 1; } } } } /**************************************************************** * Function: HG_hat_compute: * ------------------------- * Computation of the Fourier transform of H and G * H_hat and G_hat are obtained from analytical functions * * filterename: filter name * H_hat: the Fourier transform of H filters * G_hat: the Fourier transform of G filters * max_resoln: number of decomposition * np: signal size * ****************************************************************/ #define pi 3.141592653589793 void HG_hat_compute(filtername,H_hat,G_hat,max_resoln,np) double ***H_hat; double ***G_hat; int max_resoln; int np; char *filtername; { double temp; double arg; int m, j; int iexp2(); if(strcmp(filtername,"Gaussian1") != 0) { REprintf("Need Gaussian1 filter \n"); return; } /* printf("computing H_hat & G_hat with Gaussian1 filter\n"); */ if(!(*H_hat = (double **) R_alloc( (max_resoln+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *H_hat in filter.c \n"); if(!(*G_hat = (double **) R_alloc( (max_resoln+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *G_hat in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*H_hat)[j] = (double *) R_alloc( 2*(np+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *H_hat[] in filter.c \n"); if(!((*G_hat)[j] = (double *) R_alloc( 2*(np+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *G_hat[] in filter.c \n"); if ( j == 0 ) { temp = pi / (double) np; for ( m = 0; m < np; m++ ) { arg = (double) m * temp; (*H_hat)[j][2*m] = (double)(cos(arg) * cos(arg) * cos(arg) * cos(arg)); (*H_hat)[j][2*m+1] = (double)(cos(arg) * cos(arg) * cos(arg) * sin(arg)); /* remove 4 in the following due to normalize G in L1 */ (*G_hat)[j][2*m] = (double)(sin(arg) * sin(arg)); (*G_hat)[j][2*m+1] = -(double)(sin(arg) * cos(arg)); } } else { temp = iexp2(j) * pi / (double) np; for ( m = 0; m < np; m++ ) { arg = (double) m * temp; (*H_hat)[j][2*m] = (double)(cos(arg) * cos(arg) * cos(arg)); (*H_hat)[j][2*m+1] = 0.0; /* remove 4 in the following due to normalize G in L1 */ (*G_hat)[j][2*m] = 0.0; (*G_hat)[j][2*m+1] = (double)(-sin(arg)); } } } } #undef pi /**************************************************************** * Function: Sfilter_compute: * -------------------------- * Computation of the S filters * * filterename: filter name * S: S filters * S_bound: the size of S filters * max_resoln: number of decomposition * ****************************************************************/ void Sfilter_compute(filtername,S,S_bound,max_resoln) char *filtername; double ***S; bound *S_bound; int max_resoln; { int j, i; if(!(*S = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for *S in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*S)[j] = (double *) R_alloc( S_bound[j].size , sizeof(double)))) Rf_error("Memory allocation failed for S[] in filter.c \n"); signal_zero((*S)[j], S_bound[j].size); if ( j == 0 ) { if(strcmp(filtername,"Haar") == 0) { (*S)[0][0] = 0.5; (*S)[0][1] = 0.5; } else { (*S)[0][0] = 0.125; (*S)[0][1] = 0.375; (*S)[0][2] = 0.375; (*S)[0][3] = 0.125; } } else { for ( i = 0; i < S_bound[j-1].size; i++ ) (*S)[j][2 * i] = (*S)[j-1][i]; } } /* begugging ..... */ /* { FILE *fp = fopen( "Sfilter", "w" ); int j, i; for ( j = 0; j <= max_resoln; j++ ) { fprintf( fp, "j = %d\n", j ); for ( i = 0; i < S_bound[j].size; i++ ) fprintf( fp, "%.3f\n", (*S)[j][i] ); } fclose( fp ); } */ } /**************************************************************** * Function: Kfilter_compute: * -------------------------- * Computation of K filters * * filterename: filter name * K: K filters * K_bound: the size of K filters * max_resoln: number of decomposition * ****************************************************************/ void Kfilter_compute(filtername,K,K_bound,max_resoln) char *filtername; double ***K; bound *K_bound; int max_resoln; { int j, i; if(!(*K = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for K in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*K)[j] = (double *) R_alloc( K_bound[j].size , sizeof(double)))) Rf_error("Memory allocation failed for K[] in filter.c \n"); signal_zero((*K)[j], K_bound[j].size); if ( j == 0 ) { if(strcmp(filtername,"Haar") == 0) { (*K)[0][0] = -0.5; (*K)[0][1] = 0.5; } else { (*K)[0][0] = -0.03125; (*K)[0][1] = -0.21875; (*K)[0][2] = -0.6875; (*K)[0][3] = 0.6875; (*K)[0][4] = 0.21875; (*K)[0][5] = 0.03125; } } else { for ( i = 0; i < K_bound[j-1].size; i++ ) (*K)[j][2 * i] = (*K)[j-1][i]; } } /* degugging .... */ /* { FILE *fp = fopen( "Kfilter", "w" ); int j, i; for ( j = 0; j <= max_resoln; j++ ) { fprintf( fp, "j = %d\n", j ); for ( i = 0; i < K_bound[j].size; i++ ) fprintf( fp, "%f\n", (*K)[j][i] ); } fclose( fp ); } */ } /**************************************************************** * Function: Lfilter_compute: * -------------------------- * Computation of L filters * * filterename: filter name * L: L filters * L_bound: the size of L filters * max_resoln: number of decomposition * ****************************************************************/ void Lfilter_compute(filtername,L,L_bound,max_resoln) char *filtername; double ***L; bound *L_bound; int max_resoln; { int j, i; if(!(*L = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for L in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(!((*L)[j] = (double *) R_alloc( L_bound[j].size , sizeof(double)))) Rf_error("Memory allocation failed for L[] in filter.c \n"); signal_zero((*L)[j], L_bound[j].size); if ( j == 0 ) { if(strcmp(filtername,"Haar") == 0) { (*L)[0][0] = 0.125; (*L)[0][1] = 0.75; (*L)[0][2] = 0.125; } else { (*L)[0][0] = 0.0078125; (*L)[0][1] = 0.046875; (*L)[0][2] = 0.1171875; (*L)[0][3] = 0.65625; (*L)[0][4] = 0.1171875; (*L)[0][5] = 0.046875; (*L)[0][6] = 0.0078125; } } else { for ( i = 0; i < L_bound[j-1].size; i++ ) (*L)[j][2 * i] = (*L)[j-1][i]; } } /* degugging .... */ /* { FILE *fp = fopen( "Lfilter", "w" ); int j, i; for ( j = 0; j <= max_resoln; j++ ) { fprintf( fp, "j = %d\n", j ); for ( i = 0; i < L_bound[j].size; i++ ) fprintf( fp, "%f\n", (*L)[j][i] ); } fclose( fp ); } */ } /**************************************************************** * Function: KSfilter_bound: * ------------------------- * Computation of the size of K and S filters * * filterename: filter name * K_bound: the size of K filters * S_bound: the size of L filters * max_resoln: number of decomposition * ****************************************************************/ void KSfilter_bound(filtername,K_bound,S_bound,max_resoln) char *filtername; bound **K_bound, **S_bound; int max_resoln; { int j; int iexp2(); if(!(*K_bound = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *K_bound in signal_back.c \n"); if(!(*S_bound = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *S_bound in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(strcmp(filtername,"Haar") == 0) { if(j == 0) { (*S_bound)[0].lb = -1; (*S_bound)[0].ub = 0; (*S_bound)[0].size = (*S_bound)[0].ub - (*S_bound)[0].lb + 1; (*K_bound)[0].lb = -1; (*K_bound)[0].ub = 0; (*K_bound)[0].size = (*K_bound)[0].ub - (*K_bound)[0].lb + 1; } else { (*S_bound)[j].lb = -iexp2(j-1); (*S_bound)[j].ub = iexp2(j-1); (*S_bound)[j].size = (*S_bound)[j].ub - (*S_bound)[j].lb + 1; (*K_bound)[j].lb = -iexp2(j-1); (*K_bound)[j].ub = iexp2(j-1); (*K_bound)[j].size = (*K_bound)[j].ub - (*K_bound)[j].lb + 1; } } else { if(j == 0) { (*S_bound)[0].lb = -2; (*S_bound)[0].ub = 1; (*S_bound)[0].size = (*S_bound)[0].ub - (*S_bound)[0].lb + 1; (*K_bound)[0].lb = -3; (*K_bound)[0].ub = 2; (*K_bound)[0].size = (*K_bound)[0].ub - (*K_bound)[0].lb + 1; } else { (*S_bound)[j].lb = -3 * iexp2(j-1); (*S_bound)[j].ub = 3 * iexp2(j-1); /* changed 2/1/94 j to j-1 */ (*S_bound)[j].size = (*S_bound)[j].ub - (*S_bound)[j].lb + 1; (*K_bound)[j].lb = -5 * iexp2(j-1); (*K_bound)[j].ub = 5 * iexp2(j-1);/* changed 2/1/94 j to j-1 */ (*K_bound)[j].size = (*K_bound)[j].ub - (*K_bound)[j].lb + 1; } } } /* { int j; for ( j = 0; j <= max_resoln; j++ ) fprint("S_bound[%d] = [%d, %d], size = %d\n", j, (*S_bound)[j].lb, (*S_bound)[j].ub, (*S_bound)[j].size ); fprint( fp, "\n" ); for ( j = 0; j <= max_resoln; j++ ) fprintf( fp, "K_bound[%d] = [%d, %d], size = %d\n", j, (*K_bound)[j].lb, (*K_bound)[j].ub, (*K_bound)[j].size ); fprint( fp, "\n" ); } */ } /**************************************************************** * Function: Lfilter_bound: * ------------------------- * Computation of the size of L filters * * filterename: filter name * L_bound: the size of L filters * max_resoln: number of decomposition * ****************************************************************/ void Lfilter_bound(filtername,L_bound,max_resoln) char *filtername; bound **L_bound; int max_resoln; { int j; int iexp2(); if(!(*L_bound = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *L_bound in filter.c \n"); for ( j = 0; j <= max_resoln; j++ ) { if(strcmp(filtername,"Haar") == 0) { if(j == 0) { (*L_bound)[0].lb = -1; (*L_bound)[0].ub = 1; (*L_bound)[0].size = (*L_bound)[0].ub-(*L_bound)[0].lb + 1; } else { (*L_bound)[j].lb = -iexp2(j); (*L_bound)[j].ub = iexp2(j); (*L_bound)[j].size = (*L_bound)[j].ub-(*L_bound)[j].lb + 1; } } else { if(j == 0) { (*L_bound)[0].lb = -3; (*L_bound)[0].ub = 3; (*L_bound)[0].size = (*L_bound)[0].ub-(*L_bound)[0].lb + 1; } else { (*L_bound)[j].lb = -3 * iexp2(j); (*L_bound)[j].ub = 3 * iexp2(j); (*L_bound)[j].size = (*L_bound)[j].ub-(*L_bound)[j].lb + 1; } } } /* { int j; for ( j = 0; j <= max_resoln; j++ ) fprint("L_bound[%d] = [%d, %d], size = %d\n", j, (*L_bound)[j].lb,(*L_bound)[j].ub,(*L_bound)[j].size); fprint( fp, "\n" ); } */ } /**************************************************************** * Function: PsiPhifilter_bound: * ----------------------------- * Computation of the size of Psi and Phi filters * * psi: the size of psi filters * phi: the size of phi filters * H_bound: the size of H filters * G_bound: the size of G filters * max_resoln: number of decomposition * ****************************************************************/ void PsiPhifilter_bound(psi,phi,H_bound,G_bound,max_resoln) bound **psi, **phi; bound *G_bound; bound *H_bound; int max_resoln; { int j; if(!(*psi = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *psi in K_compute.c \n"); if(!(*phi = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ))) Rf_error("Memory allocation failed for *phi in K_compute.c \n"); (*phi)[0].lb = (*phi)[0].ub = 0; (*phi)[0].size = 1; for ( j = 1; j <= max_resoln; j++ ) { if( j == 1 ) { (*psi)[j].lb = G_bound[j].lb; (*psi)[j].ub = G_bound[j].ub; (*phi)[j].lb = H_bound[j].lb; (*phi)[j].ub = H_bound[j].ub; } else { (*psi)[j].lb = (*psi)[j-1].lb + G_bound[j].lb; (*psi)[j].ub = (*psi)[j-1].ub + G_bound[j].ub; (*phi)[j].lb = (*phi)[j-1].lb + H_bound[j].lb; (*phi)[j].ub = (*phi)[j-1].ub + H_bound[j].ub; } (*psi)[j].size = (*psi)[j].ub - (*psi)[j].lb + 1; (*phi)[j].size = (*phi)[j].ub - (*phi)[j].lb + 1; /* printf("<%d> [%d,%d] %d ==== [%d,%d] %d\n", j, (*psi)[j].lb,(*psi)[j].ub,(*psi)[j].size, (*phi)[j].lb,(*phi)[j].ub,(*phi)[j].size ); */ } } /****************************************************/ /* */ /* H0 H1 H2 ..... HJ-1 */ /* o-----o-----o-----o---------o-----o S[J] */ /* \ \ \ \ ..... \ */ /* G0 \ G1 \ G2 \ G3 \ GJ-1 \ */ /* o o o o o */ /* W[1] W[2] W[3] W[4] W[J] */ /* */ /* */ /****************************************************/ /**************************************************************** * Function: signal_W_S: * --------------------- * Computation of the W and S filters * * W: W filters * S: S filters * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void signal_W_S(W,S,max_resoln,np) double ***W, ***S; int max_resoln, np; { int j, m, t; char *filtername = "Gaussian1"; bound *H_bound,*G_bound; double **H_filter,**G_filter; double **H; double **G; double *prev,*curr,*temp; if(!(H = (double **) R_alloc( max_resoln , sizeof(double *) ))) Rf_error("Memory allocation failed for H in oneD_filter.c \n"); if(!(G = (double **) R_alloc( max_resoln , sizeof(double *) ))) Rf_error("Memory allocation failed for G in oneD_filter.c \n"); if(!(prev = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for prev in oneD_filter.c \n"); if(!(curr = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for curr in oneD_filter.c \n"); if(!(temp = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for temp in oneD_filter.c \n"); //filename_given(filtername,"Gaussian1"); HGfilter_bound(filtername,&H_bound,&G_bound,max_resoln ); Hfilter_compute(filtername,&H_filter, H_bound, max_resoln ); Gfilter_compute(filtername,&G_filter, G_bound, max_resoln); /* printf("Using Gaussian1 filter \n"); */ for ( j = 0; j < max_resoln; j++ ) { if(!(H[j] = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for H[] in oneD_filter.c \n"); if(!(G[j] = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for G[] in oneD_filter.c \n"); for ( m = 0; m < np; m++ ) H[j][m] = G[j][m] = 0.0; for ( m = H_bound[j].lb , t = 0; t < H_bound[j].size; t++, m++ ) H[j][(m+np)%np] = H_filter[j][t]; for ( m = G_bound[j].lb, t = 0; t < G_bound[j].size; t++, m++ ) G[j][(m+np)%np] = G_filter[j][t]; /* filename_given(filename1,"G"); filename_given(filename2,"H"); filename_inc(filename1,j); output_signal(G[j],np,filename1); filename_inc(filename2,j); output_signal(H[j],np,filename2); */ } if(!(*W = (double **) R_alloc( (max_resoln+1) , sizeof(double *)))) Rf_error("Memory allocation failed for *W in oneD_filter.c \n"); if(!(*S = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for *S in oneD_filter.c \n"); for ( j = 1; j <= max_resoln; j++ ) { if(!((*W)[j] = (double *) R_alloc( np , sizeof(double)))) Rf_error("Memory allocation failed for (*W)[] in oneD_filter.c \n"); if(!((*S)[j] = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for (*S)[] in oneD_filter.c \n"); if ( j == 1 ) { for ( m = 0; m < np; m++ ) { (*W)[j][m] = G[0][m]; (*S)[j][m] = H[0][m]; } } else if ( j == 2 ) { compute_convolution( (*W)[j], G[j-1], H[j-2], np ); compute_convolution( (*S)[j], H[j-1], H[j-2], np ); for ( m = 0; m < np; m++ ) prev[m] = H[0][m]; } else { compute_convolution( curr, H[j-2], prev, np ); compute_convolution( (*W)[j], G[j-1], curr, np ); compute_convolution( (*S)[j], H[j-1], curr, np ); if ( j < max_resoln ) { for ( m = 0; m < np; m++ ) prev[m] = curr[m]; } } /* filename_given(filename1,"W"); filename_given(filename2,"S"); filename_inc(filename1,j); output_signal((*W)[j],np,filename1); filename_inc(filename2,j); output_signal((*S)[j],np,filename2); */ } } /**************************************************************** * Function: signal_W_hat_S_hat: * ----------------------------- * Computation of the Fourier transform of W and S filters * * W_hat: Fourier transform of W filters * S_hat: Fourier transform of S filters * max_resoln: number of decomposition * np: signal size * ****************************************************************/ /* Note: W_hat[1] = G_hat[0] S_hat[1] = H_hat[0] W_hat[2] = G_hat[1]*H_hat[0] S_hat[2] = H_hat[1]*H_hat[0] W_hat[3] = G_hat[2]*H_hat[1]*H_hat[0] S_hat[3] = H_hat[2]*H_hat[1]*H_hat[0] : : W_hat[J] = G_hat[J-1]*H_hat[J-2]*......*H[0] */ void signal_W_hat_S_hat(W_hat,S_hat,max_resoln,np) double ***W_hat, ***S_hat; int max_resoln; int np; { char *filtername = "Gaussian1"; int two_np; double *prev, *curr, **H_hat, **G_hat; int j, m; two_np = 2 * np; /* real and imaginary */ if(!(prev = (double *) R_alloc( two_np , sizeof(double)))) Rf_error("Memory allocation failed for prev in oneD_filter.c \n"); if(!(curr = (double *) R_alloc( two_np , sizeof(double) ))) Rf_error("Memory allocation failed for curr in oneD_filter.c \n"); //filename_given(filtername,"Gaussian1"); HG_hat_compute(filtername,&H_hat,&G_hat,max_resoln,np); /* printf("computing W_hat & S_hat with Gaussian1 filter\n"); */ if(!(*W_hat = (double **) R_alloc( (max_resoln+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *W_hat in oneD_filter.c \n"); if(!(*S_hat = (double **) R_alloc( (max_resoln+1) , sizeof(double) ))) Rf_error("Memory allocation failed for *S_hat in oneD_filter.c \n"); if(!((*S_hat)[0] = (double *) R_alloc( two_np , sizeof(double) ))) Rf_error("Memory allocation failed for *S_hat in oneD_filter.c \n"); for ( m = 0; m < np; m++ ) { (*S_hat)[0][2*m] = 1.0; (*S_hat)[0][2*m+1] = 0.0; } for ( j = 1; j <= max_resoln; j++ ) { if(!((*W_hat)[j] = (double *) R_alloc( two_np , sizeof(double) ))) Rf_error("Memory allocation failed for (*W_hat)[] in oneD_filter.c \n"); if(!((*S_hat)[j] = (double *) R_alloc( two_np , sizeof(double) ))) Rf_error("Memory allocation failed for (*S_hat)[] in oneD_filter.c \n"); if ( j == 1 ) { /* H_hat & G_hat: j = 0 to (max_reaoln-1) */ for ( m = 0; m < two_np; m++ ) { (*W_hat)[j][m] = G_hat[j-1][m]; (*S_hat)[j][m] = H_hat[j-1][m]; } } else if ( j == 2 ) { complex_product( (*W_hat)[j], G_hat[j-1], H_hat[j-2], np ); complex_product( (*S_hat)[j], H_hat[j-1], H_hat[j-2], np ); for ( m = 0; m < two_np; m++ ) prev[m] = H_hat[0][m]; } else { complex_product( curr, H_hat[j-2], prev, np ); complex_product( (*W_hat)[j], G_hat[j-1], curr, np ); complex_product( (*S_hat)[j], H_hat[j-1], curr, np ); for ( m = 0; m < two_np; m++ ) prev[m] = curr[m]; } /* filename_given(filename1,"WhatR"); filename_given(filename2,"WhatI"); filename_inc(filename1,j); filename_inc(filename2,j); output_complex((*W_hat)[j],np,filename1,filename2); filename_given(filename1,"ShatR"); filename_given(filename2,"ShatI"); filename_inc(filename1,j); filename_inc(filename2,j); output_complex((*S_hat)[j],np,filename1,filename2); */ } } Rwave/src/complex.c0000644000176200001440000000511713064230076013745 0ustar liggesusers#include /*************************************************************** * $Log: complex.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ /* CAUTION: This is the ANSI C (only) version of the Numerical Recipes utility file complex.c. Do not confuse this file with the same-named file complex.c that is supplied in the same subdirectory or archive as the header file complex.h. *That* file contains both ANSI and traditional K&R versions, along with #ifdef macros to select the correct version. *This* file contains only ANSI C. */ #include typedef struct FCOMPLEX {double r,i;} fcomplex; fcomplex Cadd(fcomplex a, fcomplex b) { fcomplex c; c.r=a.r+b.r; c.i=a.i+b.i; return c; } fcomplex Csub(fcomplex a, fcomplex b) { fcomplex c; c.r=a.r-b.r; c.i=a.i-b.i; return c; } fcomplex Cmul(fcomplex a, fcomplex b) { fcomplex c; c.r=a.r*b.r-a.i*b.i; c.i=a.i*b.r+a.r*b.i; return c; } fcomplex Complex(double re, double im) { fcomplex c; c.r=re; c.i=im; return c; } fcomplex Conjg(fcomplex z) { fcomplex c; c.r=z.r; c.i = -z.i; return c; } fcomplex Cdiv(fcomplex a, fcomplex b) { fcomplex c; double r,den; if (fabs(b.r) >= fabs(b.i)) { r=b.i/b.r; den=b.r+r*b.i; c.r=(a.r+r*a.i)/den; c.i=(a.i-r*a.r)/den; } else { r=b.r/b.i; den=b.i+r*b.r; c.r=(a.r*r+a.i)/den; c.i=(a.i*r-a.r)/den; } return c; } double Cabs(fcomplex z) { double x,y,ans,temp; x=fabs(z.r); y=fabs(z.i); if (x == 0.0) ans=y; else if (y == 0.0) ans=x; else if (x > y) { temp=y/x; ans=x*sqrt(1.0+temp*temp); } else { temp=x/y; ans=y*sqrt(1.0+temp*temp); } return ans; } fcomplex Csqrt(fcomplex z) { fcomplex c; double x,y,w,r; if ((z.r == 0.0) && (z.i == 0.0)) { c.r=0.0; c.i=0.0; return c; } else { x=fabs(z.r); y=fabs(z.i); if (x >= y) { r=y/x; w=sqrt(x)*sqrt(0.5*(1.0+sqrt(1.0+r*r))); } else { r=x/y; w=sqrt(y)*sqrt(0.5*(r+sqrt(1.0+r*r))); } if (z.r >= 0.0) { c.r=w; c.i=z.i/(2.0*w); } else { c.i=(z.i >= 0) ? w : -w; c.r=z.i/(2.0*c.i); } return c; } } fcomplex RCmul(double x, fcomplex a) { fcomplex c; c.r=x*a.r; c.i=x*a.i; return c; } Rwave/src/dualwavelet.c0000644000176200001440000000561413064230076014615 0ustar liggesusers#include /****************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * ******************************************************************/ #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: signal_W_tilda: * ------------------------- * Computation of W tilda * * W_tilda: the dual wavelet * W: wavelet * K: kernel * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void signal_W_tilda(double ***W_tilda, double **W, double **K, int max_resoln, int np) { double *p, *b; int t, j; /* char filename[STRING_SIZE]; */ if(!(p = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for p in image_W_tilda \n"); if(!(b = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for b in image_W_tilda \n"); if(!(*W_tilda = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for *W_tilda in image_W_tilda \n"); for(j = 1; j <= max_resoln; j++) { if(!((*W_tilda)[j] = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for (*W_tilda)[] in image_W_tilda \n"); } for ( j = 1; j <= max_resoln; j++ ) { /* printf("computing W_tilda[%d]\n", j ); */ for ( t = 0; t < np; t++) b[t] = W[j][t]; choldc(K, np, p ); cholsl(K, np, p, b, (*W_tilda)[j]); /* please don't write files to disk filename_given(filename,"sig_W_tilda"); filename_inc(filename,j); output_signal((*W_tilda)[j], np, filename); */ } } /**************************************************************** * Function: signal_W_tilda_input: * ------------------------------ * Read W tilda from disk * * W_tilda: dual wavelet * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void signal_W_tilda_input(double ***W_tilda, int max_resoln, int np) { /* char filename[STRING_SIZE]; */ if(!(*W_tilda = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for *W_tilda in signal_W_tilda \n"); /* please don't write to disk for(j = 1; j <= max_resoln; j++) { filename_given(filename, "signal_W_tilda"); filename_inc(filename, j); signal_tilda_adjust(&((*W_tilda)[j]), np, filename, 4096); filename_given(filename, "W_tilda"); filename_inc(filename, j); output_signal((*W_tilda)[j], np, filename); } */ } Rwave/src/Swave.h0000644000176200001440000000224713064230076013371 0ustar liggesusers/***********************************/ /* Swave.h Some Basic include file */ /***********************************/ #include #include #include #include #include #include "R.h" #ifndef Macintosh #include #include #endif #include #ifndef Macintosh #include #endif #define YES 1 #define NO 0 #define ZERO 0.000001 #define STRING_SIZE 256 #define max( a, b ) ( (a) > (b) ? (a) : (b) ) #define min( a, b ) ( (a) < (b) ? (a) : (b) ) #define inrange(inf,x,sup) ((inf) <= (x) && (x) <= (sup)) /*****************************/ /* Type Definition */ /*****************************/ /* typedef struct { int lb; lower_bound int ub; upper_bound int size; } bound; */ /* structure of an image extrema used in point reconst */ /* typedef struct { int resoln; int x; int y; double W1f; double W2f; } image_ext; */ extern double my_exp2(); extern double my_log2(); extern int nint(); extern double log2(); extern double exp2(); extern int iexp2(); extern double fexp2(); extern int find2power(); /* uniform random number generator */ extern double urand_(); Rwave/src/fft.c0000644000176200001440000000243113064230076013051 0ustar liggesusers#include /**************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /* Fast Fourier transform (from numerical recipes routine) ------------------------------------------------------- */ void double_fft(double *Or,double *Oi,double *Ir,double *Ii, int isize,int isign) { double *tmp; int nt, find2power(), newsize, i; nt = find2power(isize); newsize = 1 << nt; if(!(tmp = (double *)R_alloc(newsize * 2, sizeof(double)))) Rf_error("Memory allocation failed for tmp in cwt_morlet.c \n"); for(i = 0; i < isize; i++) { tmp[2 * i] = Ir[i]; tmp[2 * i + 1] = Ii[i]; } four1(tmp-1,newsize,isign); for(i = 0; i < isize; i++) { if(isign == -1) { Or[i] = tmp[2 * i]/newsize; Oi[i] = tmp[2 * i + 1]/newsize; } else { Or[i] = tmp[2 * i]; Oi[i] = tmp[2 * i + 1]; } } } Rwave/src/dwvector.c0000644000176200001440000000702213064230076014130 0ustar liggesusers#include /*******************************************************************/ /* (c) Copyright 1997 */ /* by */ /* Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang */ /* Princeton University */ /* All right reserved */ /*******************************************************************/ #include "Swave.h" /**************************************************************** * Function: compute_convolution: * ------------------------------ * Computation of convolution product * * s: resultant of convolution * f: signal 1 * g: signal 2 * np: signal size * ****************************************************************/ /* convolution product s[m] = (f * g)[m] */ void compute_convolution( s, f, g, np ) double *s, *f, *g; int np; { int m, n; double sum; for ( m = 0; m < np; m++ ) { for ( n = 0, sum = 0.0; n < np; n++ ) sum += f[(m-n+np)%np] * g[n]; s[m] = sum; } } /**************************************************************** * Function: product: * ------------------ * Pointwise product of two real arrays * * image: resultant array * f: array 1 * g: array 2 * np: array size * ****************************************************************/ void product( image, f, g, np ) double ***image, *f, *g; int np; { int x, y; if(!(*image = (double **) R_alloc( np , sizeof(double *) ))) Rf_error("Memory allocation failed for *image in vector_op.c \n"); for ( x = 0; x < np; x++ ) { if(!((*image)[x] = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for *image in vector_op.c \n"); for ( y = 0; y < np; y++ ) (*image)[x][y] = f[x] * g[y]; } } /**************************************************************** * Function: complex_product: * -------------------------- * Pointwise product of two complex vectors * * product: resultant vector * s1: vector 1 (length of 2*np) * s2: vector 2 * np: vector size * ****************************************************************/ void complex_product( product, s1, s2, np ) double *product; double *s1; /* length of 2*np */ double *s2; /* length of 2*np */ int np; { int m, x, y; double a, b, c, d; for ( m = 0; m < np; m++ ) { x = 2*m; y = 2*m+1; a = s1[x]; /* (a + bi) * (c + di) */ b = s1[y]; c = s2[x]; d = s2[y]; product[x] = a*c - b*d; product[y] = b*c + a*d; } } /**************************************************************** * Function: signal_copy: * ---------------------- * Copy signal * * input: signal to be copied * output: resultant signal * offset: copy starts at ... * np: number of elements to be copied * ****************************************************************/ void signal_copy(input,output,offset,size) double *input; double *output; int size, offset; { int i; for(i = 0; i < size; i++) output[i] = input[offset+i]; } /**************************************************************** * Function: signal_zero: * ---------------------- * zero a signal * * input: signal * size: number of signals to be set to zero * ****************************************************************/ void signal_zero(input,size) double *input; int size; { int i; for(i = 0; i < size; i++) input[i] = 0.0; } Rwave/src/wv.c0000644000176200001440000001217213064230076012731 0ustar liggesusers#include /**************************************************************** * (c) Copyright 1998 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" void WV_mult(int n, double *Ri,double *Ii, double *Ro, double *Io,int isize); /*********************************************************** * Function: freq_parity * --------- * Parity transformation * * frequency: value of the frequency parameter (double) * win: input signal * wout: transformed signal * isize: signal size * ************************************************************/ void freq_parity(double frequency,double *win,double *wout, int isize,int sign) { int i,itmp; for(i = 0; i < isize; i++) { itmp = ((int)rint(2*frequency*isize)-i +isize)%isize; wout[i] = win[itmp]*sign; } return; } /*********************************************************** * Function: WV_freq_mult * --------- * Fourier domain manipulation for Wigner-Ville * * frequency: value of the frequency parameter (double) * Ri,Ii: input signal (real and imag. parts) * Ro,Io: output signal (real and imag. parts) * isize: signal size * ************************************************************/ void WV_freq_mult(double frequency,double *Ri,double *Ii, double *Ro, double *Io,int isize) { int i,itmp,jtmp; for(i = 0; i < isize; i++) { itmp = ((int)rint(frequency*isize) - i + 2*isize)%isize; jtmp = ((int)rint(frequency*isize) + i + 2*isize)%isize; Ro[i] = Ri[itmp] * Ri[jtmp] + Ii[itmp] * Ii[jtmp]; Io[i] = -Ri[itmp] * Ii[jtmp] + Ii[itmp] * Ri[jtmp]; } return; } /*********************************************************** * Function: WV_mult * --------- * Manipulation for Wigner-Ville * * frequency: value of the frequency parameter (double) * Ri,Ii: input signal (real and imag. parts) * Ro,Io: output signal (real and imag. parts) * isize: signal size * ************************************************************/ void WV_mult(int n, double *Ri,double *Ii, double *Ro, double *Io,int isize) { int p,n2; int iplus,iminus; n2 = 2*n; for(p = 0; p < isize; p++) { iplus = (n2 + p + isize/2)%isize; iminus = (n2 - p + 3*isize/2)%isize; Ro[p] = Ri[iplus] * Ri[iminus] + Ii[iplus] * Ii[iminus]; Io[p] = -Ri[iplus] * Ii[iminus] + Ii[iplus] * Ri[iminus]; } return; } /*********************************************************** * Function: WV: * --------- * Continuous Wigner-Ville transform. * * input: input signal * Oreal, Oimage: Wigner Ville transform * (real and imaginary parts) * pinputsize: signal size * pnbfreq: Number of values for the frequency * pfreqstep: frequency step * ***********************************************************/ void WV(double *input,double *Oreal,double *Oimage,int *pnbfreq, double *pfreqstep,int *pinputsize) { int nbfreq, i, p, k, inputsize, locsize; double freqstep; double *Ri1, *Ii1, *Ii, *Ri, *tmpreal, *tmpimage; /* Initialization of S variables */ nbfreq = *pnbfreq; freqstep = *pfreqstep; inputsize = *pinputsize; locsize = 2*inputsize; /* Memory allocation */ if(!(Ri = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri in WV.c \n"); if(!(Ii = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii in WV.c \n"); if(!(Ri1 = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri1 in WV.c \n"); if(!(Ii1 = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii1 in WV.c \n"); if(!(tmpreal = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for tmpreal in WV.c \n"); if(!(tmpimage = (double *)S_alloc(locsize, sizeof(double)))) Rf_error("Memory allocation failed for tmpimage in WV.c \n"); /* Load signal for FFT */ for(i = 0; i < inputsize; i++){ *Ri = (double)(*input); Ri++; input++; } Ri -= inputsize; input -= inputsize; /* Compute short FFT of the signal */ double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); /* Interpolate and analytize */ for(i=1+3*inputsize/2;i /**************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" /* Multiplication of complex-valued signals: ----------------------------------------- Ri1,Ii1: Real and imaginary parts of signal 1 Ri2,Ii2: Real and imaginary parts of signal 2 Or,Oi: Real and imaginary parts of output signal */ void multiply(Ri1,Ii1,Ri2,Ii2,Or,Oi,isize) double *Ri1, *Ri2, *Ii1, *Ii2, *Or, *Oi; int isize; { int i; for(i = 0; i < isize; i++) { *Or = (*Ri1)*(*Ri2) - (*Ii1)*(*Ii2); *Oi = (*Ii1)*(*Ri2) + (*Ri1)*(*Ii2); Or++; Oi++; Ri1++; Ii1++; Ri2++; Ii2++; } //return; } Rwave/src/dwkernel.c0000644000176200001440000001160713064230076014112 0ustar liggesusers#include /*******************************************************************/ /* (c) Copyright 1997 */ /* by */ /* Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang */ /* Princeton University */ /* All right reserved */ /*******************************************************************/ #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: fexp2: * ---------------- * returning a double number of power of 2^j * * j: exponent * ****************************************************************/ /* 2^j (j can be >= 0 or < 0 ) */ double fexp2(j) int j; { int k; double s; s = 1.0; if (j >= 0) { return( (double)(1 << j)); } else { for (k = j; k < 0 ; k++) s /= 2.0; return(s); } } /**************************************************************** * Function: wavelet_transform_gradient: * ------------------------------------- * Computation of the derivative of the wavelet transform along spatial * * grad: derivative of wavelet transform * s: wavelet transform * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void wavelet_transform_gradient( grad, s, max_resoln, np ) double **grad; double **s; int max_resoln; int np; { int j,t; int np_minus1 = np - 1; for ( j = 1; j <= max_resoln; j++ ) { for ( t = 0 ; t < np_minus1; t++) grad[j][t] = s[j][t+1] - s[j][t]; grad[j][t] = 0.0; } } /**************************************************************** * Function: signal_K_compute: * --------------------------- * Computation of kernel * * K: kernel * W: wavelet transform * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void signal_K_compute(K,W,max_resoln,np ) double ***K; double **W; int max_resoln; int np; { int j, z, y, x, t, i; double sum; double **grad_W, *k_tilda; double fexp2(); if(!(grad_W = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for grad_pis in K_compute.c \n"); if(!(k_tilda = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for k_tilda in K_compute.c \n"); for(i = 1; i <= max_resoln; i++) if(!(grad_W[i] = (double *)R_alloc(np , sizeof(double)))) Rf_error("Memory allocation failed for grad_W[] in K_compute.c \n"); wavelet_transform_gradient( grad_W, W, max_resoln, np ); for ( z = 0; z < np; z++ ) { for ( j = 1, sum = 0.0; j <= max_resoln; j++ ) { for ( x = 0; x < np; x++ ) { y = (x+z)%np; sum += W[j][x] * W[j][y] + fexp2(j) * grad_W[j][x] * grad_W[j][y]; } } k_tilda[z] = sum; } /* output_signal( k_tilda, np, "signal_k_tilda"); */ /**************************************************************/ /* we compute K in the following ... k is two dimensional and */ /* k_tilda is one dimensional ... */ /**************************************************************/ if(!((*K)=(double **) R_alloc( (np+1) , sizeof(double *)))) Rf_error("Memory allocation failed for *k in K_compute.c \n"); for ( t = 0; t <= np; t++ ) if(!((*K)[t] = (double *) R_alloc( (np+1) , sizeof(double) ))) Rf_error("Memory allocation failed for (*k)[] in K_compute.c \n"); for ( t = 0; t < np; t++ ) { for ( i = t, z = 0; i < np; i++, z++ ) (*K)[t+1][i+1] = (*K)[i+1][t+1] = k_tilda[z]; } /* output_array( *K, np,np,"signal_K_matrix" ); */ //for(i = 0; i <= max_resoln; i++) // free( grad_W[i]); } /**************************************************************** * Function: signal_tilda_adjust: * ------------------------------ * Adjustment of the size of (w)k_tilda for a signal (w)k_tilda read * from disk ... * * tilda: (w)k_tilda * ksize: size of (w)k_tilda required * fname: name of (w)k_tilda is stored * fsize: size of (w)k_tila in file * ****************************************************************/ /* please don't write to disk void signal_tilda_adjust(tilda,ksize,fname,fsize) double **tilda; char *fname; int fsize, ksize; { double *tmp; int i, j, k, l, m, n; int rsize, middle, rest; if(!(*tilda = (double *)malloc(sizeof(double) * ksize))) Rf_error("Memory allocation failed for *tilda in K_op.c \n"); signal_zero(*tilda, ksize); input_signal(fname, &tmp, fsize); rsize = min(ksize, fsize)/2; for(i= 0; i < rsize; i++) (*tilda)[i] = tmp[i]; for(i= 1; i <= rsize; i++) { k = fsize - i; m = ksize - i; (*tilda)[m] = tmp[k]; } free(tmp); } */ Rwave/src/ridge_annealing.c0000644000176200001440000002224713064230076015407 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Sridge_annealing: * -------------------------- * Ridge caracterisation from annealing * * smodulus: smoothed modulus of the wavelet transform * cost: cost function * phi: ridge * lambda: coefficient in front of phi' in the cost function * mu: coefficient in front of phi'' in the cost function * c: constant on the temperature schedule * sigsize: signal size * nscale: total number of scales for CWT * iteration: maximal number of iterations for the annealing * stagnant: allowed number of consecutive steps without * move (stopping criterion) * seed: seed for random number generator * count: number of iterations * sub: subsampling rate for ridge extraction * blocksize: subsampling of the cost function in cost * blocksize=1 means that the whole cost function * is returned * smodsize: the size of subsampled signal ****************************************************************/ void Sridge_annealing(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, double *pc, int *psigsize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize) { int i,sigsize,ncount,iteration,up,pos,num,a,count, costcount,sub; long idum=-9; int again, tbox, blocksize,smodsize; int nscale, stagnant, recal; double lambda, c, mu; double *bcost, *phi2; double ran, gibbs; double cost1; double temperature, tmp=0.0; /* FILE *fp; */ /* Generalities; initializations -----------------------------*/ mu = *pmu; stagnant = *pstagnant; nscale = *pnscale; iteration = *piteration; lambda = *plambda; c = *pc; sigsize = *psigsize; idum = *pseed; sub = *psub; blocksize = *pblocksize; smodsize = *psmodsize; recal = 1000000; /* recompute cost function every 'recal' iterations */ if(!(bcost = (double *) R_alloc(blocksize, sizeof(double) ))) Rf_error("Memory allocation failed for bcost at ridge_annealing.c \n"); if(!(phi2 = (double *)S_alloc((smodsize+1)*sub,sizeof(double)))) Rf_error("Memory allocation failed for phi2 at ridge_annealing.c \n"); /* if(blocksize != 1) { if((fp = fopen("annealing.cost","w")) == NULL) Rf_error("can't open file at ridge_annealing.c \n"); } */ tbox = 0; ncount = 0; /* count for cost */ count = 0; /* total count */ temperature = c/log(2. + (double)count); /* Initial temperature */ cost1 = 0; /* Smooth and subsample the wavelet transform modulus --------------------------------------------------*/ /* smoothwt(modulus,smodulus,sigsize,nscale,sub); */ /* smoothwt2(modulus,smodulus,sigsize,nscale,sub, &smodsize); */ /* printf("smodsize=%d\n",smodsize); */ /* for(i=0;i= stagnant) { cost[ncount++] = (double)cost1; *pcount = ncount; /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ splridge(sub, phi, smodsize, phi2); for(i=0;i= iteration) { cost[ncount++] = (double)cost1; *pcount = ncount; /* Write cost function to a file -----------------------------*/ /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ splridge(sub, phi, smodsize, phi2); for(i=0;i /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Sridge_coronoid: * -------------------------- * Ridge caracterisation from annealing; * Modification of Sridge_annealing, the cost function is * replaced with another one, in which the smoothness penalty * is proportional to the transform modulus. * * smodulus: smoothed modulus of the wavelet transform * cost: cost function * noise: additional potential (coming from learning the noise) * phi: ridge * lambda: coefficient in front of phi'' in the cost function * mu: coefficient in front of phi' in the cost function * c: constant on the temperature schedule * sigsize: signal size * nscale: total number of scales for CWT * iteration: maximal number of iterations for the annealing * stagnant: allowed number of consecutive steps without * move (stopping criterion) * seed: seed for random number generator * count: number of iterations * sub: subsampling rate for ridge extraction * costsub: subsampling of the cost function in cost * costsub=1 means that the whole cost function * is returned * smodsize: the subsampling size of signal size ****************************************************************/ void Sridge_coronoid(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, double *pc, int *psigsize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize) { int i,sigsize,ncount,iteration,up,pos,num,a,count,costcount,sub; long idum=-9; int again, tbox, blocksize,smodsize; int nscale, stagnant, recal; double lambda, c, mu; double *bcost, *phi2; double ran, gibbs; double cost1; double temperature, tmp=0.0, tmp_cost =0.0, tmp_mod; double der_plus,der_minus,der_sec,der_sec_plus,der_sec_minus; /* FILE *fp; */ /* Generalities; initializations -----------------------------*/ mu = (double)(*pmu); stagnant = *pstagnant; nscale = *pnscale; iteration = *piteration; lambda = (double)(*plambda); c = (double)(*pc); sigsize = *psigsize; idum = (long) (*pseed); sub = *psub; blocksize = *pblocksize; smodsize = *psmodsize; recal = 1000; /* recompute cost function every 'recal' iterations */ if(!(bcost = (double *) R_alloc(blocksize, sizeof(double) ))) Rf_error("Memory allocation failed for bcost at ridge_annealing.c \n"); if(!(phi2 = (double *)S_alloc((smodsize+1)*sub,sizeof(double)))) Rf_error("Memory allocation failed for phi2 at ridge_annealing.c \n"); /* if(blocksize != 1) { if((fp = fopen("annealing.cost","w")) == NULL) Rf_error("can't open file at ridge_annealing.c \n"); } */ tbox = 0; ncount = 0; /* count for cost */ count = 0; /* total count */ temperature = c/log(2. + (double)count); /* Initial temperature */ cost1 = 0; /* Smooth and subsample the wavelet transform modulus --------------------------------------------------*/ /* smoothwt2(modulus,smodulus,sigsize,nscale,sub,&smodsize); */ /* Subsample the initial guess for the ridge -----------------------------------------*/ for(i=0;i= stagnant) { cost[ncount++] = (double)cost1; *pcount = ncount; /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ splridge(sub, phi, smodsize, phi2); for(i=0;i= iteration) { cost[ncount++] = (double)cost1; *pcount = ncount; /* Write cost function to a file -----------------------------*/ /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ splridge(sub, phi, smodsize, phi2); for(i=0;i #include #include #include "dau_wave.h" #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: inverse_wavelet_transform: * ------------------------------------ * Computation of the inversion of dyadic wavelet transform using spline * wavelet. This commands corresponds to the command dw, which computes * dyadic wavelet transform without subsampling at each resolution. * * f_back: reconstructed signal * Sf: multiresolution signals * Wf: wavelet tranform of signal * max_resoln: number of decomposition * np: signal size * filtername: reconstruction filter * ****************************************************************/ void inverse_wavelet_transform(f_back,Sf,Wf,max_resoln,np,filtername) double *f_back, *Sf, *Wf; int max_resoln, np; char *filtername; { int i, j, n, k; double sum; bound *K_bound, *S_bound; double **S, **K; int offset; double *tmp; if(!(tmp = (double *) R_alloc(np , sizeof(double)))) Rf_error("Memory allocation failed for tmp in signal_back.c \n"); KSfilter_bound(filtername,&K_bound,&S_bound,max_resoln); Sfilter_compute(filtername,&S,S_bound,max_resoln); Kfilter_compute(filtername,&K,K_bound,max_resoln); for( i = 0; i < np; i++) f_back[i] = Sf[i]; for ( j = max_resoln; j >= 1 ; j-- ){ for ( n = 0; n < np; n++ ) { sum = 0.0; for ( k = S_bound[j-1].lb; k <= S_bound[j-1].ub; k++ ){ sum += S[j-1][k-S_bound[j-1].lb] * f_back[(n-k+np)%np]; } tmp[n] = sum; } offset = (j - 1) * np; for ( n = 0; n < np; n++ ) { sum = 0.0; for ( k = K_bound[j-1].lb; k <= K_bound[j-1].ub; k++ ) { sum += K[j-1][k-K_bound[j-1].lb] * Wf[offset+(n-k+np)%np]; } tmp[n] = tmp[n] + sum; } signal_copy(tmp,f_back,0,np); } } /**************************************************************** * Function: Sinverse_wavelet_transform: * ------------------------------------- * Called by S plus. * Computation of the inversion of dyadic wavelet transform using spline * wavelet. This command is corresponding to the command dw, which computes * dyadic wavelet transform without subsampling at each resolution. * * f_back: reconstructed signal * Sf: multiresolution signals * Wf: wavelet tranform of signal * max_resoln: number of decomposition * np: signal size * filtername: reconstruction filter * ****************************************************************/ void Sinverse_wavelet_transform(f_back,Sf,Wf,pmax_resoln,pnp,pfiltername) double *f_back, *Sf, *Wf; int *pmax_resoln, *pnp; char **pfiltername; { int np, max_resoln; char *filtername; filtername = *pfiltername; np = *pnp; max_resoln = *pmax_resoln; inverse_wavelet_transform(f_back,Sf,Wf,max_resoln,np,filtername); } Rwave/src/qcksrt.c0000644000176200001440000000356713064230076013614 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ /* Numeric Recipe of C */ #define M 7 #define NSTACK 50 #define FM 7875 #define FA 211 #define FC 1663 #include "Swave.h" void qcksrt(int n, double *arr) { // Rprintf("beg\n"); //arr = (double*)arr; R_rsort(arr, n); //arr = (float*)arr; // Rprintf("end\n"); } /* int l=1,jstack=0,j,ir,iq,i; int istack[NSTACK+1]; long int fx=0L; float a; ir=n; for (;;) { if (ir-l < M) { for (j=l+1;j<=ir;j++) { a=arr[j]; for (i=j-1;arr[i]>a && i>0;i--) arr[i+1]=arr[i]; arr[i+1]=a; } if (jstack == 0) return; ir=istack[jstack--]; l=istack[jstack--]; } else { i=l; j=ir; fx=(fx*FA+FC) % FM; iq=l+((ir-l+1)*fx)/FM; a=arr[iq]; arr[iq]=arr[l]; for (;;) { while (j > 0 && a < arr[j]) j--; if (j <= i) { arr[i]=a; break; } arr[i++]=arr[j]; while (a > arr[i] && i <= n) i++; if (j <= i) { arr[(i=j)]=a; break; } arr[j--]=arr[i]; } if (ir-i >= i-l) { istack[++jstack]=i+1; istack[++jstack]=ir; ir=i-1; } else { istack[++jstack]=l; istack[++jstack]=i-1; l=i+1; } if (jstack > NSTACK){ printf("NSTACK too small in QCKSRT"); return; } } } } */ #undef M #undef NSTACK #undef FM #undef FA #undef FC Rwave/src/mreconst.c0000644000176200001440000001366013064230076014132 0ustar liggesusers#include /****************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * ******************************************************************/ #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: signal_penalty_function: * ---------------------------------- * Reconstruction of signal which preserves the locations and * values of extrema * * f: reconstructed signal * lambda: Lagragian multiplier * W_tilda: dual wavelet * ext: extrema representation * num_of_extrema: number of extrema * np: signal size * ****************************************************************/ void signal_penalty_function(double *f, double *lambda, double **W_tilda, image_ext *ext, int num_of_extrema, int np) { int s, t; for ( t = 0; t < np; t++ ) { for ( s = 0, f[t] = 0.0; s < num_of_extrema; s++ ) f[t] += lambda[s] * W_tilda[ext[s].resoln][(ext[s].x-t+np)%np]; } return; } /**************************************************************** * Function: signal_position: * -------------------------- * Position matrix of the extrema of a signal * * filtername: filter name * lambda: Lagragian multiplier * ext: extrema representation * Wtilda: * W: * num_of_extrema: number of extrema * max_resoln: number of decomposition * np: signal size * ****************************************************************/ void signal_position(char *filtername, double **lambda, image_ext *ext, double **Wtilda, double **W, int num_of_extrema, int max_resoln, int np) { int s, r, i, j, diff; bound *psi, *phi; bound *H_bound, *G_bound; /* char filename[STRING_SIZE]; */ double **position_matrix, *w, **v; double sum; int p, x; double *b; int *indx; if(!(indx = (int *) R_alloc(num_of_extrema , sizeof(int)))) Rf_error("Memory allocation failed for indx in signal_position.c \n"); HGfilter_bound(filtername,&H_bound,&G_bound,max_resoln); PsiPhifilter_bound( &psi, &phi, H_bound, G_bound, max_resoln ); if(!(position_matrix = (double **) R_alloc(num_of_extrema , sizeof(double *) ))) Rf_error("Memory allocation failed for position matrix in image_lambda \n"); for ( r = 0; r < num_of_extrema; r++ ) if(!(position_matrix[r] = (double *) R_alloc((num_of_extrema) , sizeof(double) ))) Rf_error("Memory allocation failed for position_matrix[] in image_lambda \n"); for ( r = 0; r < num_of_extrema; r++ ) { i = ext[r].resoln; for ( s = 0; s < num_of_extrema; s++ ) { j = ext[s].resoln; diff = ext[s].x - ext[r].x; sum = 0.0; for (x = psi[i].lb; x <= psi[i].ub; x++ ) { p = (diff+x+2 * np)%np; sum += W[i][(x+np)%np] * Wtilda[j][p]; } position_matrix[r][s] = sum; } } /* init_filename(filename); */ /* filename_given(filename,"signal_POS"); */ /* printf("num_of_extrema = %d \n",num_of_extrema); */ /* output_array(position_matrix,num_of_extrema,num_of_extrema,filename); */ /**************************************************/ /* solve lambda from position_matrix (lambda) = b */ /**************************************************/ if(!(*lambda = (double *) R_alloc(num_of_extrema , sizeof(double) ))) Rf_error("Memory allocation failed for lambda in image_position.c \n"); if(!(b = (double *) R_alloc( num_of_extrema , sizeof(double)))) Rf_error("Memory allocation failed for b in image_position.c \n"); for ( i = 0; i < num_of_extrema; i++ ) { b[i] = ext[i].W1f; } /* for ( i = 0; i < num_of_extrema; i++ ) { (*lambda)[i] = ext[i].W1f; } ludcmp(position_matrix-1,num_of_extrema,indx-1,&d); printf("here"); lubksb(position_matrix-1,num_of_extrema,indx-1,(*lambda)-1); printf("There"); */ svdecomp_solve(position_matrix,b,*lambda,num_of_extrema, num_of_extrema,&w,&v); } /**************************************************************** * Function: extrema reconstruction: * --------------------------------- * Called by Splus. * Reconstruction of a signal which preserves the location and value * at the extrema representation * * filtername: filter name * f: reconstructed signal * extrema: extrema representation * max_resoln_ptr: pointer to number of decomposition * np_pr: pointer to signal size * preadfile: if set to TRUE, the kernel is read from files that * are precomputed and stored in the local directory. OW, Compute * the kernel, this usually takes quite some time if the size of * signal is large. * ****************************************************************/ void extrema_reconst(char *filtername, double *f, double *extrema, int *max_resoln_ptr, int *np_ptr, int *preadfile) { double **W, **S; double **W_tilda; double **K; int max_resoln = *max_resoln_ptr; int np = *np_ptr; int readfileflag = *preadfile; image_ext *ext; double *lambda; int num_of_extrema; signal_W_S(&W, &S, max_resoln, np); if(!readfileflag) { signal_K_compute(&K, W, max_resoln, np); // printf("K "); signal_W_tilda(&W_tilda, W, K, max_resoln,np); //printf("W "); } else { signal_W_tilda_input(&W_tilda, max_resoln, np); } extrema_input(extrema,max_resoln,np,&ext,&num_of_extrema); signal_position(filtername,&lambda,ext,W_tilda,W,num_of_extrema, max_resoln,np); signal_penalty_function(f,lambda,W_tilda,ext,num_of_extrema,np); //free( lambda ); //free( ext ); /* for ( j = 0; j <= max_resoln; j++ ) { free( W[j] ); free S[j] ); free( W_tilda[j] ); } free( W ); free( S ); free( W_tilda ); return; */ } Rwave/src/smoothwt.c0000644000176200001440000001246013064230076014161 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /*************************************************************** * Function: smoothwt * --------- * Compute a smoothed and subsampled (in the b direction) * version of the wavelet transform modulus. * Here: rectangular window of size windowsize * * wt: original wavelet transform modulus. * swt: smoothed wavelet transform modulus. ***************************************************************/ void smoothwt(double *wt, double *swt, int sigsize, int nbscale, int windowlength) { int a,b,k,adr, cnt=0; double normal; normal = (double)(2*windowlength -1); for(a = 0; a < nbscale; a++){ for(b = 0; b < sigsize; b += windowlength){ for(k = 1-windowlength; k< windowlength; k++){ adr = (b-k+sigsize)%sigsize; adr += a*sigsize; *swt += wt[adr]; } *swt /= normal; swt++; cnt++; } } Rprintf("smoothing done\n"); /* printf("%d coefficients computed\n",cnt);*/ return; } /*************************************************************** * Function: smoothwt1 * --------- * Compute a smoothed (but not subsampled) * version of the wavelet transform modulus. * Here: rectangular window of size windowsize * * wt: original wavelet transform modulus. * swt: smoothed wavelet transform modulus. ***************************************************************/ void smoothwt1(double *wt, double *swt, int sigsize, int nbscale, int windowlength) { int a,b,k,adr,cnt=0; double normal; normal = (double)(2*windowlength -1); for(a = 0; a < nbscale; a++){ for(b = 0; b < sigsize; b ++){ for(k = 1-windowlength; k< windowlength; k++){ adr = (b-k+sigsize)%sigsize; adr += a*sigsize; *swt += wt[adr]; } *swt /= normal; swt++;cnt++; } } Rprintf("smoothing done\n"); Rprintf("%d coefficients computed\n",cnt); return; } /*************************************************************** * Function: smoothwt2 * --------- * Compute a smoothed and subsampled (in the b direction) * version of the wavelet transform modulus. * Here: rectangular window of size windowsize * * wt: original wavelet transform modulus. * swt: smoothed wavelet transform modulus. * smodsize: actual length of the smoothed transform. ***************************************************************/ void smoothwt2(double *wt, double *swt, int sigsize, int nbscale, int windowlength, int *smodsize) { int a,b,k,adr,kmin,kmax; double normal; int cnt = 0; Rprintf("smodsize %d \n",*smodsize); Rprintf("number of scales %d \n",nbscale); Rprintf("windowlength %d \n",windowlength); for(a = 0; a < nbscale; a++){ for(b = 0; b < sigsize; b += windowlength){ kmin = max(0,1-windowlength+b); kmax = min(sigsize-1,windowlength+b); normal = (double)(kmax-kmin+1); for(k = kmin; k<= kmax; k++){ /* adr = (b-k+sigsize)%sigsize; adr += a*sigsize; */ adr = k + a*sigsize; *swt += wt[adr]; } *swt /= normal; swt++; cnt++; } } if((cnt%nbscale) != 0){ Rprintf("Error in smoothwt2\n"); /* exit(0); */ return; } *smodsize = cnt/nbscale; Rprintf("smoothing done\n"); Rprintf("%d coefficients computed\n",cnt); return; } /**************************************************************** * Function: Smodulus_smoothing: * ---------------------------- * Smoothing and subsampling the modulus of transform * * modulus: modulus of the wavelet transform * smodulus: modulus smoothed by a box function * sigsize: signal size * modsize: signal size after subsampling * nscale: total number of scales for CWT * subrate: subsampling rate for ridge extraction * ****************************************************************/ void Smodulus_smoothing(double *modulus, double *smodulus, int *psigsize, int *psmodsize, int *pnscale, int *psubrate) { int sigsize,sub; int smodsize; int nscale; /* Generalities; initializations -----------------------------*/ nscale = *pnscale; sigsize = *psigsize; smodsize = *psmodsize; sub = *psubrate; /* Smooth and subsample the wavelet transform modulus --------------------------------------------------*/ smoothwt2(modulus,smodulus,sigsize,nscale,sub, &smodsize); *psmodsize = smodsize; return; } /*************************************************************** * Function: Ssmoothwt * --------- * Interface between the 2 previous functions and S code. ***************************************************************/ void Ssmoothwt(double *smodulus,double * modulus, int *psigsize, int *pnscale, int *psubrate, int *pflag) { int sigsize, nscale, subrate; int flag; flag = *pflag; sigsize = *psigsize; nscale = *pnscale; subrate = *psubrate; if(flag) smoothwt1(modulus,smodulus,sigsize,nscale,subrate); else smoothwt(modulus,smodulus,sigsize,nscale,subrate); return; } Rwave/src/rwkernel.c0000644000176200001440000003471013064230076014130 0ustar liggesusers#include #include "Swave.h" /*************************************************************** * $Log: kernel.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "rwkernel.h" /****************************************************************** * Function: integrand * --------- * Evaluates the integrand for Romberg integration. * * b: center position of wavelets and derivatives. * x,y: Integration variables. * p2: second derivative of ridge function. * nodes, phi_nodes: position and scale of the nodes of the ridge. * (warning: this is the real scale, and not its log). * nb_nodes: number of nodes of the ridge. * w0: central frequency of Morlet's wavelet. *******************************************************************/ fcomplex integrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double w0) { fcomplex ctmp,psi_x,psi_y,psiprime_x,psiprime_y; double xpos,ypos,xpos0,ypos0,phi_b2,tmp,phi_b,phip_b,w02; fcomplex integ; integ.r =0.0; integ.i = 0.0; w02 = w0 * w0; /* Spline interpolation of the ridge; computation of its derivative ---------------------------------------------------------------*/ splint2(nodes,phi_nodes,p2,nb_nodes,b,&phi_b,&phip_b); /* Evaluation of the integrand --------------------------*/ xpos0 = x-b; xpos = xpos0/phi_b; ypos0 = y-b; ypos = ypos0/phi_b; phi_b2 = phi_b * phi_b; psi_x = psi(xpos,w0); psiprime_x = psiprime(xpos,w0); psi_y = psi(ypos,w0); psiprime_y = psiprime(ypos,w0); /* psi_psi term */ integ = Cmul(psi_y,Conjg(psi_x)) ; tmp= (phip_b*phip_b - w02); ctmp=Complex(tmp,0); integ = Cmul(integ,ctmp); /* psiprime_psiprime term */ ctmp=Complex(1.0 + xpos + ypos + xpos*ypos,0); ctmp = Cmul(ctmp,Conjg(psiprime_x)); ctmp = Cmul(ctmp,psiprime_y); integ = Cadd(integ,ctmp); /* psi_psiprime terms */ tmp = 1. + ypos; ctmp = Complex(tmp*phip_b,0.); ctmp = Cmul(ctmp,Conjg(psi_x)); ctmp = Cmul(ctmp,psiprime_y); integ = Cadd(integ,ctmp); tmp = 1. + xpos; ctmp = Complex(tmp*phip_b,0.); ctmp = Cmul(ctmp,Conjg(psiprime_x)); ctmp = Cmul(ctmp,psi_y); integ = Cadd(integ,ctmp); /* normalisation */ tmp =phi_b2*phi_b2; ctmp = Complex(1/tmp,0); integ = Cmul(integ,ctmp); return (integ); } /****************************************************************** * Function: rintegrand * --------- * Evaluates the integrand for Romberg integration, in the * case of a real valued wavelet kernel. * * b: center position of wavelets and derivatives. * x,y: Integration variables. * p2: second derivative of ridge function. * nodes, phi_nodes: position and scale of the nodes of the ridge. * (warning: this is the real scale, and not its log). * nb_nodes: number of nodes of the ridge. * w0: central frequency of Morlet's wavelet. *******************************************************************/ double rintegrand(double b,int x,int y,double *p2,double *nodes, double *phi_nodes,int nb_nodes,double w0) { fcomplex psi_x,psi_y,psiprime_x,psiprime_y; double xpos,ypos,xpos0,ypos0,phi_b2,tmp,phi_b,phip_b,w02; double integ; integ =0.0; w02 = w0 * w0; /* Spline interpolation of the ridge; computation of its derivative ---------------------------------------------------------------*/ splint2(nodes,phi_nodes,p2,nb_nodes,b,&phi_b,&phip_b); /* Evaluation of the integrand --------------------------- */ xpos0 = x-b; xpos = xpos0/phi_b; ypos0 = y-b; ypos = ypos0/phi_b; phi_b2 = phi_b * phi_b; psi_x = psi(xpos,w0); psiprime_x = psiprime(xpos,w0); psi_y = psi(ypos,w0); psiprime_y = psiprime(ypos,w0); /* psi_psi term */ integ = (psi_y).r * (psi_x).r + (psi_y).i * (psi_x).i ; tmp= (phip_b*phip_b - w02); integ *= tmp; /* psiprime_psiprime term */ tmp=1.0 + xpos + ypos + xpos*ypos; tmp *= ((psiprime_y).r*(psiprime_x).r + (psiprime_y).i*(psiprime_x).i); integ += tmp; /* psi_psiprime terms */ tmp = 1. + ypos; tmp *= phip_b; tmp *= ((psiprime_y).r*(psi_x).r + (psiprime_y).i*(psi_x).i); integ += tmp; tmp = 1. + xpos; tmp *= phip_b; tmp *= ((psi_y).r*(psiprime_x).r + (psi_y).i*(psiprime_x).i); integ += tmp; /* normalisation */ tmp =phi_b2*phi_b2; integ /= tmp; return (integ); } /****************************************************************** * Function: maxvalue * --------- * Maximal element of an array * * vector: array whose maximal element is seeked. * length: length of the array. *******************************************************************/ double maxvalue(double *vector, int length) { double maxi; int i; maxi=0; for(i=0; i< length; i++){ maxi = MAX(maxi,*vector); vector++; } return maxi; } /********************************************************* * Function: hermite_sym * --------- * Complete a matrix by Hermite symmetry * * ker: matrix to be filled in. * lng: number of rows (and columns) of the matrix. **********************************************************/ void hermite_sym(fcomplex *ker,int lng) { int i,j; for (i=0;ii;j--){ /* ker[i*lng +j] = Conjg(ker[j*lng +i]);*/ (ker[i*lng +j]).r = (ker[j*lng +i]).r; (ker[i*lng +j]).i = -(ker[j*lng +i]).i; } } return; } /*********************************************************** * Function: kernel * --------- * Computation of the kernel * * ker_r, ker_i: real and imaginary parts of the kernel. * px_min, px_max: limiting values for the integration. * px_inc: distance between 2 consecutive x,y values. * plng:length * nodes, phi_nodes: position and (true) scale of the * samples of the ridge. * pnb_nodes: number of nodes of the sampled ridge. * pw0: central frequency of Morlet'x wavelet. * pb_start, pb_end: integration bounds. ************************************************************/ void rwkernel(double *ker_r, double *ker_i,int *px_min,int *px_max, int *px_inc, int *plng, double *nodes,double *phi_nodes, int *pnb_nodes,double *pw0,double *pb_start,double *pb_end) { double *p2, b_start=*pb_start, b_end=*pb_end, w0=*pw0; double phimax, b_lo,b_hi; int x,y; int x_min=*px_min,x_max=*px_max,x_inc=*px_inc; int lng=*plng,nb_nodes=*pnb_nodes; int i=0,up_bound,gamma_min,lng2; fcomplex *ker,*p_tmp; p2 = (double *)S_alloc(nb_nodes,sizeof(double)); ker = (fcomplex *)S_alloc(lng*lng,sizeof(fcomplex)); p_tmp=ker; /* mark the first element of ker */ phimax = maxvalue(phi_nodes,nb_nodes); up_bound = (int)(phimax * sqrt(-2.0 * log(EPS))+1); lng2=lng*lng; /* Compute second derivative of the ridge for spline interpolation ---------------------------------------------------------------*/ spline(nodes-1,phi_nodes-1,nb_nodes,(double)0,(double)0,p2-1); /* Integrate --------*/ for(x=x_min;x<=x_max;x+=x_inc){ /* fprintf(stderr,"x = %d; ", x); fflush(stderr); */ /* Evaluate the range of computation of the kernel */ gamma_min = MAX(x_min,(x-2*up_bound) -(x-x_min-2*up_bound)%x_inc); ker += (gamma_min-x_min)/x_inc; i = (gamma_min-x_min)/x_inc; for(y = gamma_min; y <= x; y+=x_inc){ /* Estimation of integration bounds */ b_lo = MAX(MAX(x-2*up_bound,y-2*up_bound),b_start); b_hi = MIN(MIN(x+2*up_bound,y+2*up_bound),b_end); /* Evaluation of the kernel */ *ker = qrombmod(x,y,p2-1,nodes,phi_nodes,nb_nodes,w0,b_lo,b_hi); ker++; i++; } ker -= (i - lng) ; } ker = p_tmp; /* Finish to fill in the kernel by Hermite symmetry -----------------------------------------------*/ /* printf("Now going to hermite_sym\n");*/ hermite_sym(ker,lng); /* i=0; for(x=x_min;x<=x_max;x+=x_inc){ for(y=x_min;y<=x_max;y+=x_inc){ *ker_r = ker->r; ker_r++; *ker_i = ker->i; ker_i++; ker++; i++; } } ker -= i; ker_r -= i; ker_i -= i; */ /* printf("Now loading in ker_r and ker_i\n");*/ for(i=0;ir; ker_r++; *ker_i = ker->i; ker_i++; ker++; } ker -= lng2; ker_r -= lng2; ker_i -= lng2; } /*********************************************************** * Function: rkernel * --------- * Computation of the kernel * * ker_r, ker_i: real and imaginary parts of the kernel. * x_min, x_max: limiting values for the integration. * x_inc: distance between 2 consecutive x,y values. * nodes, phi_nodes: position and scale of the samples * of the ridge. * nb_nodes: number of nodes of the sampled ridge. * b_start, b_end: integration bounds. ************************************************************/ void rkernel(double *ker,int *px_min,int *px_max,int *px_inc, int *plng, double *nodes,double *phi_nodes,int *pnb_nodes, double *pw0,double *pb_start,double *pb_end) { double *p2, b_start=*pb_start, b_end=*pb_end, w0=*pw0; double phimax, b_lo,b_hi; int x,y; int x_min=*px_min,x_max=*px_max,x_inc=*px_inc,lng=*plng,nb_nodes=*pnb_nodes; int i=0,up_bound,gamma_min,lng2; double *p_tmp; p2 = (double *)S_alloc(nb_nodes,sizeof(double)); p_tmp=ker; /* mark the first element of ker */ phimax = maxvalue(phi_nodes,nb_nodes); up_bound = (int)(phimax * sqrt(-2.0 * log(EPS))+1); lng2=lng*lng; /* Compute second derivative of the ridge for spline interpolation ---------------------------------------------------------------*/ spline(nodes-1,phi_nodes-1,nb_nodes,(double)0,(double)0,p2-1); /* Integrate --------*/ for(x=x_min;x<=x_max;x+=x_inc){ /* fprintf(stderr,"x = %d; ", x); fflush(stderr); */ /* Evaluate the range of computation of the kernel */ gamma_min = MAX(x_min,(x-2*up_bound) -(x-x_min-2*up_bound)%x_inc); ker += (gamma_min-x_min)/x_inc; i = (gamma_min-x_min)/x_inc; for(y = gamma_min; y <= x; y+=x_inc){ /* Estimation of integration bounds */ b_lo = MAX(MAX(x-2*up_bound,y-2*up_bound),b_start); b_hi = MIN(MIN(x+2*up_bound,y+2*up_bound),b_end); /* Evaluation of the kernel */ *ker = rqrombmod(x,y,p2-1,nodes,phi_nodes,nb_nodes,w0,b_lo,b_hi); ker++; i++; } ker -= (i - lng) ; } ker = p_tmp; /* Finish to fill in the kernel by Hermite symmetry -----------------------------------------------*/ /* printf("Now going to hermite_sym\n");*/ ghermite_sym(ker,lng); /* for(i=0;ir; ker_r++; *ker_i = ker->i; ker_i++; ker++; i++; } } ker -= i; ker_r -= i; ker_i -= i; */ /* printf("Now loading in ker_r and ker_i\n");*/ for(i=0;ir; ker_r++; *ker_i = ker->i; ker_i++; ker++; } ker -= lng2; ker_r -= lng2; ker_i -= lng2; } /********************************************************* * Function: psi * --------- * Computation of the wavelet * * x: location of the wavelet * w0: center frequency of Morlet's wavelet **********************************************************/ fcomplex psi(double x,double w0) { double u; u=exp(-x*x/2.); return(Cmul(Complex(u,0.0),Complex(cos(w0*x),sin(w0*x)))); } /********************************************************* * Function: psiprime * --------- * Computation of the wavelet derivative * * x: location of the wavelet * w0: center frequency of Morlet's wavelet **********************************************************/ fcomplex psiprime(double x,double w0) { double u; fcomplex v; u=exp(-x*x/2.); v = Complex(-x,w0); v = Cmul(v,Complex(u,0.0)); return(Cmul(v,Complex(cos(w0*x),sin(w0*x)))); } Rwave/src/dau_wave.c0000644000176200001440000001774713064230076014105 0ustar liggesusers#include /* #include "wavelet.h" */ #include "dau_wave.h" /****************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * ******************************************************************/ #include "Swave.h" /*****************************************************************************/ /* These constants are not used in the program. #define pi 3.141592653589793 #define NW 6 #define XMIN -1.0 #define XMAX 14 #define NPT 200 #define TWOTEN 1024 #define TWOFIVE 512 */ /* NMIN and NMAX are defined in dau_wave.h #define NMIN 2 #define NMAX 10 */ #define NMAXPLUS1 11 #define NITER 8 /* Number of iterations to compute the final array of a's */ #define TwoToNITER 256 #define SQR2 1.4142135 /*****************************************************************************/ int taille; /* largest index of a nonzero a */ /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ /* BEGINNING OF WAVE_COEF.C */ /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ int open_read() { int n; c = (double **)R_alloc(NMAXPLUS1,sizeof(double *)); for (n=NMIN;n=0)) a[i] += c[NW][i-2*j] * tmpa[j]; a[i] *= SQR2; } } return(0); } /***********************************************************/ /** phi & psi wavelet computation **/ /** **/ /** Uses the array a computed in the main program **/ /***********************************************************/ double phi(x) double x; { if ( (x < 0.0) || (x >= (taille+1)/TwoToNITER) ) return 0.0; else return a[(int)floor(TwoToNITER*x)]; } /***************************************************************/ double Psi(x) double x; { int i; double tmp, minus; tmp = 0; minus = 1.0; for( i=0 ; i < 2*NW ; i++ ) { minus *= -1.0; tmp += minus * c[NW][i] * phi(2 * x + i -1); } return (SQR2 * tmp); } /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ /* END OF WAVE_COEF.C */ /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/ /*****************************************************************************/ /* INITIALIZE TWOTO */ /*****************************************************************************/ void init_twoto( max_resoln ) int max_resoln; { int j; twoto = (int *) R_alloc((max_resoln+1) , sizeof(int)); twoto[0] = 1; for ( j = 1; j <= max_resoln; j++ ) twoto[j] = 2*twoto[j-1]; } /****************************************************************************/ /* INITIALIZE PHI ARRAY */ /****************************************************************************/ void init_phi_array( phi_array, max_resoln ) double **phi_array; int max_resoln; { double inc = 1.0 / pow( 2.0, (double) max_resoln ); int array_size = (2*NW-1) * twoto[max_resoln] +1; double arg; int i; *phi_array = (double *) R_alloc( array_size , sizeof(double) ); for ( arg = 0.0, i = 0; i < array_size; arg += inc, i++ ) (*phi_array)[i] = (double) phi( arg ); } /****************************************************************************/ /* INITIALIZE PSI ARRAY */ /****************************************************************************/ void init_psi_array( psi_array, max_resoln ) double **psi_array; int max_resoln; { double inc = 1.0 / pow( 2.0, (double) max_resoln ); int array_size = (2*NW -1) * twoto[max_resoln] +1; double arg; int i; *psi_array = (double *) R_alloc( array_size , sizeof(double) ); for ( arg = 0.0, i = 0; i < array_size; arg += inc, i++ ) (*psi_array)[i] = (double) Psi( arg - NW ); } Rwave/src/spline.c0000644000176200001440000000256413064230076013573 0ustar liggesusers#include #include "Swave.h" #include "rwkernel.h" #define NRANSI /*************************************************************** * $Log: spline.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ void spline(double x[], double y[], int n, double yp1, double ypn, double y2[]) { int i,k; double p,qn,sig,un,*u; u=(double *)S_alloc(n,sizeof(double))-1; if (yp1 > 0.99e30) y2[1]=u[1]=0.0; else { y2[1] = -0.5; u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1); } for (i=2;i<=n-1;i++) { sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]); p=sig*y2[i-1]+2.0; y2[i]=(sig-1.0)/p; u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]); u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p; } if (ypn > 0.99e30) qn=un=0.0; else { qn=0.5; un=(3.0/(x[n]-x[n-1]))*(ypn-(y[n]-y[n-1])/(x[n]-x[n-1])); } y2[n]=(un-qn*u[n-1])/(qn*y2[n-1]+1.0); for (k=n-1;k>=1;k--) y2[k]=y2[k]*y2[k+1]+u[k]; } #undef NRANSI Rwave/src/extrema.c0000644000176200001440000000545013064230076013743 0ustar liggesusers#include /****************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * *******************************************************************/ #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: modulus_maxima: * ------------------------- * Computation of modulus local maxima of wavelet transform * * extrema: modulus local maxima of wavelet transform * wt: wavelet transform * resoln_ptr: number of decomposition * np_ptr: the signal size * ****************************************************************/ void modulus_maxima(double *extrema, double *wt, int *resoln_ptr, int *np_ptr ) { int resoln = *resoln_ptr; int np = *np_ptr; double *abs; int x, j; int offset; if(!(abs = (double *) R_alloc( np , sizeof(double) ))) Rf_error("Memory allocation failed for abs in extrema.c"); for (j = 0; j < resoln; j++) { offset = j * np; for (x = 0; x < np; x++) abs[x] = fabs( (double) wt[offset+x] ); extrema[offset] = 0.0; extrema[offset+np-1] = 0.0; for ( x = 1; x < (np-1); x++ ) { if (((abs[x] > abs[x-1]) && (abs[x] >= abs[x+1])) || ((abs[x] > abs[x+1]) && (abs[x] >= abs[x-1]))) extrema[offset+x] = wt[offset+x]; else extrema[offset+x] = 0.0; } } } /**************************************************************** * Function: extrema_input: * ------------------------ * Converting extrema representation from array image_ext structure * * extrema: modulus local maxima of wavelet transform * max_resoln: number of decomposition * np: signal size * ext: structure of image_ext * num_of_extrema: number of extrema * ****************************************************************/ void extrema_input(double *extrema, int max_resoln, int np, image_ext **ext, int *num_of_extrema) { int j, k, t, length, offset; length = max_resoln * np; *num_of_extrema = 0; for ( t = 0; t < length; t++ ) if ( extrema[t] != 0.0 ) (*num_of_extrema)++; if(!(*ext = (image_ext *) R_alloc( (*num_of_extrema) , sizeof(image_ext) ))) Rf_error("Memory allocation failed for *ext in point_input.c \n"); k = 0; for ( j = 1; j <= max_resoln; j++ ) { offset = (j-1) * np; for ( t = 0; t < np; t++ ) if ( extrema[offset+t] != 0.0 ) { /* detect one extremum */ (*ext)[k].resoln= j; (*ext)[k].x = t; (*ext)[k].W1f = extrema[offset+t]; k++; } } } Rwave/src/mw.c0000644000176200001440000000565013064230076012723 0ustar liggesusers#include /******************************************************************* * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * *******************************************************************/ #include "Swave.h" #include "dyadic.h" /**************************************************************** * Function: Sf_compute: * --------------------- * Computation of signals from resolution 1 up to resolution * 2^max_resoln * * Sf: resultant signals * f: the original signal * max_resoln: number of decomposition * np: the signal size * filtername: decomposition filter * ****************************************************************/ void Sf_compute(double *Sf, double *f, int *max_resoln_ptr, int *np_ptr, char *filtername) { int max_resoln = *max_resoln_ptr; int np = *np_ptr; int j, n, k, offset; bound *H_bound, *G_bound; double **H, sum; //char *filtername; //filtername = *pfiltername; HGfilter_bound(filtername,&H_bound,&G_bound,max_resoln); Hfilter_compute(filtername,&H,H_bound,max_resoln); for ( j = 0; j <= max_resoln; j++ ) { if ( j == 0 ) { /* Sf[0] = original signal f */ for ( n = 0; n < np; n++ ) Sf[n] = f[n]; } else { offset = (j-1)*np; for ( n = 0; n < np; n++ ) { for ( k = H_bound[j-1].lb, sum = 0.0; k <= H_bound[j-1].ub; k++ ) sum += H[j-1][k-H_bound[j-1].lb] * Sf[offset+(n-k+np)%np]; Sf[j*np+n] = sum; } } } } /**************************************************************** * Function: Wf_compute: * --------------------- * Computation of the wavelet transform of a signal * * Wf: the wavelet transform of a signal * Sf: the multiresolution representation of the original signal * max_resoln: number of decomposition * np: the signal size * filtername: decomposition filter * ****************************************************************/ void Wf_compute(double *Wf, double *Sf, int *max_resoln_ptr, int *np_ptr, char *filtername) { int max_resoln = *max_resoln_ptr; int np = *np_ptr; int j, n, k, offset; //char *filtername; bound *G_bound, *H_bound; double **G, sum; //filtername = *pfiltername; HGfilter_bound(filtername,&H_bound, &G_bound, max_resoln ); Gfilter_compute(filtername,&G, G_bound, max_resoln ); for ( j = 1; j <= max_resoln; j++ ) { offset = (j-1)*np; for ( n = 0; n < np; n++ ) { for ( k = G_bound[j-1].lb, sum = 0.0; k <= G_bound[j-1].ub; k++ ) /* Compute Wf[m] from Sf[m-1] */ sum += G[j-1][k-G_bound[j-1].lb] * Sf[offset+(n-k+np)%np]; Wf[offset+n] = sum; } } } Rwave/src/compinteg.c0000644000176200001440000002241613064230076014264 0ustar liggesusers#include #include "Swave.h" /*************************************************************** * $Log: compinteg.c,v $ * **************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "rwkernel.h" #define JMAX 20 #define JMAXP (JMAX+1) #define K 5 /*************************************************************** * Function: qrombmod * --------- * Romberg quadrature for integration; * complex-valued functions * * x,y: position of the wavelets in the integrand. * b_start, b_end: integration domain. * nodes, phi_nodes: position and scale of the nodes of the ridge. * nb_nodes: number of nodes of the ridge. ****************************************************************/ fcomplex qrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end) { double h[JMAXP+1]; fcomplex ss,dss; fcomplex *s; int j; double tmpr[JMAX+1],tmpi[JMAX+1]; s = (fcomplex *)S_alloc(JMAXP+1,sizeof(fcomplex)); /* Initialisation of tmp arrays */ for(j = 0; j < JMAX+1; j++) tmpi[j] = tmpr[j] = 0.0; h[1]=1.0; /* Loop and test accuracy ----------------------*/ for (j=1;j<=JMAX;j++) { /* Trapezoidal rule */ s[j] = trapzdmod(x,y,p2,nodes,phi_nodes,nb_nodes,cent_freq,b_start,b_end,j); tmpr[j] = (s[j]).r; tmpi[j] = (s[j]).i; /* Rprintf("step=%d ,integral.r=%g12 ,integral.i=%g\n",j,(s[j]).r,(s[j]).i); */ if (j >= K) { /* Polynomial (Lagrange) extrapolation to estimate the limit of the integral as step goes to 0 */ polint(&h[j-K],&tmpr[j-K],(int)K,0.0,&(ss.r),&(dss.r)); polint(&h[j-K],&tmpi[j-K],(int)K,0.0,&(ss.i),&(dss.i)); /* Test accuracy */ if (((fabs(dss.r) < EPS*fabs(ss.r))&&(EPS * fabs(ss.r) > fabs(ss.i))) || ((fabs(dss.i) < EPS*fabs(ss.i))&&(EPS * fabs(ss.i) > fabs(ss.r))) || ((fabs(dss.r) < EPS*fabs(ss.r))&&(fabs(dss.i) < EPS*fabs(ss.i)))) { return ss; } } (s[j+1]).r=(s[j]).r; (s[j+1]).i=(s[j]).i; h[j+1]=0.25*h[j]; } Rprintf("Too many steps in routine qrombmod (x=%d, y=%d) \n",x,y); return(ss); } /*************************************************************** * Function: rqrombmod * --------- * Romberg quadrature for integration of WT kernel; * complex-valued functions * * x,y: position of the wavelets in the integrand. * b_start, b_end: integration domain. * nodes, phi_nodes: position and scale of the nodes of the ridge. * nb_nodes: number of nodes of the ridge. ****************************************************************/ double rqrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end) { double h[JMAXP+1]; double ss,dss; double *s; int j; double tmpr[JMAX+1]; s = (double *)S_alloc(JMAXP+1,sizeof(double)); /* Initialisation of tmp arrays */ for(j = 0; j < JMAX+1; j++) tmpr[j] = 0.0; h[1]=1.0; /* Loop and test accuracy ----------------------*/ for (j=1;j<=JMAX;j++) { /* Trapezoidal rule */ s[j] = rtrapzdmod(x,y,p2,nodes,phi_nodes,nb_nodes,cent_freq,b_start,b_end,j); tmpr[j] = s[j]; /* printf("step=%d ,integral.r=%g12 ,integral.i=%g\n",j,(s[j]).r,(s[j]).i); */ if (j >= K) { /* Polynomial (Lagrange) extrapolation to estimate the limit of the integral as step goes to 0 */ polint(&h[j-K],&tmpr[j-K],(int)K,0.0,&ss,&dss); /* Test accuracy */ if (fabs(dss) < EPS*fabs(ss)) { return ss; } } s[j+1]=s[j]; h[j+1]=0.25*h[j]; } Rprintf("Too many steps in routine rqrombmod (x=%d, y=%d) \n",x,y); return(ss); } /*************************************************************** * Function: gqrombmod * --------- * Romberg quadrature for integration; * real-valued functions * * x,y: position of the wavelets in the integrand. * b_start, b_end: integration domain. * nodes, phi_nodes: position and scale of the nodes of the ridge. * nb_nodes: number of nodes of the ridge. ****************************************************************/ double gqrombmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double scale,double b_start, double b_end) { double h[JMAXP+1]; double ss,dss; double *s; int j; double tmpr[JMAX+1]; s = (double *)S_alloc(JMAXP+1,sizeof(double)); /* Initialisation of tmp arrays */ for(j = 0; j < JMAX+1; j++) tmpr[j] = 0.0; h[1]=1.0; /* Loop and test accuracy ----------------------*/ for (j=1;j<=JMAX;j++) { /* Trapezoidal rule */ s[j] = gtrapzdmod(x,y,p2,nodes,phi_nodes,nb_nodes,scale,b_start,b_end,j); tmpr[j] = s[j]; if (j >= K) { /* Polynomial (Lagrange) extrapolation to estimate the limit of the integral as step goes to 0 */ polint(&h[j-K],&tmpr[j-K],(int)K,0.0,&ss,&dss); /* Test accuracy */ if (fabs(dss) < EPS*fabs(ss)) { return ss; } } (s[j+1])=(s[j]); h[j+1]=0.25*h[j]; } Rprintf("Too many steps in routine gqrombmod (x=%d, y=%d) \n",x,y); return(ss); } #undef EPS #undef JMAX #undef JMAXP #undef K /*************************************************************** * Function: trapzdmod * --------- * Integration with trapezoidal rule; * complex-valued functions * * x,y: position of the wavelets in the integrand. * b_start, b_end: integration domain. * nodes, phi_nodes: position and scale of the nodes of the ridge. * nb_nodes: number of nodes of the ridge. * n: order of the integration. ****************************************************************/ fcomplex trapzdmod(int x, int y, double *p2, double *nodes, double *phi_nodes, int nb_nodes,double cent_freq,double b_start, double b_end, int n) { double xx,tnm,del; static fcomplex s; fcomplex ctmp,sum; int it,j; if (n == 1) { ctmp = integrand(b_start,x,y,p2,nodes,phi_nodes,nb_nodes,cent_freq); ctmp = Cadd(ctmp,integrand(b_end,x,y,p2,nodes,phi_nodes,nb_nodes,cent_freq)); return (s=Cmul(Complex(0.5*(b_end-b_start),0),ctmp)); } else { for (it=1,j=1;j /****************************************** * FFT function (from Numerical Recipes) * * (the length of the FFTed signal HAS * * be a power of 2) * *******************************************/ #include "denoise.h" #include #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr void four1(double data[], int nn, int isign) { int n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta; double tempr,tempi; n=nn << 1; j=1; for (i=1;i i) { SWAP(data[j],data[i]); SWAP(data[j+1],data[i+1]); } m=n >> 1; while (m >= 2 && j > m) { j -= m; m >>= 1; } j += m; } mmax=2; while (n > mmax) { istep=2*mmax; theta=6.28318530717959/(isign*mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m /**************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /*********************************************************** * Function: gabor_frequency: * --------- * Generate Gabor function and derivative in * frequency domain: * * sigma: scale of the Gabor function * w: modulated Gabor function (real part) * isize: signal size * ************************************************************/ void gabor_frequency(double sigma,double frequency,double *w,int isize) { double tmp; int i; double twopi; twopi = 6.28318530717959; for(i = 0; i < isize; i++) { tmp = (double)(sigma * ((i-frequency*(double)isize/2.) * twopi/isize)); tmp = -(tmp * tmp)/2; w[i] = exp(tmp); } return; } /*********************************************************** * Function: Sgabor: * --------- * Continuous Gabor transform. * * input: input signal * Ri1, Ii1: Fourier transform of input signal (re. and imag. parts) * Ri2: Real part of Fourier transform of Gabor function * Oreal: real part of WFT * Oimage: Imaginary part of WFT * pinputsize: signal size * pnbfreq: Number of values for the frequency * pfreqstep: frequency step * pscale: scale of Gabor function * ***********************************************************/ void Sgabor(double *input,double *Oreal,double *Oimage,int *pnbfreq, double *pfreqstep,int *pinputsize,double *pscale) { /* void multiply(); void FFT();*/ int nbfreq, i, inputsize; double scale, freqstep, frequency; double *Ri2, *Ri1, *Ii1, *Ii2, *Ii, *Ri; scale = *pscale; nbfreq = *pnbfreq; freqstep = *pfreqstep; inputsize = *pinputsize; if(!(Ri1 = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri1 in gabor.c \n"); if(!(Ii1 = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii1 in gabor.c \n"); if(!(Ii2 = (double *)S_alloc(inputsize,sizeof(double)))) Rf_error("Memory allocation failed for Ri2 in gabor.c \n"); if(!(Ri2 = (double *)S_alloc(inputsize,sizeof(double)))) Rf_error("Memory allocation failed for Ri2 in gabor.c \n"); if(!(Ri = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri in gabor.c \n"); if(!(Ii = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii in gabor.c \n"); for(i = 0; i < inputsize; i++){ *Ri = (double)(*input); Ri++; input++; } Ri -= inputsize; input -= inputsize; /* Compute fft of the signal */ double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); /* Multiply signal and wavelets in the Fourier space */ frequency = 0; for(i = 1; i <= nbfreq; i++) { frequency += freqstep; gabor_frequency(scale,frequency,Ri2,inputsize); multiply(Ri1,Ii1,Ri2,Ii2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); Oreal += inputsize; Oimage += inputsize; } Oreal -= inputsize*nbfreq; Oimage -= inputsize*nbfreq; } /*********************************************************** * Function: Svgabor: * --------- * Continuous Gabor transform for one frequency * * input: input signal * Ri1, Ii1: Fourier transform of input signal (re. and imag. parts) * Ri2: Real part of Fourier transform of Gabor function * Oreal: real part of WFT * Oimage: Imaginary part of WFT * pinputsize: signal size * pfreq: Value of the frequency * pscale: scale of Gabor function * ************************************************************/ void Svgabor(double *input,double *Oreal,double *Oimage,double *pfreq, int *pinputsize,double *pscale) { /* void multiply(); void FFT();*/ int i, inputsize; double scale, frequency; double *Ri2, *Ri1, *Ii1, *Ii2, *Ii, *Ri; scale = *pscale; frequency = *pfreq; inputsize = *pinputsize; if(!(Ri1 = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri1 in gabor.c \n"); if(!(Ii1 = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii1 in gabor.c \n"); if(!(Ii2 = (double *)S_alloc(inputsize,sizeof(double)))) Rf_error("Memory allocation failed for Ri2 in gabor.c \n"); if(!(Ri2 = (double *)S_alloc(inputsize,sizeof(double)))) Rf_error("Memory allocation failed for Ri2 in gabor.c \n"); if(!(Ri = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ri in gabor.c \n"); if(!(Ii = (double *)S_alloc(inputsize, sizeof(double)))) Rf_error("Memory allocation failed for Ii in gabor.c \n"); for(i = 0; i < inputsize; i++){ *Ri = (double)(*input); Ri++; input++; } Ri -= inputsize; input -= inputsize; /* Compute fft of the signal */ double_fft(Ri1,Ii1,Ri,Ii,inputsize,-1); /* Multiply signal and wavelets in the Fourier space */ gabor_frequency(scale,frequency,Ri2,inputsize); multiply(Ri1,Ii1,Ri2,Ii2,Oreal,Oimage,inputsize); double_fft(Oreal,Oimage,Oreal,Oimage,inputsize,1); } /*************************************************************** * Function: gabor_time: * --------- * Generates a Gabor function in the time domain. * The Gabor is centered at the b, and normalized so * that psi(0) = 1 * * g: Gabor * scale: scale of the Gabor * isize: window size * frequency: frequency of the Gabor * * remark: unlike the other functions, this one generates an * array starting at 1, for compatibility with S. ***************************************************************/ void gabor_time(double *pfrequency,double *pscale, int *pb, double *g_r, double *g_i,int *pisize) { double tmp, tmp2; double frequency = *pfrequency, scale = *pscale; int b = *pb, isize = *pisize; int i; double pi; pi = 3.141593; for(i = 1; i <= isize; i++) { tmp = (double)((double)(i-b)/scale); tmp2 = exp(-(tmp * tmp)/2.)/scale/sqrt(2.0*pi); g_r[i-1] = tmp2*cos(((double)(i-b)) * pi * frequency); g_i[i-1] = tmp2*sin(((double)(i-b)) * pi * frequency); } return; } /*************************************************************** * Function: vgabor_time: * --------- * Generates many Gabor functions in the time domain. * The Gabors are centered on the node of the ridge, and normalized so * that psi(0) = 1 * * frequency: frequencies along the ridge * scale: scale of the Gabor * b: locations along the ridge * g: Gabor * isize: window size * nbnode: number of samples at the ridge * * remark: unlike the other functions, this one generates an * array starting at 1, for compatibility with S. ***************************************************************/ void vgabor_time(double *frequency,double *pscale, int *b, double *g_r, double *g_i,int *pisize, int *pnbnode) { double tmp, tmp2; double scale = *pscale; int isize = *pisize; int i, j, nbnode = *pnbnode; double pi; int position; pi = 3.141593; for(j = 0; j < nbnode; j++) { position = b[j]; for(i = 1; i <= isize; i++) { tmp = (double)((double)(i-position)/scale); tmp2 = exp(-(tmp * tmp)/2.)/scale/sqrt(2.0*pi); g_r[j * isize + i-1] = tmp2*cos(((double)(i-position)) * pi * frequency[j]); g_i[j * isize + i-1] = tmp2*sin(((double)(i-position)) * pi * frequency[j]); } } return; } Rwave/src/snake_annealing.c0000644000176200001440000002775213064230076015424 0ustar liggesusers#include /*************************************************************** * $Log: s_annealing.c,v $ * **************************************************************** * * * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Ssnake_annealing: * * -------------------------- * * Ridge extraction from annealing, using the snake method * * * * smodulus: modulus smoothed by a window * * cost: cost function * * phi: ridge (scale coordinate) * * rho: ridge(position coordinate) * * lambda: coefficient in front of phi'' in the cost function * * mu: coefficient in front of phi' in the cost function * * lambda2: coefficient in front of rho'' in the cost function* * mu2: coefficient in front of rho' in the cost function * * c: constant on the temperature schedule * * sigsize: signal size * * snakesize: size of the snake (number of points) * * nscale: total number of scales for CWT * * iteration: maximal number of iterations for the annealing * * stagnant: allowed number of consecutive steps without * * move (stopping criterion) * * seed: seed for random number generator * * count: number of iterations * * sub: subsampling rate for ridge extraction * * blocksize: subsampling of the cost function in cost * * blocksize=1 means that the whole cost function * * is returned * * * ****************************************************************/ void Ssnake_annealing(double *cost, double *smodulus, double *phi, double *rho, double *plambda, double *pmu, double *plambda2, double *pmu2, double *pc, int *psigsize, int *psnakesize, int *pnscale, int *piteration, int *pstagnant, int *pseed, int *pcount, int *psub, int *pblocksize, int *psmodsize) { int sigsize,snakesize,ncount,iteration; int i,k,up,right,pos,num,a,b,count,costcount,sub; long idum=-9; int again, tbox, blocksize,smodsize; int nscale, stagnant, recal; double c, lambda, mu, lambda2, mu2; double *bcost, *phi2; double ran, gibbs; double cost1; double temperature, tmp=0, tmp2; /* FILE *fp; */ int *posmap; /* Generalities; initializations -----------------------------*/ mu = *pmu; mu2 = *pmu2; lambda = *plambda; lambda2 = *plambda2; stagnant = *pstagnant; nscale = *pnscale; iteration = *piteration; c = *pc; sigsize = *psigsize; snakesize = *psnakesize; idum = (long)(*pseed); sub = *psub; blocksize = *pblocksize; smodsize = *psmodsize; recal = 100000; /* recompute cost function every 'recal' iterations */ if(!(bcost = (double *)S_alloc(blocksize,sizeof(double)))) Rf_error("Memory allocation failed for bcost at snake_annealing.c \n"); if(!(phi2 = (double *)S_alloc(sigsize,sizeof(double)))) Rf_error("Memory allocation failed for phi2 at snake_annealing.c \n"); if(!(posmap = (int *)S_alloc(smodsize * nscale,sizeof(int)))) Rf_error("Memory allocation failed for posmap at snake_annealing.c \n"); /* if(blocksize != 1) { if((fp = fopen("annealing.cost","w")) == NULL) Rf_error("can't open file at snake_annealing.c \n"); } */ tbox = 0; ncount = 0; /* count for cost */ count = 0; /* total count */ temperature = c/log(2. + (double)count); /* Initial temperature */ cost1 = 0; /* mark the initial positions of snakes */ for(i = 0; i < snakesize; i++) { /* k = (int)(rho[i] + smodsize * phi[i]); this is probably a bug */ k = (int)(rho[i]) + smodsize * (int)(phi[i]); posmap[k] = 1; } /* Smooth and subsample the wavelet transform modulus --------------------------------------------------*/ /* if(sub !=1){*/ /* smoothwt(modulus,smodulus,sigsize,nscale,sub); */ snakesub(rho,sub,snakesize); /* } if(sub == 1) for(i=0; i= stagnant) { cost[ncount++] = (double)cost1; *pcount = ncount; /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge --------------------------------*/ /* if(sub != 1){ splsnake(sub, rho-1, phi-1, snakesize, phi2-1); printf("interpolation done\n"); for(i=0;i= iteration) { cost[ncount++] = (double)cost1; *pcount = ncount; /* Write cost function to a file -----------------------------*/ /* if((blocksize != 1)){ for(i = 0; i < costcount+1; i++) fprintf(fp, "%f ", bcost[i]); fclose(fp); } */ /* Interpolate from subsampled ridge ---------------------------------*/ /* if(sub !=1){ splsnake(sub, rho-1, phi-1, snakesize, phi2-1); printf("interpolation done\n"); for(i=0;i /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ /***************************************************************************/ /* */ /* Functions for computing p-values for mallat wavelets */ /* */ /***************************************************************************/ #include "denoise.h" #include "dyadic.h" #include "Swave.h" #define HISTO_SIZE 500 extern long idum; /**************************************************************************/ /* local_mean */ /**************************************************************************/ #define LOCAL_LENGTH 17 void local_mean(double *mean, double *s, int np ) { double *s_sym; int i, j, t; double sum; if(!(s_sym = (double *) R_alloc( 2*np,sizeof(double)))) Rf_error("Memory allocation failed in s_sym at simul.c \n"); for ( t = 0; t < np; t++ ) s_sym[t] = s_sym[2*np-t-1] = s[t]; for ( t = 0; t < np; t++ ) { sum = 0.0; for ( j = t-8, i = 0; i < LOCAL_LENGTH; i++, j++ ) sum += (j < 0) ? s_sym[-j-1] : s_sym[j]; mean[t] = sum / (double) LOCAL_LENGTH; } //free( s_sym ); } #undef LOCAL_LENGTH /**************************************************************************/ /* variance */ /**************************************************************************/ double variance(double *s, int np ) { double mean, sum; double *temp; int i; if(!(temp = (double *)R_alloc(np , sizeof(double)))) Rf_error("Memory allocation failed for temp at simul.c "); for ( i = 0, mean = 0.0; i < np; i++ ) mean += s[i]; mean /= (double) np; for ( i = 0; i < np; i++ ) temp[i] = s[i] - mean; for ( i = 0, sum = 0.0; i < np; i++ ) sum += temp[i] * temp[i]; //free( temp ); return sum / (double) np; } /****************************************************************************/ /* Compute p-value */ /* Def: p_value = P{ T > T_obs } */ /****************************************************************************/ double p_value(double T, double **histo, int resoln, int histo_size ) { int count = 0; int i; for ( i = 0; i < histo_size; i++ ) if ( histo[resoln][i] > T ) { count = histo_size - i; /* num of values that > T */ break; } return (double) count / histo_size; } /****************************************************************************/ /* Compute p-value average */ /****************************************************************************/ void compute_pval_average(double *pval, double **p, int max_resoln, int np, int num_of_windows, int window_size ) { int interval_length = window_size / 4; int num_of_intervals = np / interval_length; double *temp; int m, i, j, k; if(!(temp = (double *)R_alloc(num_of_intervals , sizeof(double)))) Rf_error("Memory allocation failed for temp at simul.c \n"); for ( j = 1; j <= max_resoln; j++ ) { /* Compute the average for each interval */ temp[0] = p[j][0]; temp[1] = (p[j][0] + p[j][1]) / 2; temp[2] = (p[j][0] + p[j][1] + p[j][2]) / 3; for ( i = 3, k = i; i < num_of_intervals-3; i++, k++ ) temp[i] = (p[j][k-3] + p[j][k-2] + p[j][k-1] + p[j][k])/ 4; temp[num_of_intervals-1] = p[j][num_of_windows-1]; temp[num_of_intervals-2] = (p[j][num_of_windows-1] + p[j][num_of_windows-2]) / 2; temp[num_of_intervals-3] = (p[j][num_of_windows-1] + p[j][num_of_windows-2] + p[j][num_of_windows-3]) / 3; for ( i = 0 ; i < num_of_intervals; i++ ) { for ( m = (j-1)*np+i*interval_length, k = 0; k < interval_length; k++, m++ ) pval[m] = temp[i]; } } //free( temp ); } /****************************************************************************/ /* Gaussian random variables generator */ /****************************************************************************/ double gasdev(long *idum) { static int iset=0; static double gset; double fac,rsq,v1,v2; if (iset == 0) { do { v1=2.0*ran1(idum)-1.0; v2=2.0*ran1(idum)-1.0; rsq=v1*v1+v2*v2; } while (rsq >= 1.0 || rsq == 0.0); fac=sqrt(-2.0*log(rsq)/rsq); gset=v1*fac; iset=1; return v2*fac; } else { iset=0; return gset; } } /****************************************************************************/ /* denominator of the statistics = (Wf[1]^2) + (Wf[2]^2) */ /****************************************************************************/ double denominator(double *Wf, int np ) { double den = 0.0; int t; for ( t = 0; t < 2*np; t++ ) /* resoln 1 and 2 */ den += Wf[t] * Wf[t]; return den; } /****************************************************************************/ /* numerator of the statistics = sqrt of (Wf[j]^4) */ /****************************************************************************/ double numerator(double *Wf, int resoln, int np ) { double sum = 0.0; int t, i; for ( t = (resoln-1)*np, i = 0; i < np; i++, t++ ) sum += Wf[t] * Wf[t] * Wf[t] * Wf[t]; return (double) sqrt( (double) sum ); } /***************************************************************************/ /* Compute mallat normal histogram for computing p-values */ /***************************************************************************/ void normal_histo( double ***histo, int max_resoln, int sample_size ) { double *Sf = (double *) R_alloc( (max_resoln+1) * sample_size , sizeof(double) ); double *Wf = (double *) R_alloc( max_resoln * sample_size , sizeof(double) ); double *sample = (double *) R_alloc( sample_size , sizeof(double) ); double den; int b, i, j; *histo = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ); for ( j = 1; j <= max_resoln; j++ ) (*histo)[j] = (double *) R_alloc( HISTO_SIZE , sizeof(double) ); for ( b = 0; b < HISTO_SIZE; b++ ) { for ( i = 0; i < sample_size; i++ ) sample[i] = gasdev( &idum ); Sf_compute( Sf, sample, &max_resoln, &sample_size,"Gaussian1" ); Wf_compute( Wf, Sf, &max_resoln, &sample_size,"Gaussian1" ); den = denominator( Wf, sample_size ); for ( j = 1; j <= max_resoln; j++ ) (*histo)[j][b] = numerator( Wf, j, sample_size ) / den; } for ( j = 1; j <= max_resoln; j++ ) qcksrt( HISTO_SIZE, (*histo)[j]-1 ); /* free( Sf ); free( Wf ); free( sample ); */ } /***************************************************************************/ /* Compute mallat bootstrap histogram for computing p-values */ /***************************************************************************/ void bootstrap_histo(double ***histo, double *s, int max_resoln, int sample_size ) { double *Sf = (double *) R_alloc( (max_resoln+1) * sample_size , sizeof(double) ); double *Wf = (double *) R_alloc( max_resoln * sample_size , sizeof(double) ); double *sample = (double *) R_alloc( sample_size , sizeof(double) ); double *bsample = (double *) R_alloc( sample_size , sizeof(double) ); double *mean = (double *) R_alloc( sample_size , sizeof(double) ); double den; int b, i, j; int k = sample_size - 16; for ( i = 0; i < sample_size; i++ ) bsample[i] = s[i]; local_mean( mean, bsample, sample_size ); for ( i = 0; i < sample_size; i++ ) bsample[i] -= mean[i]; *histo = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ); for ( j = 1; j <= max_resoln; j++ ) (*histo)[j] = (double *) R_alloc( HISTO_SIZE , sizeof(double) ); for ( b = 0; b < HISTO_SIZE; b++ ) { for ( i = 0; i < sample_size; i++ ) sample[i] = bsample[8+ (int) (k * ran1(&idum))]; Sf_compute( Sf, sample, &max_resoln, &sample_size, "Gaussian1" ); Wf_compute( Wf, Sf, &max_resoln, &sample_size, "Gaussian1" ); den = denominator( Wf, sample_size ); for ( j = 1; j <= max_resoln; j++ ) (*histo)[j][b] = numerator( Wf, j, sample_size ) / den; } for ( j = 1; j <= max_resoln; j++ ) qcksrt( HISTO_SIZE, (*histo)[j]-1 ); /* free( Sf ); free( Wf ); free( bsample ); free( mean ); free( sample ); */ } /***************************************************************************/ /* Compute mallat pvalue */ /***************************************************************************/ void normal_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ) { int max_resoln = *max_resoln_ptr; int np = *np_ptr; int num_of_windows = *num_of_windows_ptr; int window_size = *window_size_ptr; char *pfiltername = "Gaussian1"; //char *pfiltername = (char *) R_alloc(1, sizeof(char *)); double *window_data; double *Sf; double *Wf; double **p; int step = window_size / 4; double T, den; double **histo; int w, i, j, t; if(!(window_data = (double *) R_alloc( window_size , sizeof(double) ))) Rf_error("Memory allocation failed for window_data in simul.c \n"); if(!(histo = (double **)R_alloc((max_resoln + 1) , sizeof(double *)))) Rf_error("Memory allocation failed for histo in simul.c \n"); //if(!(pfiltername = (char **) R_alloc(1, sizeof(char *)))) // Rf_error("Memory allocation failed for pfiltername in simul.c \n"); if(!(Sf = (double *) R_alloc((max_resoln+1)* window_size , sizeof(double)))) Rf_error("Memory allocation failed for *Sf in simul.c \n"); if(!(Wf = (double *) R_alloc(max_resoln* window_size , sizeof(double)))) Rf_error("Memory allocation failed for *Wf in simul.c \n"); if(!(p = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for p in simul.c \n"); normal_histo( &histo, max_resoln, window_size ); //filename_given(*pfiltername,"Gaussian1"); for ( j = 1; j <= max_resoln; j++ ) if(!(p[j] = (double *) R_alloc( num_of_windows , sizeof(double) ))) Rf_error("Memory failed for p[j] in simul.c "); for ( w = 0; w < num_of_windows; w++ ) { for ( i = 0, t = step*w; i < window_size; i++, t++ ) window_data[i] = s[t]; Sf_compute(Sf, window_data, &max_resoln, &window_size,pfiltername); Wf_compute(Wf, Sf, &max_resoln, &window_size,pfiltername); den = denominator( Wf, window_size ); for ( j = 1; j <= max_resoln; j++ ) { T = numerator( Wf, j, window_size ) / den; p[j][w] = p_value( T, histo, j, HISTO_SIZE ); } } compute_pval_average( pval, p, max_resoln, np, num_of_windows, window_size ); /* free( window_data ); free( Sf ); free( Wf ); for ( j = 1; j <= max_resoln; j++ ) { free( histo[j] ); free( p[j] ); } free( histo ); free( p ); */ } /***************************************************************************/ /* Compute mallat bootstrap pvalue */ /***************************************************************************/ void bootstrap_pval_compute(double *pval, double *s, int *max_resoln_ptr, int *np_ptr, int *num_of_windows_ptr, int *window_size_ptr ) { int max_resoln = *max_resoln_ptr; int np = *np_ptr; int num_of_windows = *num_of_windows_ptr; int window_size = *window_size_ptr; double *window_data; double *Sf; double *Wf; double **p; char *pfiltername = "Gaussian1"; int step = window_size / 4; double T, den; double **histo; int w, i, j, offset; if(!(window_data = (double *) R_alloc( window_size , sizeof(double) ))) Rf_error("Memory allocation failed for window_data in simul.c \n"); if(!(histo = (double **)R_alloc((max_resoln + 1) , sizeof(double *)))) Rf_error("Memory allocation failed for histo in simul.c \n"); //if(!(pfiltername = (char **) R_alloc(1, sizeof(char *)))) Rf_error("Memory allocation failed for pfiltername in simul.c \n"); if(!(Sf = (double *) R_alloc((max_resoln+1)* window_size , sizeof(double)))) Rf_error("Memory allocation failed for *Sf in simul.c \n"); if(!(Wf = (double *) R_alloc(max_resoln* window_size , sizeof(double)))) Rf_error("Memory allocation failed for *Wf in simul.c \n"); if(!(p = (double **) R_alloc( (max_resoln+1) , sizeof(double *) ))) Rf_error("Memory allocation failed for p in simul.c \n"); bootstrap_histo( &histo, s, max_resoln, window_size ); for ( j = 1; j <= max_resoln; j++ ) if(!(p[j] = (double *) R_alloc( num_of_windows , sizeof(double) ))) Rf_error("Memory allocation failed for p[j] in simul.c \n "); //filename_given(*pfiltername,"Gaussian1"); for ( w = 0; w < num_of_windows; w++ ) { for ( i = 0, offset = step*w; i < window_size; i++ ) window_data[i] = s[offset+i]; Sf_compute(Sf, window_data, &max_resoln, &window_size,pfiltername); Wf_compute(Wf, Sf, &max_resoln, &window_size,pfiltername); den = denominator( Wf, window_size ); for ( j = 1; j <= max_resoln; j++ ) { T = numerator( Wf, j, window_size ) / den; p[j][w] = p_value( T, histo, j, HISTO_SIZE ); } } compute_pval_average( pval, p, max_resoln, np, num_of_windows, window_size ); /* free( window_data ); free( Sf ); free( Wf ); for ( j = 1; j <= max_resoln; j++ ) { free( histo[j] ); free( p[j] ); } free( histo ); free( p ); */ } /***************************************************************************/ /* Compute mallat normal threshold for trimming */ /***************************************************************************/ void nthresh_compute(double *nthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ) { int max_resoln = *maxresoln_ptr; int sample_size = *sample_size_ptr; double *mean; double *sample; double **histo; double *Sf; double *Wf; char *pfiltername = "Gaussian1"; double var, std; int j, b, i, t; if(!(histo = (double **)R_alloc((max_resoln + 1) , sizeof(double *)))) Rf_error("Memory allocation failed for histo in simul.c \n"); //if(!(pfiltername = (char **) R_alloc(1, sizeof(char *)))) //Rf_error("Memory allocation failed for pfiltername in simul.c \n"); if(!(mean = (double *) R_alloc( sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *mean in simul.c \n"); if(!(sample = (double *) R_alloc( sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *sample in simul.c \n"); if(!(Sf = (double *) R_alloc((max_resoln+1)* sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *Sf in simul.c \n"); if(!(Wf = (double *) R_alloc(max_resoln* sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *Wf in simul.c \n"); /* printf("Idum = %d\n",idum); */ for ( i = 0; i < sample_size; i++ ) sample[i] = s[i]; local_mean( mean, sample, sample_size ); for ( i = 0; i < sample_size; i++ ) sample[i] -= mean[i]; var = variance( sample, sample_size ); std = (double) sqrt( var ); for ( j = 1; j <= max_resoln; j++ ) if(!(histo[j] = (double *) R_alloc( HISTO_SIZE , sizeof(double) ))) Rf_error("Memory allocation failed for histo[i] in simul.c \n"); //if(!(*pfiltername = (char *)R_alloc(STRING_SIZE , sizeof(char)))) // Rf_error("Memory allocation failed for *pfilename in simul.c \n"); //filename_given(*pfiltername,"Gaussian1"); for ( b = 0; b < HISTO_SIZE; b++ ) { for ( i = 0; i < sample_size; i++ ) sample[i] = std * gasdev( &idum ); Sf_compute(Sf, sample, &max_resoln, &sample_size,pfiltername); Wf_compute(Wf, Sf, &max_resoln, &sample_size,pfiltername); for ( j = 1; j <= max_resoln; j++ ) { for ( i = 0, t = (j-1)*sample_size; i < sample_size; i++, t++ ) sample[i] = Wf[t]; qcksrt( sample_size, sample-1 ); /* Take the max of the absolute value of psi */ histo[j][b] = max( fabs(sample[0]), fabs(sample[sample_size-1]) ); } } for ( j = 1; j <= max_resoln; j++ ) { qcksrt( HISTO_SIZE, histo[j]-1 ); /* nthresh[j-1] = histo[j][(int)(HISTO_SIZE * 0.95) - 1]; */ nthresh[j-1] = histo[j][(int)(HISTO_SIZE * prct) - 1]; //free( histo[j] ); } /* free( histo ); free( mean ); free( sample ); free( Sf ); free( Wf ); */ } /***************************************************************************/ /* Compute mallat bootstrap threshold for trimming */ /***************************************************************************/ void bthresh_compute(double *bthresh, double *s, int *maxresoln_ptr, int *sample_size_ptr, double prct ) { int max_resoln = *maxresoln_ptr; int sample_size = *sample_size_ptr; double *mean; double *sample; double *bsample; double **histo; double *Sf; double *Wf; char *pfiltername = "Gaussian1"; int k = sample_size - 16; /* k depends on LOCAL_LENGTH in local_mean */ int j, b, i, t; histo = (double **) R_alloc((max_resoln + 1), sizeof(double *)); //if(!(pfiltername = (char **) R_alloc(1, sizeof(char *)))) //Rf_error("Memory allocation failed for pfiltername in simul.c \n"); if(!(mean = (double *) R_alloc( sample_size, sizeof(double)))) Rf_error("Memory allocation failed for *mean in simul.c \n"); if(!(sample = (double *) R_alloc( sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *sample in simul.c \n"); if(!(bsample = (double *) R_alloc( sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *bample in simul.c \n"); if(!(Sf = (double *) R_alloc((max_resoln+1)* sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *Sf in simul.c \n"); if(!(Wf = (double *) R_alloc(max_resoln* sample_size , sizeof(double)))) Rf_error("Memory allocation failed for *Wf in simul.c \n"); for ( i = 0; i < sample_size; i++ ) bsample[i] = s[i]; local_mean( mean, bsample, sample_size ); for ( i = 0; i < sample_size; i++ ) bsample[i] -= mean[i]; for ( j = 1; j <= max_resoln; j++ ) if(!(histo[j] = (double *) R_alloc( HISTO_SIZE , sizeof(double) ))) Rf_error("Memory allocation failed for histo[i] in simul.c \n"); //*pfiltername = (char *)R_alloc(STRING_SIZE , sizeof(char)); //filename_given(*pfiltername,"Gaussian1"); for ( b = 0; b < HISTO_SIZE; b++ ) { for ( i = 0; i < sample_size; i++ ) sample[i] = bsample[8+ (int) (k * ran1(&idum))]; Sf_compute(Sf, sample, &max_resoln, &sample_size,pfiltername); Wf_compute(Wf, Sf, &max_resoln, &sample_size,pfiltername); for ( j = 1; j <= max_resoln; j++ ) { for ( i = 0, t = (j-1)*sample_size; i < sample_size; i++, t++ ) sample[i] = Wf[t]; qcksrt( sample_size, sample-1 ); /* Take the max of the absolute value of psi */ histo[j][b] = max( fabs(sample[0]), fabs(sample[sample_size-1]) ); } } for ( j = 1; j <= max_resoln; j++ ) { qcksrt( HISTO_SIZE, histo[j]-1 ); /* bthresh[j-1] = histo[j][(int)(HISTO_SIZE * 0.95) - 1]; */ bthresh[j-1] = histo[j][(int)(HISTO_SIZE * prct) - 1]; //free( histo[j] ); } /*free( histo ); free( mean ); free( sample ); free( bsample ); free( Sf ); free( Wf ); */ } Rwave/src/random.h0000644000176200001440000000024213064230076013555 0ustar liggesusers/*****************************/ /* Global Variables */ /*****************************/ double gasdev( long *idum ); void qcksrt( int n, double arr[] ); Rwave/src/optimize.c0000644000176200001440000000413013064230076014130 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" #define PRECISION 1.e-16 /*************************************************************** * Function: Lpnorm * --------- * L^p norm of a matrix * Computes the L^p norm of a (double) complex valued matrix. * * norm: L^p norm * Rmat, Imat: real and imag. parts of the matrix * p: exponent for the L^p norm * length: number of rows * width: number of columns ***************************************************************/ void Lpnorm(double *norm, double *p, double *Rmat, double *Imat, int *length, int *width) { int i,j; double tmp, rtmp, itmp; double ntmp = 0.0; for(i=0;i<(*length);i++){ for(j=0;j<(*width);j++){ rtmp = fabs(*Rmat); itmp = fabs(*Imat); if ((rtmp >= PRECISION)&&(itmp >= PRECISION)){ tmp = pow(rtmp,*p) + pow(itmp,*p); ntmp += tmp; } Rmat++; Imat++; } } *norm = pow(ntmp, 1/(*p)); return; } /*************************************************************** * Function: entropy * --------- * Entropy of a matrix * Computes the entropy of a (double) complex valued matrix. * * entr: entropy * Rmat, Imat: real and imag. parts of the matrix * length: number of rows * width: number of columns ***************************************************************/ void entropy(double *entr, double *Rmat, double *Imat, int *length, int *width) { int i,j; double tmp, ntmp=0.0; for(i=0;i<(*length);i++){ for(j=0;j<(*width);j++){ tmp = (*Rmat)*(*Rmat) + (*Imat)*(*Imat); if((tmp >= PRECISION)) ntmp -= tmp * log(tmp); Rmat++; Imat++; } } *entr = ntmp; return; } Rwave/src/icm.c0000644000176200001440000001374513064230076013054 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Sridge_newicm: * -------------------------- * Ridge characterization with Besag's ICM algorithm * * smodulus: smoothed modulus of the wavelet transform * cost: cost function * phi: ridge * lambda: coefficient in front of phi' in the cost function * mu: coefficient in front of phi'' in the cost function * sigsize: signal size * nscale: total number of scales for CWT * iteration: maximal number of iterations for the annealing * stagnant: allowed number of consecutive steps without * move (stopping criterion) * count: number of iterations * sub: subsampling rate for ridge extraction * smodsize: the size of sub-sampled signal * ****************************************************************/ void Sridge_icm(double *cost, double *smodulus, double *phi, double *plambda, double *pmu, int *psigsize, int *pnscale, int *piteration,int *pcount, int *psub, int *psmodsize) { int i,sigsize,iteration,up, best_up,pos,a,count,sub; int smodsize, tbox=0, ttbox=1000; int nscale; double lambda, mu; double *phi2; double cost1; double tmp=0.0, best_tmp; /* Generalities; initializations -----------------------------*/ mu = *pmu; nscale = *pnscale; iteration = *piteration; lambda = *plambda; sigsize = *psigsize; sub = *psub; smodsize = *psmodsize; if(!(phi2 = (double *)S_alloc((smodsize+1)*sub,sizeof(double)))) Rf_error("Memory allocation failed for phi2 at icm.c \n"); count = 0; /* total count */ cost1 = 0; for(i=0;i 1)&&(count < iteration)) { /* Initialize the cost function ----------------------------*/ tbox = 0; if(count == 0) { for(i = 1; i < smodsize-1; i++) { tmp = (double)((phi[i-1]+ phi[i+1]-2 * phi[i])); cost1 += (double)((lambda * tmp * tmp)); tmp = (double)((phi[i] - phi[i+1])); cost1 += (double)((mu * tmp * tmp)); a = (int)phi[i]; tmp = smodulus[smodsize * a + i]; /* cost1 -= (tmp * tmp - noise[a]); */ cost1 -= tmp; } tmp = (double)((phi[0] - phi[1])); cost1 += (double) ((mu * tmp * tmp)); a = (int)phi[0]; tmp = smodulus[smodsize * a]; /* cost1 -= (tmp * tmp - noise[a]); */ cost1 -= tmp; a = (int)phi[smodsize-1]; tmp = smodulus[smodsize * a + smodsize-1]; /* cost1 -= (tmp * tmp - noise[a]); */ cost1 -= tmp; } /* Generate moves --------------*/ for(pos=0; pos < smodsize; pos++){ best_tmp = (double)0.0; best_up = 0; for(up = -(int)phi[pos]; up < nscale- (int)phi[pos]; up++){ /* Compute corresponding update of the cost function -------------------------------------------------*/ if(inrange(2,pos,smodsize-3)) { tmp = (double)(lambda*up); tmp *=(double)((6*up+(12*phi[pos] -8*(phi[pos-1]+phi[pos+1]) +2*(phi[pos-2]+phi[pos+2])))); tmp += (double)(mu*up*(4.0*phi[pos] -2.0*(phi[pos-1]+phi[pos+1])+2.0*up)); a = (int)phi[pos]; /* tmp += (smodulus[smodsize*a+pos] *smodulus[smodsize*a+pos]); tmp -= noise[a]; */ tmp += smodulus[smodsize*a+pos]; a = (int)phi[pos] + up; /* tmp -= (smodulus[smodsize*a+pos] *smodulus[smodsize*a+pos]); tmp += noise[a]; */ tmp -= smodulus[smodsize*a+pos]; } if(inrange(2,pos,smodsize-3) == NO) { tmp = (double)(lambda*up); if(pos == 0) { tmp *= (double)((up+2.0*(phi[0] -2*phi[1]+phi[2]))); tmp += (double)(mu*up*((2.0*phi[pos] -2.0*phi[pos+1])+up)); } else if(pos == 1) { tmp *=(double)((5*up+2.0*(-2*phi[0]+5*phi[1] -4*phi[2]+phi[3]))); tmp += (double)(mu*up*(4.0*phi[pos] -2.0*(phi[pos-1]+phi[pos+1]-up))); } else if(pos == (smodsize-2)) { tmp *= (double)((5*up+2.0*(phi[pos-2]-4*phi[pos-1] +5*phi[pos]-2*phi[pos+1]))); tmp += (double)(mu*up*(4.0*phi[pos]-2.0*(phi[pos-1] +phi[pos+1])+2.0*up)); } else if(pos == (smodsize-1)) { tmp *= (double)((up+2.0*(phi[pos-2] -2*phi[pos-1]+phi[pos]))); tmp += (double)(mu*up*((2.0*phi[pos] -2.0*phi[pos-1])+up)); } a = (int)phi[pos]; /* tmp +=(smodulus[smodsize*a+pos]*smodulus[smodsize*a+pos]); tmp -= noise[a]; */ tmp +=smodulus[smodsize*a+pos]; a = (int)phi[pos] + up; /* tmp -=(smodulus[smodsize*a+pos]*smodulus[smodsize*a+pos]); tmp += noise[a]; */ tmp -=smodulus[smodsize*a+pos]; } /* Compare with other moves ------------------------*/ if(tmp < best_tmp) { best_tmp = tmp; best_up = up; } } /* Best move ---------*/ if (best_up != 0) { cost1 += best_tmp; phi[pos] += (double)best_up; tbox++; } } ttbox = tbox; cost[count++] = cost1; } /* Interpolate from subsampled ridge --------------------------------*/ if (sub != 1){ splridge(sub, phi, smodsize, phi2); for(i=0;i /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ****************************************************************/ #include "Swave.h" #include "denoise.h" /**************************************************************** * Function: Shessianmap: * --------------------- * Road map designed using hessian matrix * * smodulus: squared-modulus of the wavelet transform * (coming from learning the noise) * sigsize: signal size * nscale: total number of scales for CWT * gridx : the window size for pca along x * gridy : the window size for pac along y * nbblock: number of window used by pca * nbpoint: number of sampler each window by pca * pointmap: map of sampling points * tst: the first 4 locations containing the coordinates of left * and right corner, followed with a sequence of the coor- * dinates of sampled points in each block. * tstsize: equal to 4 + 2 * number of sampled point each pca block * count: the maximal number of repetition if location is chosen in * a block * seed: seed for random number generator ****************************************************************/ void Shessianmap(double *sqmodulus, int *psigsize, int *pnscale, int *pnbblock, int *pgridx, int *pgridy, double *tst) { int a, b, sigsize, nscale, gridx, gridy ; int left, right, down, up; double mxx, mxy, myx, myy; int bnumber, k; sigsize = *psigsize; nscale = *pnscale; gridx = *pgridx; gridy = *pgridy; bnumber = 0; for(a = 2; a < nscale-2; a += gridy) { for(b = 2; b < sigsize-2; b += gridx) { down = a; up = min(a + gridy, nscale-1); left = b; right = min(b + gridx, sigsize-1); k = b + a * sigsize; mxx = 0.25*(sqmodulus[k+2]+sqmodulus[k-2]-2*sqmodulus[k]); myy = 0.25*(sqmodulus[k+2*sigsize]+sqmodulus[k-2*sigsize]-2 * sqmodulus[k]); mxy = 0.25*(sqmodulus[k+1+sigsize]+sqmodulus[k-1-sigsize] -sqmodulus[k+1-sigsize]-sqmodulus[k-1+sigsize]); myx = mxy; /* first four containing the coordinate of left low and right up corner --------------------------------------------------------------------*/ tst[8*bnumber] = (double)(left+1); tst[8*bnumber+1] = (double)(down+1); tst[8*bnumber+2] = (double)(right+1); tst[8*bnumber+3] = (double)(up+1); /* negative Hessian as Gaussian ----------------------------*/ tst[8*bnumber+4] = -mxx; tst[8*bnumber+5] = -mxy; tst[8*bnumber+6] = -myx; tst[8*bnumber+7] = -myy; bnumber++; } } *pnbblock = bnumber; } Rwave/src/randomwalker2.c0000644000176200001440000000321313064230076015041 0ustar liggesusers#include /*************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang * * Princeton University * * All right reserved * ***************************************************************/ #include "Swave.h" #include "denoise.h" long idum = -7; /****************************************************************** * UNIFORM RANDOM NUMBER GENERATOR *******************************************************************/ #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) /* ran1 (from Numerical Recipes): uniform random numbers between 0 and 1 */ double ran1(long *idum) { int j; long k; static long iy=0; static long iv[NTAB]; double temp; if(*idum <= 0 || !iy) { if(-(*idum) < 1) *idum = 1; else *idum = -(*idum); for(j = NTAB+7; j >= 0; j--) { k = (*idum)/IQ; *idum = IA * (*idum - k *IQ) - IR*k; if (*idum < 0) *idum += IM; if(j < NTAB) iv[j] = *idum; } iy = iv[0]; } k = (*idum)/IQ; *idum = IA*(*idum-k*IQ)-IR*k; if(*idum < 0) *idum += IM; j = iy/NDIV; iy = iv[j]; iv[j] = *idum; if((temp = AM * iy) > RNMX) return RNMX; else return temp; } #undef IA #undef IM #undef AM #undef IQ #undef IR #undef NTAB #undef NDIV #undef EPS #undef RNMX Rwave/src/dau.c0000644000176200001440000003117113064230076013046 0ustar liggesusers#include #include /* #include "wavelet.h" */ #include "dau_wave.h" #include "pvalue.h" #include "dyadic.h" #include "Swave.h" /****************************************************************** * (c) Copyright 1997 * * by * * Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, A. Wang * * Princeton University * * All right reserved * ******************************************************************/ /****************************************************************************/ #define HISTO_SIZE 500 /****************************************************************************/ double *a, **c; int NW, *twoto; /****************************************************************************/ /* COMPUTE WAVELET COEFFICIENT RANGE FOR ALL RESOLUTIONS */ /****************************************************************************/ void compute_d_phi_range_for_all_resoln( d_phi_range, max_resoln, np ) bound **d_phi_range; int max_resoln, np; { int j; *d_phi_range = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ); for ( j = 0; j <= max_resoln; j++ ) { (*d_phi_range)[j].lb = (int) ceil((1 - 1.0 / twoto[j]) * (1 - 2*NW)); (*d_phi_range)[j].ub = (int) ((np -1) / twoto[j]); (*d_phi_range)[j].size = (*d_phi_range)[j].ub - (*d_phi_range)[j].lb +1; } } /****************************************************************************/ /* COMPUTE WAVELET COEFFICIENT RANGE FOR ALL RESOLUTIONS */ /****************************************************************************/ void compute_d_psi_range_for_all_resoln( d_psi_range, d_phi_range, max_resoln, np ) bound **d_psi_range; bound *d_phi_range; int max_resoln; int np; { int j; *d_psi_range = (bound *) R_alloc( (max_resoln+1) , sizeof(bound) ); for ( j = 1; j <= max_resoln; j++ ) { (*d_psi_range)[j].lb = (int) ceil( (double) ((d_phi_range[j-1].lb -1) / 2) ); (*d_psi_range)[j].ub = (int) ( d_phi_range[j-1].ub / 2 + NW -1 ); (*d_psi_range)[j].size = (*d_psi_range)[j].ub - (*d_psi_range)[j].lb +1; } } /****************************************************************************/ /* COMPUTE PHI COEFFICIENTS FOR ALL RESOLUTIONS */ /****************************************************************************/ void compute_d_phi_for_all_resoln( d_phi, d_phi_range, s, max_resoln ) double **d_phi; bound *d_phi_range; double *s; int max_resoln; { int j, k, n_min, n_max, n; double sum; for ( j = 0; j <= max_resoln; j++ ) { d_phi[j] = (double *) R_alloc( d_phi_range[j].size , sizeof(double) ); if ( j == 0 ) for ( k = d_phi_range[j].lb; k <= d_phi_range[j].ub; k++ ) d_phi[j][k] = s[k]; else for ( k = d_phi_range[j].lb; k <= d_phi_range[j].ub; k++ ) { n_min = max( d_phi_range[j-1].lb, 2*k ); n_max = min( d_phi_range[j-1].ub, 2*k+2*NW-1 ); sum = 0.0; for ( n = n_min; n <= n_max; n++ ) sum += c[NW][n - 2*k] * d_phi[j-1][n - d_phi_range[j-1].lb]; d_phi[j][k - d_phi_range[j].lb] = (double) sum; } } } /****************************************************************************/ /* COMPUTE PSI COEFFICIENTS FOR ALL RESOLUTIONS */ /****************************************************************************/ void compute_d_psi_for_all_resoln( d_psi, d_psi_range, d_phi, d_phi_range, max_resoln ) double **d_psi; bound *d_psi_range; double **d_phi; bound *d_phi_range; int max_resoln; { int j, k, n_min, n_max, n; double sum; for ( j = 1; j <= max_resoln; j++ ) { d_psi[j] = (double *) R_alloc( d_psi_range[j].size , sizeof( double ) ); for ( k = d_psi_range[j].lb; k <= d_psi_range[j].ub; k++ ) { n_min = max( d_phi_range[j-1].lb, 2*(k-NW+1) ); n_max = min( d_phi_range[j-1].ub, 2*k+1 ); sum = 0.0; for ( n = n_min; n <= n_max; n++ ) sum += minus1to(n) * c[NW][2*k+1-n] * d_phi[j-1][n - d_phi_range[j-1].lb]; d_psi[j][k - d_psi_range[j].lb] = (double) sum; } } } /****************************************************************************/ /* PHI RECONSTRUCTION */ /****************************************************************************/ void phi_reconstruction( phi, d_phi, phi_array, d_phi_range, max_resoln, np ) double *phi, **d_phi, *phi_array; bound *d_phi_range; int max_resoln, np; { int j, t, k_min, k_max, k; double sum, two_to_j, two_to_j_half, two_to_j_times_t; for ( j = 0; j <= max_resoln; j++ ) { two_to_j = 1.0 / (double)pow( 2.0, (double) j ); /* j = -m */ two_to_j_half = 1.0 / (double)pow( 2.0, ((double)j)/2 ); for( t = 0; t < np; t++ ) { two_to_j_times_t = two_to_j * t; k_min = max((int) ceil((double)(two_to_j_times_t - 2*NW +1)), d_phi_range[j].lb); k_max = (int) floor( (double) two_to_j_times_t ); /* NOTE: k_max <= d_phi_range[j].ub */ sum = 0.0; for ( k = k_min; k <= k_max; k++ ) sum += d_phi[j][k - d_phi_range[j].lb] * phi_array[(int) ((two_to_j_times_t - k) * twoto[max_resoln])]; phi[j*np+t] = two_to_j_half * sum; } } } /****************************************************************************/ /* PSI RECONSTRUCTION */ /****************************************************************************/ void psi_reconstruction( psi, d_psi, psi_array, d_psi_range, max_resoln, np ) double *psi, **d_psi, *psi_array; bound *d_psi_range; int max_resoln, np; { int j, t, k_min, k_max, k; double sum, two_to_j, two_to_j_half, two_to_j_times_t; for ( j = 1; j <= max_resoln; j++ ) { two_to_j = 1.0 / (double) pow( 2.0, (double) j ); /* j = -m */ two_to_j_half = 1.0 / (double) pow( 2.0, ((double) j)/2 ); for( t = 0; t < np; t++ ) { two_to_j_times_t = two_to_j * t; k_min = max( (int) ceil( (double)(two_to_j_times_t - NW +1) ), d_psi_range[j].lb ); k_max = min( (int) floor((double)(two_to_j_times_t + NW) ), d_psi_range[j].ub ); sum = 0.0; for ( k = k_min; k <= k_max; k++ ) sum += d_psi[j][k - d_psi_range[j].lb] * psi_array[(int) ((two_to_j_times_t - k + NW) * twoto[max_resoln])]; psi[(j-1)*np+t] = two_to_j_half * sum; } } } /****************************************************************************/ /* daubechies_reconst, called by Splus */ /****************************************************************************/ void daubechies_wt( phi, psi, s, NW_ptr, maxresoln_ptr, np_ptr ) double *phi; /* (maxresoln+1) by np, where np is a power of 2 */ double *psi; /* maxresoln by np, where np is a power of 2 */ double *s; int *NW_ptr; int *maxresoln_ptr; int *np_ptr; { int max_resoln = *maxresoln_ptr; int np = *np_ptr; int num_of_resoln = max_resoln + 1; bound *d_phi_range, *d_psi_range; double **d_phi, **d_psi, *phi_array, *psi_array; NW = *NW_ptr; open_read(); compute_a(); init_twoto( max_resoln ); d_psi_range = (bound *) R_alloc( num_of_resoln , sizeof(bound) ); d_phi = (double **) R_alloc( num_of_resoln , sizeof(double *) ); d_psi = (double **) R_alloc( num_of_resoln , sizeof(double *) ); init_phi_array( &phi_array, max_resoln ); init_psi_array( &psi_array, max_resoln ); compute_d_phi_range_for_all_resoln( &d_phi_range, max_resoln, np ); compute_d_psi_range_for_all_resoln( &d_psi_range, d_phi_range, max_resoln, np ); compute_d_phi_for_all_resoln( d_phi, d_phi_range, s, max_resoln ); compute_d_psi_for_all_resoln( d_psi, d_psi_range, d_phi, d_phi_range, max_resoln ); phi_reconstruction( phi, d_phi, phi_array, d_phi_range, max_resoln, np ); psi_reconstruction( psi, d_psi, psi_array, d_psi_range, max_resoln, np ); } /****************************************************************************/ /* */ /* Discrete Daubechies Wavelet Transform */ /* */ /****************************************************************************/ /****************************************************************************/ /* Compute dH filter */ /****************************************************************************/ void compute_dH_bound( dH_bound, max_resoln ) bound **dH_bound; int max_resoln; { int j; int temp = 2*NW-1; *dH_bound = (bound *) R_alloc( max_resoln , sizeof(bound) ); for ( j = 0; j < max_resoln; j++ ) { (*dH_bound)[j].lb = 0; (*dH_bound)[j].ub = twoto[j]*temp; (*dH_bound)[j].size = (*dH_bound)[j].ub - (*dH_bound)[j].lb + 1; } /* for ( j = 0; j < max_resoln; j++ ) printf("dH_bound[%d] = [%d, %d]\n", j, (*dH_bound)[j].lb, (*dH_bound)[j].ub ); printf("\n"); */ } /****************************************************************************/ /* Compute dG filter */ /****************************************************************************/ void compute_dG_bound( dG_bound, max_resoln ) bound **dG_bound; int max_resoln; { int j; int temp = 2 - 2*NW; *dG_bound = (bound *) R_alloc( max_resoln , sizeof(bound) ); for ( j = 0; j < max_resoln; j++ ) { (*dG_bound)[j].lb = twoto[j] * temp; (*dG_bound)[j].ub = twoto[j]; (*dG_bound)[j].size = (*dG_bound)[j].ub - (*dG_bound)[j].lb + 1; } /* for ( j = 0; j < max_resoln; j++ ) printf("dG_bound[%d] = [%d, %d]\n", j, (*dG_bound)[j].lb, (*dG_bound)[j].ub ); printf("\n"); */ } /****************************************************************************/ /* Compute dH filter for each resolution */ /****************************************************************************/ void compute_dH( dH, dH_bound, max_resoln ) double ***dH; bound *dH_bound; int max_resoln; { int j, i; *dH = (double **) R_alloc( max_resoln , sizeof(double *) ); for ( j = 0; j < max_resoln; j++ ) { (*dH)[j] = (double *) R_alloc( dH_bound[j].size , sizeof(double) ); if ( j == 0 ) { for ( i = 0; i < dH_bound[j].size; i++ ) (*dH)[j][i] = c[NW][i]; } else { for ( i = 0; i < dH_bound[j].size; i++ ) /* insert zeros */ (*dH)[j][i] = (i % 2) == 0 ? (*dH)[j-1][i/2] : 0.0; } } /* for ( j = 0; j < max_resoln; j++ ) { for ( i = 0; i < dH_bound[j].size; i++ ) printf("%f\n", (*dH)[j][i] ); printf("\n"); } */ } /****************************************************************************/ /* Compute dG filter for each resolution */ /****************************************************************************/ void compute_dG( dG, dG_bound, max_resoln ) double ***dG; bound *dG_bound; int max_resoln; { int j, i, n; *dG = (double **) R_alloc( max_resoln , sizeof(double *) ); for ( j = 0; j < max_resoln; j++ ) { (*dG)[j] = (double *) R_alloc( dG_bound[j].size , sizeof(double) ); if ( j == 0 ) { for ( i = 0, n = 2-2*NW; i < dG_bound[j].size; i++, n++ ) (*dG)[j][i] = minus1to(n) * c[NW][-n+1]; } else { for ( i = 0; i < dG_bound[j].size; i++ ) /* insert zeros */ (*dG)[j][i] = (i % 2) == 0 ? (*dG)[j-1][i/2] : 0.0; } } /* for ( j = 0; j < max_resoln; j++ ) { for ( i = 0; i < dG_bound[j].size; i++ ) printf("%f\n", (*dG)[j][i] ); printf("\n"); } */ } /****************************************************************************/ /* COMPUTE DDWAVE (Discrete Daubechies wavelet) */ /****************************************************************************/ void compute_ddwave( phi, psi, s, max_resoln_ptr, np_ptr, NW_ptr ) double *phi; double *psi; double *s; int *max_resoln_ptr; int *np_ptr; int *NW_ptr; { int max_resoln = *max_resoln_ptr; int np = *np_ptr; bound *dH_bound, *dG_bound; double **dH, **dG; /* double *sym = (double *) R_alloc( 2*np , sizeof(double) ); */ int j, n, k, t; double sum; NW = *NW_ptr; open_read(); init_twoto( max_resoln ); compute_dH_bound( &dH_bound, max_resoln ); compute_dG_bound( &dG_bound, max_resoln ); compute_dH( &dH, dH_bound, max_resoln ); compute_dG( &dG, dG_bound, max_resoln ); for ( j = 0; j <= max_resoln; j++ ) { if ( j == 0 ) for ( n = 0; n < np; n++ ) phi[n] = s[n]; else { t = (j-1)*np; for ( n = 0; n < np; n++ ) { for ( k = dH_bound[j-1].lb, sum = 0.0; k <= dH_bound[j-1].ub; k++ ) sum += dH[j-1][k] * phi[t+(n-k+np)%np]; phi[j*np+n] = sum; } } } for ( j = 1; j <= max_resoln; j++ ) { t = (j-1)*np; for ( n = 0; n < np; n++ ) { for ( k = dG_bound[j-1].lb, sum = 0.0; k <= dG_bound[j-1].ub; k++ ) sum += dG[j-1][k-dG_bound[j-1].lb] * phi[t+(n-k+np)%np]; psi[t+n] = sum; } } } Rwave/NEWS0000644000176200001440000000127214125077026012043 0ustar liggesusersNEWS for Rwave package ====================== 2.6-0 2021-09-29 o Introduced slight patch to cwt to insure linear convolution. Patch suggested by Robert Alberts. 2.0 2012-12-10 o renamed C-function kernel to rwkernel to avoid conflict with similar name in stats package 1.25-3 2011-12-16 o Port and upgrade to R version 2.14.0 New Maintainer: Jonathan M. Lees installed new Rd files fixed C-code, removed printf, exit calls renamed files in data section and added Rd files 1.25-1 2010-04-20 o Beginning to move legacy C code to internal R functionality. Risk of memory leaks should be lower now. o New files in data section. Rwave/R/0000755000176200001440000000000014125076332011542 5ustar liggesusersRwave/R/recon2d.R0000644000176200001440000000533111217041512013212 0ustar liggesusers#shift fft 1D data #----------------- fftshift <- function(x) { lng <- length(x) y <- numeric(lng) y[1:(lng/2)] <- x[(lng/2+1):(lng)] y[(lng/2+1):lng] <- x[1:(lng/2)] y } #b727 <- matrix(scan("b727s.dat"),ncol=512,byrow=TRUE) #b727 <- matrix(scan("b727r.dat"),ncol=256,byrow=TRUE) #ncol <- dim(b727)[2]/2 #b727r<- b727[,-1+2*(1:ncol)] #b727i<- b727[,2*(1:ncol)] #B727 <- t(Conj(complex(real=b727r, imag=b727i))) #nrow <- dim(B727)[1] #ncol <- dim(B727)[2] #Generating the original image #----------------------------- #* apply fftshift twice to swap the center of the matrix #o727 <- t(apply(apply(B727,2,fftshift),1,fftshift)) #o727 <- apply(o727,2,fft) #o727 <- t(apply(apply(o727,2,fftshift),1,fftshift)) #*** only for display to compare with matlab output #image(Mod(t(o727))) #Applying Gabor Transform to ... #------------------------------- #gtime <- 100 #scale <- 50 #BB727 <- B727 #cgt727 <- array(0+0i,c(ncol,nrow,gtime)) #for(k in 1:ncol) cgt727[k,,] <- #complex(real=cgt(Re(BB727[,k]),gtime,2/gtime,scale,plot=FALSE),imag=cgt(Im(BB727[,k]),gtime,2/gtime,scale,plot=FALSE)) #image(apply(apply(Mod(cgt727),c(1,3),mean),1,fftshift)) #* The following tow S-routine concludes our Radar experiments #------------------------------------------------------------- #b727 <- matrix(scan("b727s.dat"),ncol=512,byrow=TRUE) #b727 <- matrix(scan("b727r.dat"),ncol=256,byrow=TRUE) #Generating the original image #----------------------------- #e.g. B727 <- showRadar(b727) showRadar<- function(x) { ncol <- dim(x)[2]/2 xr<- x[,-1+2*(1:ncol)] xi<- x[,2*(1:ncol)] y <- t(Conj(xr + 1i*xi)) oy <- t(apply(apply(y,2,fftshift),1,fftshift)) oy <- apply(oy,2,fft) oy <- t(apply(apply(oy,2,fftshift),1,fftshift)) image(Mod(t(oy))) oy } #Enhancing Radar Image by Gabor Transform #---------------------------------------- #gtime <- 128 #scale <- 50 #e.g. B727 <- cgtRadar(b727,gtime,scale) #e.g. # ncol <- dim(b727)[2]/2 # b727r<- b727[,-1+2*(1:ncol)] # b727i<- b727[,2*(1:ncol)] # b727 <- t(Conj(complex(real=b727r, imag=b727i))) # B727 <- cgtRadar(b727,gtime,scale,flag=FALSE) cgtRadar <- function(x,gtime,scale,flag=TRUE) { y <- x if(flag) { ncol <- dim(x)[2]/2 xr<- x[,-1+2*(1:ncol)] xi<- x[,2*(1:ncol)] y <- t(Conj(xr + 1i*xi)) } nrow <- dim(y)[1] ncol <- dim(y)[2] cgty <- array(0+0i,c(ncol,nrow,gtime)) for(k in 1:ncol) cgty[k,,] <- cgt(Re(y[,k]),gtime,2/gtime,scale,plot=FALSE) + 1i*cgt(Im(y[,k]),gtime,2/gtime,scale,plot=FALSE) oy <- apply(apply(Mod(cgty),c(1,3),mean),1,fftshift) for(k in 1:nrow) cgty[,k,] <- apply(cgty[,k,],1,fftshift) image(oy) list(output=oy,cgtout=cgty) } Rwave/R/Cwt_Squeezing.R0000644000176200001440000000522311341712543014454 0ustar liggesusers######################################################################### # $Log: Cwt_Squeezing.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### cwtsquiz <- function(input, noctave, nvoice = 1, w0 = 2*pi, twoD = TRUE, plot = TRUE) ######################################################################### # cwtsquiz: # -------- # squeezed wavelet transform function # # Input: # ------ # input: input signal (possibly complex-valued) # noctave: number of powers of 2 for the scale variable # nvoice: number of scales between 2 consecutive powers of 2 # w0: central frequency of Morlet wavelet # twoD: if set to TRUE, organizes the output as a 2D array # (signal_size X nb_scales) # if not: 3D array (signal_size X noctave X nvoice) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # tmp: continuous (complex) squeezed wavelet transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- noctave * nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) z <- .C("Scwt_squeezed", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(noctave), as.integer(nvoice), as.integer(newsize), as.double(w0), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) if(twoD) { output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot){ image(Mod(output),xlab="Time", ylab="log(scale)") title("Squeezed Wavelet Transform Modulus") } output } else { Rtmp <- array(0,c(isize,noctave,nvoice)) Itmp <- array(0,c(isize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { Rtmp[,i,j] <- Routput[1:isize,(i-1)*nvoice+j] Itmp[,i,j] <- Ioutput[1:isize,(i-1)*nvoice+j] } Rtmp + 1i*Itmp } } Rwave/R/TF_Maxima.R0000644000176200001440000000706211217041512013466 0ustar liggesusers######################################################################### # $Log: TF_Maxima.S,v $ # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### tfgmax <- function(input, plot = TRUE) ######################################################################### # tfgmax: # ------- # Continuous time-frequency transform global maxima: # compute the continuous wavelet transform global maxima (for # fixed position) # # input: # ------ # input: continuous time-frequency transform (2D array) # plot: if set to TRUE, displays the maxima of cwt on the graphic # device. # # output: # ------- # output: values of the maxima (1D array) # pos: positions of the maxima (1D array) # ######################################################################### { sigsize <- dim(input)[1] pp <- dim(input)[2] input1 <- input output <- matrix(0,sigsize,pp) dim(input1) <- c(sigsize * pp,1) dim(output) <- c(sigsize * pp,1) posvector <- 1:sigsize posvector[] <- 0 z <- .C("Scwt_gmax", as.double(input1), output = as.double(output), as.integer(sigsize), as.integer(pp), pos = as.integer(posvector), PACKAGE="Rwave") output <- z$output pos <- z$pos dim(output) <- c(sigsize, pp) if(plot)image(output) list(output=output, pos= pos) } tflmax <- function(input, plot = TRUE) ######################################################################### # tflmax: # ------- # continuous time-frequency transform local maxima: # compute the time-frequency transform local maxima (for # fixed position) # # input: # ------ # input: continuous time-frequency transform (2D array) # plot: if set to TRUE, displays the maxima of cwt on the graphic # device. # # output: # ------- # output: values of the maxima (2D array) # ######################################################################### { sigsize <- dim(input)[1] pp <- dim(input)[2] input1 <- input output <- matrix(0,sigsize,pp) dim(input1) <- c(sigsize * pp,1) dim(output) <- c(sigsize * pp,1) z <- .C("Scwt_mridge", as.double(input1), output = as.double(output), as.integer(sigsize), as.integer(pp), PACKAGE="Rwave") output <- z$output dim(output) <- c(sigsize, pp) if(plot)image(output) output } cleanph <- function(tfrep, thresh = .01, plot = TRUE) ######################################################################### # cleanph: # -------- # sets to zero the phase of time-frequency transform when # modulus is below a certain value. # # input: # ------ # tfrep: continuous time-frequency transform (2D array) # thresh: (relative) threshold. # plot: if set to TRUE, displays the maxima of cwt on the graphic # device. # # output: # ------- # output: thresholded phase (2D array) # ######################################################################### { thrmod1 <- Mod(tfrep) thrmod2 <- Mod(tfrep) limit <- range(thrmod1)[2] * thresh thrmod1 <- (Mod(tfrep) > limit) thrmod2 <- (Mod(tfrep) <= limit) output <- thrmod1 * Arg(tfrep) - pi * thrmod2 if(plot) image(output) output } Rwave/R/Hessian_Climbers.R0000644000176200001440000002023211341712552015074 0ustar liggesusers######################################################################### # $Log: Pca_Climbers.S,v $ # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### hescrc <- function(tfrep, tfspec = numeric(dim(tfrep)[2]), grida = 10, gridb = 20, bstep = 3, iteration = 10000, rate = .001, seed = -7, nbclimb = 10, flag.int = TRUE, chain= TRUE, flag.temp = FALSE, lineflag = FALSE) ######################################################################### # hescrc: Time-frequency multiple ridge estimation (hessian climbers) # ------ # use the hessian climber algorithm to evaluate ridges of # continuous Time-Frequency transform # # input: # ------ # tfrep: wavelet or Gabor transform # tfspec: additional potential (coming from learning the noise) # grida : window of a # gridb : window of b # pct : the percent number of points in window 2*grida and # 2*gridb to select histogram # count : the maximal number of repetitive selection, if location # was chosen before # iteration: number of iterations # rate: initial value of the temperature # seed: initialization for random numbers generator # nbclimb: number of crazy climbers # bstep: step size for the climber walk in the time direction # flag.int: if set to TRUE, computes the integral on the ridge. # chain: if set to TRUE, chains the ridges. # flag.temp: if set to TRUE, keeps a constant temperature. # linfflag: if set to TRUE, the line segments oriented to the # where the climber will move freely at the block is # shown in image # # output: # ------- # beemap: 2D array containing the (weighted or unweighted) # occupation measure (integrated with respect to time) # hesmap: 2D array containing number from 1 to 4, denoting the # direction a climber will go at some position; where # 1 moving freely along b, 3 freely along a, 2 along # line a = -b, and 4 along the line a = b. The restricted # move is perdendicular to the free move. # ######################################################################### { tfspectrum <- tfspec d <- dim(tfrep) sigsize <- d[1] nscale <- d[2] sqmodulus <- Re(tfrep*Conj(tfrep)) for (k in 1:nscale) sqmodulus[,k] <- sqmodulus[,k] - tfspectrum[k] image(sqmodulus) ## number of grid size nbx <- as.integer(sigsize/gridb) nby <- as.integer(nscale/grida) if((sigsize/gridb - nbx) > 0) nbx <- nbx + 1 if((nscale/grida - nby) > 0) nby <- nby + 1 nbblock <- nbx * nby ## first two locations at each block stores the lower-left corner ## of the block followed by the locations of up-right corner and by ## the negative values of hessian matrix from xx, xy, yx, and yy at ## the last. tst <- matrix(0, 8, nbblock) dim(tst) <- c(nbblock * 8,1) dim(sqmodulus) <- c(sigsize * nscale, 1) z <- .C("Shessianmap", as.double(sqmodulus), as.integer(sigsize), as.integer(nscale), ublock = as.integer(nbblock), as.integer(gridb), as.integer(grida), tst =as.double(tst), PACKAGE="Rwave") tst <- z$tst dim(tst) <- c(8, nbblock) ## actual number of block ublock <- z$ublock ## principle component analysis and calculate the direction of each block pcamap <- matrix(1,sigsize,nscale) ## first eigenvector of a block eigv1 <- matrix(0,ublock,2) ## to draw eigenvector in a block if(lineflag) { lng <- min(grida, gridb) oldLng <- lng linex <- numeric(oldLng) liney <- numeric(oldLng) } for(j in 1:ublock) { left <- max(1,as.integer(tst[1,j])) down <- max(1,as.integer(tst[2,j])) right <- min(as.integer(tst[3,j]),sigsize) up <- min(as.integer(tst[4,j]),nscale) ctst <- tst[5:8,j] dim(ctst) <- c(2,2) ctst <- t(ctst) eig<- eigen(ctst) ## cat("first eig = ",eig$values[1]," ratio in eigenvalues = ## ",abs(eig$values[1]/eig$values[2])," \n") ## eigen vector 1 eigv1[j,] <- eig$vector[,1] ## shifted center position of a block if(lineflag) { centerx <- as.integer((left + right)/2) centery <- as.integer((down + up)/2) } ## theta of the eigen vector 1; -pi < theta <= pi theta <- atan2((eigv1[j,])[2],(eigv1[j,])[1]) ## along x : denote 1 in the hesmap if(((theta <= pi/8) && (theta > -pi/8)) || (theta > 7*pi/8 || theta <= -7*pi/8)) { pcamap[left:(right-1),down:(up-1)] <- 1 if(lineflag) { Lng <- min(lng,(sigsize-centerx)) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) linex[] <- x1:x2 liney[] <- centery lines(linex,liney) } } ## along x=y : denoted as 4 in hesmap if(((theta > pi/8) && (theta <= 3*pi/8)) || ((theta > -7*pi/8) && (theta <= -5*pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 4 if(lineflag) { Lng <- min(lng,sigsize-centerx) Lng <- min(Lng,nscale-centery) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- x1:x2 liney[] <- y1:y2 lines(linex,liney) } } ## along y : as 3 in hesmap if(((theta > 3*pi/8) && (theta <= 5*pi/8)) || ((theta > -5*pi/8) && (theta <= -3*pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 3 if(lineflag) { Lng <- min(lng, nscale-centery) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- centerx liney[] <- y1:y2 lines(linex,liney) } } ## along x=-y : as 2 in hesmap if(((theta > 5*pi/8) && (theta <= 7*pi/8)) || ((theta > -3*pi/8) && (theta <= -pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 2 if(lineflag) { Lng <- min(lng,nscale-centery) Lng <- min(Lng,sigsize-centerx) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- x1:x2 liney[] <- y2:y1 lines(linex,liney) } } if(lineflag) oldLng <- Lng } ## if(lineflag==F) image(pcamap) ## From the following on, it is similar to the process of crazy climbers... beemap <- matrix(0,sigsize,nscale) dim(beemap) <- c(nscale * sigsize, 1) dim(pcamap) <- c(nscale * sigsize, 1) z <- .C("Spca_annealing", as.double(sqmodulus), beemap= as.double(beemap), as.integer(pcamap), as.double(rate), as.integer(sigsize), as.integer(nscale), as.integer(iteration), as.integer(seed), as.integer(bstep), as.integer(nbclimb), as.integer(flag.int), as.integer(chain), as.integer(flag.temp), PACKAGE="Rwave") beemap <- z$beemap dim(beemap) <- c(sigsize, nscale) dim(pcamap) <- c(sigsize, nscale) image(beemap) list(beemap = beemap, pcamap = pcamap) } Rwave/R/gabor.R0000644000176200001440000001334611341712545012766 0ustar liggesusers######################################################################### # $Log: Gabor.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### cgt <- function(input, nvoice, freqstep = (1/nvoice), scale = 1, plot = TRUE) ######################################################################### # cgt: # --- # continuous Gabor transform function: # compute the continuous Gabor transform with gaussian window. # # input: # ------ # input: input signal (possibly complex-valued) # nvoice: number of frequency bands # freqstep: sampling rate for the frequency axis # scale: size of the window # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # output: continuous (complex) gabor transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- nvoice Routput <- matrix(0, newsize, pp) Ioutput <- matrix(0, newsize, pp) output <- matrix(0, newsize, pp) dim(Routput) <- c(pp * newsize, 1) dim(Ioutput) <- c(pp * newsize, 1) dim(input) <- c(newsize, 1) z <- .C("Sgabor", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(nvoice), as.double(freqstep), as.integer(newsize), as.double(scale), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize, pp) dim(Ioutput) <- c(newsize, pp) output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) { image(1:isize, seq(0, nvoice*freqstep/2, length=nvoice), Mod(output), xlab="Time", ylab="Frequency") title("Gabor Transform Modulus") } output } vgt <- function(input, frequency, scale, plot = FALSE) ######################################################################### # vgt: # --- # continuous Gabor transform on one frequency: # compute the continuous Gabor transform with (complex-valued) # gaussian window # # input: # ------ # input: input signal (possibly complex-valued) # frequency: value of the frequency # scale: size of the window # plot: if set to TRUE, plotss the real part of cgt on the graphic # device. # # output: # ------- # Routput + i Ioutput: voice gabor transform (complex 1D array) # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) Routput <- numeric(newsize) Ioutput <- numeric(newsize) dim(input) <- c(newsize,1) z <- .C("Svgabor", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.double(frequency), as.integer(newsize), as.double(scale), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp if(plot==TRUE) { plot.ts(Re(z$tmp)); title("Real part of Gabor transform"); } Routput[1:isize] + 1i*Ioutput[1:isize] } gabor <- function(sigsize, location, frequency, scale) ######################################################################### # gabor: # ------ # Generates a Gabor for given location and frequency # # input: # ------ # sigsize: signal size (dimension of the array) # location: location of the wavelet # frequency: value of the frequency # scale: size of the window # # output: # ------- # z$gabor.r + z$gabor.i * i: gabor (complex 1D array # of size sigsize) # ######################################################################### { gabor.r <- numeric(sigsize) gabor.i <- numeric(sigsize) z <- .C("gabor_time", as.double(frequency), as.double(scale), as.integer(location), gabor.r = as.double(gabor.r), gabor.i = as.double(gabor.i), as.integer(sigsize), PACKAGE="Rwave") z$gabor.r + 1i*z$gabor.i } vecgabor <- function(sigsize, nbnodes, location, frequency, scale) ######################################################################### # vecgabor: # -------- # Generates Gabor functions for given locations and frequencies # on a ridge. # # input: # ------ # sigsize: signal size (dimension of the array) # nbnodes: number of ridge samples # location: b coordinates of the ridge samples # frequency: acoordinates of the ridge samples # scale: size of the window # # output: # ------- # z$gabor.r + z$gabor.i * i: 2D array containing the gabor # functions located on the ridge # ######################################################################### { gabor.r <- numeric(nbnodes * sigsize) gabor.i <- numeric(nbnodes * sigsize) z <- .C("vgabor_time", as.double(frequency), as.double(scale), as.integer(location), gabor.r = as.double(gabor.r), gabor.i = as.double(gabor.i), as.integer(sigsize), as.integer(nbnodes), PACKAGE="Rwave") z$gabor.r + 1i*z$gabor.i } Rwave/R/mgabor.R0000644000176200001440000001115411341712560013133 0ustar liggesusers######################################################################### # $Log: MGabor.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### mcgt <- function(input, nvoice, freqstep = (1/nvoice), nscales = 10, scalestep = 5, initscale = 0, crit = 0, plot = TRUE, tchatche = FALSE) ######################################################################### # mcgt: # ---- # multiwindow continuous Gabor transform function: # compute the continuous Gabor transform with gaussian windows. # selects the optimal window using L^p norm or entropy # optimization # # input: # ------ # input: input signal (possibly complex-valued) # nvoice: number of frequency bands # freqstep: sampling rate for the frequency axis # nscales: number of scales considered # scalestep: increment for scale parameter # initscale: initial value form the scale parameter # crit: criterion for optimization (L^p norm or entropy) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # rchatche: if set to TRUE, prints intermediate results # # output: # ------- # output: optimal continuous (complex) Gabor transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) norm <- 1 lpoptnorm <- 0 entoptnorm <- 100000000 optsca <- 0 ##################### # Loop over scales: # ##################### sca <- initscale for(k in 1:nscales){ sca <- sca + scalestep # Compute Gabor transform # ----------------------- z <- .C("Sgabor", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(nvoice), as.double(freqstep), as.integer(newsize), as.double(sca), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) # Compute L^2 norm for normalization # ---------------------------------- pexp <- as.double(2) z <- .C("Lpnorm", ltwonorm = as.double(norm), as.double(pexp), as.double(Routput), as.double(Ioutput), as.integer(newsize), as.integer(nvoice), PACKAGE="Rwave") ## cat("l2 norm=",z$ltwonorm,"\n") # Normalize # --------- Routput <- Routput/z$ltwonorm Ioutput <- Ioutput/z$ltwonorm if(crit == 0) { z <- .C("entropy", lpnorm = as.double(norm), as.double(Routput), as.double(Ioutput), as.integer(newsize), as.integer(nvoice), PACKAGE="Rwave") if(tchatche) { cat(" scale=", sca, "; entropy=", z$lpnorm, "\n") } if (z$lpnorm < entoptnorm){ entoptnorm <- z$lpnorm optsca <- sca output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] } optnorm <- entoptnorm } else { ## Compute L^p norm ## ---------------- pexp <- as.double(crit) z <- .C("Lpnorm", lpnorm = as.double(norm), as.double(pexp), as.double(Routput), as.double(Ioutput), as.integer(newsize), as.integer(nvoice), PACKAGE="Rwave") if(tchatche) { cat(" scale=", sca,"; l", pexp," norm=", z$lpnorm, "\n") } if(z$lpnorm > lpoptnorm) { lpoptnorm <- z$lpnorm optsca <- sca output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] } optnorm <- lpoptnorm } } cat(" Optimal scale: ", optsca, "\n") if(plot) { image(Mod(output), xlab="Time", ylab="Frequency") title("Gabor Transform Modulus") } output } Rwave/R/gRidge_Irregular.R0000644000176200001440000001452411341712411015100 0ustar liggesusers######################################################################### # $Log: gRidge_Recons.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # University of California, Irvine # All right reserved ######################################################################### girregrec <- function(siginput, gtinput, phi, nbnodes, nvoice, freqstep, scale, epsilon = 0.5,fast = FALSE, prob= 0.8, plot = FALSE, para = 0, hflag = FALSE, real = FALSE, check = FALSE) ######################################################################### # girregrec: # --------- # Reconstruction of a real valued signal from a (continuous) # Gabor ridge (uses a irregular sampling of the ridge) # # input: # ------- # siginput: input signal # gtinput: Continuous gabor transform (output of cgt) # phi: (unsampled) ridge # nbnodes: number of nodes used for the reconstruction. # nvoice: number of different scales per octave # freqstep: sampling rate for the frequency axis # epsilon: coeff of the Q2 term in reconstruction kernel # fast: if set to TRUE, the kernel is computed using Riemann # sums instead of Romberg's quadrature # plot: if set to TRUE, displays original and reconstructed signals # para: no comment ! # prob: sampling (irregularly) at the places of the ridge where their lambdas # are more than prob in lambda distribution. # hflag: # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # minnbnodes: minimum number of nodes for the reconstruction # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # Q2: second part of the reconstruction kernel ######################################################################### { # # first performing regular sampling # tmp <- RidgeSampling(phi,nbnodes) node <- tmp$node phinode <- tmp$phinode phi.x.min <- scale phi.x.max <- scale x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node - x.min + 1 x.inc <- 1 np <- as.integer((x.max-x.min)/x.inc)+1 cat(" (np:",np,")") if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- gkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) else Q2 <- fastgkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) } cat(" kernel;") # Generating the Q1 term in reconstruction kernel if (hflag == TRUE) one <- gsampleOne(node,scale,np) else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- gridrec(gtinput,node,phinode,nvoice, freqstep,scale,Qinv,epsilon,np, real = real, check = check) # # Now perform the irregular sampling # tmp <- RidgeIrregSampling(phinode, node, tmp2$lam, prob) node <- tmp$node phinode <- tmp$phinode phi.x.min <- scale phi.x.max <- scale x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node - x.min + 1 x.inc <- 1 np <- as.integer((x.max-x.min)/x.inc)+1 cat(" (np:",np,")") if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- gkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) else Q2 <- fastgkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) } cat(" kernel;") # Generating the Q1 term in reconstruction kernel if (hflag == TRUE) one <- gsampleOne(node,scale,np) else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- gridrec(gtinput,node,phinode,nvoice, freqstep,scale,Qinv,epsilon,np, real = real, check = check) if(plot == TRUE){ par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } list(sol=tmp2$sol,A=tmp2$A,lam=tmp2$lam,dualwave=tmp2$dualwave, gaborets=tmp2$gaborets, solskel=tmp2$solskel, inputskel = tmp2$inputskel, Q2 = Q2) } RidgeIrregSampling <- function(phinode, node, lam, prob) ######################################################################### # RidgeSamplingData: # ----------------- # Given a ridge phi (for the Gabor transform), and lam returns a # (data-driven) subsampled version of length nbnodes. # # Input: # ------ # phinode: ridge at node # lam : vector of 2 * number of regular sampled node # prob : the percentage of lam to be preserved # # Output: # ------- # node: time coordinates of the ridge sampled by lambda # phinode: frequency coordinates of the ridge sampled by lambda # ######################################################################### { nbnodes <- length(node) mlam <- numeric(nbnodes) for(j in 1:nbnodes) mlam[j] <- Mod(lam[j] + 1i*lam[nbnodes + j]) pct <- quantile(mlam,prob) count <- sum(mlam > pct) newnode <- numeric(count) newphinode <- numeric(count) count <- 0 for(j in 1:nbnodes) { if(mlam[j] > pct) { newnode[count+1] <- node[j] newphinode[count+1] <- phinode[j] count <- count + 1 } } list(node = newnode,phinode = newphinode, nbnodes = count) } Rwave/R/ingrid.R0000644000176200001440000000574611341712557013160 0ustar liggesusers######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### dw <- function(inputdata, maxresoln, scale=FALSE, NW=6, plot=TRUE) #*********************************************************************# # dw computes the Daubechies wavelet transform from resolution 1 to # the given maximum resolution. If phi.flag is TRUE, it returns a # list consisting psi and phi wavelet transforms as two matrices. #*********************************************************************# { if(! ((NW > 1) && (NW <11))) stop("NW has to be between 2 and 10") x <- adjust.length(inputdata) s <- x$signal np <- x$length check.maxresoln(maxresoln, np) phi <- matrix(0, nrow=maxresoln+1, ncol=np) psi <- matrix(0, nrow=maxresoln, ncol=np) ## Convert matrices into vectors phi <- t(phi) dim(phi) <- c(length(phi), 1) psi <- t(psi) dim(psi) <- c(length(psi), 1) z <- .C("daubechies_wt", phi=as.double(phi), psi=as.double(psi), as.double(s), as.integer(NW), as.integer(maxresoln), as.integer(np), PACKAGE="Rwave") ## Convert vectors into original matrices phi <- t(z$phi) dim(phi) <- c(np, maxresoln+1) psi <- t(z$psi) dim(psi) <- c(np, maxresoln) if(plot) plotwt(s, psi, phi, maxresoln, scale) phi <- matrix(phi[,(maxresoln+1)], ncol=1, nrow=np) list(original=s, Wf=psi, Sf=phi, maxresoln=maxresoln, np=np, NW=NW) } ddw <- function(inputdata, maxresoln, scale=FALSE, NW=6) #*********************************************************************# # ddw computes the discrete Daubechies wavelet transform from # resolution 1 to the given maximum resolution. #*********************************************************************# { if(! ((NW > 1) && (NW < 11))) stop("NW has to be between 2 and 10") x <- adjust.length(inputdata) s <- x$signal np <- x$length check.maxresoln(maxresoln, np) phi <- matrix(0, nrow=maxresoln+1, ncol=np) psi <- matrix(0, nrow=maxresoln, ncol=np) ## Convert matrices into vectors phi <- t(phi) dim(phi) <- c(length(phi), 1) psi <- t(psi) dim(psi) <- c(length(psi), 1) z <- .C("compute_ddwave", phi=as.double(phi), psi=as.double(psi), as.double(s), as.integer(maxresoln), as.integer(np), as.integer(NW), PACKAGE="Rwave") ## Convert vectors into original matrices phi <- t(z$phi) dim(phi) <- c(np, maxresoln+1) psi <- t(z$psi) dim(psi) <- c(np, maxresoln) plotwt(s, psi, phi, maxresoln, scale) phi <- matrix(phi[,(maxresoln+1)], ncol=1, nrow=np) list(original=s, Wf=psi, Sf=phi, maxresoln=maxresoln, np=np, NW=NW) } Rwave/R/Crc_Irrec.R0000644000176200001440000002041211341712402013507 0ustar liggesusers######################################################################### # $Log: Crc_Rec.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### ######################################################################### # # Functions to reconstruct a signal from the output of # the crazy climber algorithm. # ######################################################################### crcirrec <- function(siginput, inputwt, beemap, noct, nvoice, compr, minnbnodes = 2, w0 = 2*pi, bstep = 5, ptile = .01, prob = 0.8, epsilon = .5, fast = FALSE, para = 0, real = FALSE, plot=1) ######################################################################### # crcirrec: # ------- # Reconstruction of a real valued signal from ridges found by # crazy climbers on a wavelet transform (sampled irregularly). # # input: # ------ # siginput: input signal # inputwt: continuous wavelet transform (output of cwt) # beemap: output of crazy climber algorithm # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # compr: subsampling rate for the ridge # bstep: used for the chaining # ptile: # epsilon: coeff of the Q2 part of reconstruction kernel # fast: if set to TRUE, computes the Q2 kernel by Riemann sums # if not, uses a Romberg adaptive step quadrature. # para: # plot: plot the original and reconstructed signal in display # prob: the percentile to keep # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- cfamily(beemap,bstep,ptile=ptile) image(tmp$ordered) chain <- tmp$chain nbchain <- tmp$nbchain ordered <- tmp$ordered sigsize <- length(siginput) rec <- numeric(sigsize) plnb <- 0 par(mfrow=c(1,1)) plot.ts(siginput) title("Original signal") tmp <- matrix(0,nbchain,length(siginput)) totnbnodes <- 0 idx <- numeric(nbchain) p <- 0 for (j in 1:nbchain){ phi.x.min <- 2 * 2^(chain[j,3]/nvoice) if (chain[j,2] > (para*phi.x.min) ){ cat("Chain number",j) phi.x.max <- 2 * 2^(chain[j,(2+chain[j,2])]/nvoice) x.min <- chain[j,1] x.max <- chain[j,1] + chain[j,2] - 1 x.min <- x.min - round(para * phi.x.min) x.max <- x.max + round(para * phi.x.max) tmp2 <- irregrec(siginput[chain[j,1]:(chain[j,1]+chain[j,2]-1)], inputwt[chain[j,1]:(chain[j,1]+chain[j,2]-1),], chain[j,3:(chain[j,2]+2)], compr,noct,nvoice, epsilon, w0 = w0 , prob = prob, fast = fast, para = para, minnbnodes = minnbnodes, real = real); totnbnodes <- totnbnodes + tmp2$nbnodes np <- length(tmp2$sol) start <- max(1,x.min) end <- min(sigsize,x.min+np-1) start1 <- max(1,2-x.min) end1 <- min(np, sigsize +1 - x.min) end <- end1 - start1 + start rec[start:end] <- rec[start:end]+tmp2$sol[start1:end1] plnb <- plnb + 1 p <- p + 1 idx[p] <- j } } if(plot == 1) { par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput) title("Original signal") title("Reconstructed signal") } else if (plot == 2) { par(mfrow=c(plnb+2,1)) par(mar=c(2,4,4,4)) par(cex=1.1) par(err=-1) plot.ts(siginput) title("Original signal") for (j in 1:p) plot.ts(tmp[idx[j],]) plot.ts(Re(rec)) title("Reconstructed signal") } cat("Total number of ridge samples used: ",totnbnodes,"\n") par(mfrow=c(1,1)) list(rec=rec, ordered=ordered, chain = chain, comp=tmp) } crcirgrec <- function(siginput, inputgt, beemap, nvoice, freqstep, scale, compr, prob = 0.8, bstep = 5, ptile = 0.01, epsilon = 0.5, fast = TRUE, para = 0, minnbnodes = 3, hflag = FALSE, plot = 2, real = FALSE) ######################################################################### # crcirgrec: # ---------- # Reconstruction of a real valued signal from ridges found by # crazy climbers on the gabor transform (irregularly sampled). # # input: # ------ # siginput: input signal # inputgt: continuous gabor transform (output of cgt) # beemap: output of crazy climber algorithm # nvoice: number of different frequencies # freqstep: difference between two consecutive frequencies # scale: scale of the window # compr: subsampling rate for the ridge # bstep: used for the chaining # ptile: # epsilon: coeff of the Q2 part of reconstruction kernel # fast: if set to TRUE, computes the Q2 kernel by Riemann sums # if not, uses a Romberg adaptive step quadrature. # para: # prob: percentile to keep # minnbnodes: minimal number of nodes for a sampled ridge. # hflag: if set to FALSE, uses the identity as first term # in the reconstruction kernel. If not, uses Q1 instead. # plot: if set to 1, displays the signal, the components, and # signal and reconstruction one after another. If set to # 2, displays the signal, the components, and the # reconstruction on the same page. Else, no plot. # real: if set to true, uses only real constraints. # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- cfamily(beemap,bstep,ptile=ptile) image(tmp$ordered) chain <- tmp$chain nbchain <- tmp$nbchain ordered <- tmp$ordered sigsize <- length(siginput) rec <- numeric(sigsize) plnb <- 0 par(mfrow=c(1,1)) plot.ts(siginput, main="Original signal") totnbnodes <- 0 tmp <- matrix(0,nbchain,length(siginput)) for (j in 1:nbchain){ if (chain[j,2] > scale){ nbnodes <- round(chain[j,2]/compr) if(nbnodes < minnbnodes) nbnodes <- minnbnodes totnbnodes <- totnbnodes + nbnodes cat("Chain number", j) phi.x.min <- scale phi.x.max <- scale x.min <- chain[j,1] x.max <- chain[j,1] + chain[j,2] - 1 x.min <- x.min - round(para * phi.x.min) x.max <- x.max + round(para * phi.x.max) x.inc <- 1 np <- as.integer((x.max-x.min)/x.inc) + 1 tmp2 <- girregrec(siginput[chain[j,1]:(chain[j,1]+chain[j,2]-1)], inputgt[chain[j,1]:(chain[j,1]+chain[j,2]-1),], chain[j,3:(chain[j,2]+2)], nbnodes, nvoice, freqstep, scale, epsilon, fast, prob = prob, para = para, hflag = hflag, real = real) start <- max(1,x.min) end <- min(sigsize,x.min+np-1) start1 <- max(1,2-x.min) end1 <- min(np, sigsize +1 - x.min) end <- end1 - start1 + start rec[start:end] <- rec[start:end]+tmp2$sol[start1:end1] tmp[j,start:end] <- tmp2$sol[start1:end1] plnb <- plnb + 1 plot.ts(tmp[j,]) } } if(plot == 1){ par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput, main="Original signal") plot.ts(rec, main="Reconstructed signal") } else if (plot == 2) { par(mfrow=c(plnb+2,1)) par(mar=c(2,4,4,4)) par(cex=1.1) par(err=-1) plot.ts(siginput, main="Original signal") for (j in 1:nbchain) plot.ts(tmp[j,]) plot.ts(rec, main="Reconstructed signal") } cat("Total number of ridge samples used: ",totnbnodes,"\n") par(mfrow=c(1,1)) list(rec=rec, ordered=ordered,chain = chain, comp = tmp) } Rwave/R/robust.R0000644000176200001440000000637611217041512013206 0ustar liggesusers## The commands perform the test data of the robust of the ## reconstructions from ridges in wavelet transform ## The command used to generate run of testing 128 run for each db in ## c(25,20,10,5,0) chbat signal with 5 noct, 10 voice, 5 compr ## tt <- RunRec(chbat,5,10,5,128,c(25,20,10,5,0)) ## plot.ts(HOWAREYOU) ## cgtHOWAREYOU <- cgt(HOWAREYOU,70,0.01,100) ## clHOWAREYOU <- crc(Mod(cgtHOWAREYOU),nbclimb=1000) ## cfHOWAREYOU <- cfamily(clHOWAREYOU,ptile=0.001) ## image(cfHOWAREYOU$ordered > 0) ## HOWord <- cfHOWAREYOU$ordered > 0 robustrec <- function(x, nvoice, freqstep, scale, db, ptile) { ## HACK! InverseDB <- function(db) 10^(db/10) lng <- length(x) nx <- x wn <- rnorm(lng, 0, sqrt(var(nx)/InverseDB(db))) nx <- nx + wn cgtnx <- cgt(nx, nvoice, freqstep, scale, plot = FALSE) crcnx <- crc(Mod(cgtnx), nbclimb = 1000) cfnx <- cfamily(crcnx,, ptile = ptile) nxordered <- (cfnx$ordered > 0) nxordered } ## db is a vector of DB ## number of experiments (nrun) for each db (ndb) and each radius (nr) ## vdb <- c(20,15,10,5,0,-5) ## pvec <- c(0.001,0.001,0.001,0.01,0.01,0.02) ## pr <- c(0,1) ## tt <- RunRec(HOWord,HOWAREYOU,70,0.01,100,1,vdb,pvec,pr) ## MM <- apply(tt,c(1,2),mean) RunRec <- function(HOWord, x, nvoice, freqstep, scale, nrun, vdb, pvec, pr) { ndb <- length(vdb) nr <- length(pr) Run <- array(0,c(ndb,nr,nrun)) for(ii in 1:nrun) { cat("The number of run:",ii,"\n") for(jj in 1:ndb) { db <- vdb[jj] ptile <- pvec[jj] tt <- robustrec(x,nvoice,freqstep,scale,db,ptile) for(kk in 1:nr) { rr <- pr[kk] Run[jj,kk,ii] <- RidgeDist(tt,HOWord,rr) } } } Run } ## wn <- rnorm(2048,0,sqrt(var(CLICKS)/InverseDB(1))) ## 10*log10(var(CLICKS)/var(wn)) ## plot.ts(HOWAREYOU) ## cgtHOWAREYOU <- cgt(HOWAREYOU,70,0.01,100) ## clHOWAREYOU <- crc(Mod(cgtHOWAREYOU),nbclimb=1000) ## cfHOWAREYOU <- cfamily(clHOWAREYOU,ptile=0.001) ## image(cfHOWAREYOU$ordered > 0) ## HOWord <- cfHOWAREYOU$ordered > 0 band <- function(x, r) { xx <- x lng <- length(xx) yy <- logical(lng) x.rts <- as.ts(xx) for(k in 1:r) { y.rts <- lag(x.rts,-k) zz <- as.logical(y.rts) yy[(1+(k)):lng] <- zz[1:(lng-(k))] xx <- yy | xx y.rts <- lag(x.rts,k) zz <- as.logical(y.rts) yy[1:(lng-(k))] <- zz[(1+(k)):lng] yy[(lng-(k)+1):lng] <- FALSE xx <- yy | xx } xx } Sausage <- function(A, r) { if( abs(r) > 0 ) { r <- abs(r) B <- band(c(A),r) dim(B) <- c(dim(A)[1],dim(A)[2]) C <- band(c(t(B)),r) ## C <- band(c(t(A)),r) dim(C) <- c(dim(t(A))[1],dim(t(A))[2]) B <- B | t(C) } else { B <- A } B } ## Measure the distance of the two set M1 and M2: [0,1] ## (#(M1 - (M1&Sausage(M2))) + #(M2 - (M2&Sausage(M1))))/(#M1+#M2) RidgeDist <- function(m1, m2, r) { ms1 <- Sausage(m1,r) ms2 <- Sausage(m2,r) m3 <- m1 & ms2 m4 <- m1 & (!m3) m5 <- m2 & ms1 m6 <- m2 & (!m5) d <- (sum(m4) + sum(m6))/(sum(m1)+sum(m2)) d } ## confidence level: confident <- function(x, low = 0.05, high = 0.95) { ndb <- dim(x)[1] nr <- dim(x)[2] nrun <- dim(x)[3] for(jj in 1:ndb) { for(kk in 1:nr) { tmp <- x[jj,kk,] ttmp <- quantile(c(tmp), c(low,high)) cat(" = ", jj, kk, "=", ttmp, "\n") } } } Rwave/R/Ridge_Irregular.R0000644000176200001440000001420411217041512014723 0ustar liggesusers######################################################################### # $Log: Ridge_Recons.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### irregrec <- function(siginput, cwtinput,phi,compr,noct,nvoice, epsilon = 0.5, w0 = 2*pi, prob = 0.8, fast = FALSE, plot = FALSE, para = 0, hflag = FALSE, check = FALSE, minnbnodes = 2, real = FALSE) ######################################################################### # irregrec: # --------- # Reconstruction of a real valued signal from a (continuous) ridge # (uses a irregular sampling of the ridge) # # input: # ------- # siginput: input signal # cwtinput: Continuous wavelet transform (output of cwt) # phi: (unsampled) ridge # compr: subsampling rate for the wavelet coefficients (at scale 1) # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # epsilon: coeff of the Q2 term in reconstruction kernel # w0: central frequency of Morlet wavelet # fast: if set to TRUE, the kernel is computed using Riemann # sums instead of Romberg's quadrature # plot: if set to TRUE, displays original and reconstructed signals # para: constant for extending the support of reconstructed signal # outside the ridge. # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # minnbnodes: minimum number of nodes for the reconstruction # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # prob: only keep the lambda's values greater than this percential after regular sampling # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # Q2: second part of the reconstruction kernel # nbnodes: number of nodes used for the reconstruction. # ########################################################################## { # # Generate (regularly) sampled ridge # tmp <- wRidgeSampling(phi,compr,nvoice) node <- tmp$node cat("node at = ", node, "\n") phinode <- tmp$phinode nbnodes <- tmp$nbnodes phinode <- as.integer(phinode) if(nbnodes < minnbnodes){ cat(" Chain too small\n") NULL } phi.x.min <- 2 * 2^(phinode[1]/nvoice) phi.x.max <- 2 * 2^(phinode[length(node)]/nvoice) x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node + 1 - x.min x.inc <- 1 np <- as.integer((x.max - x.min)/x.inc) +1 # Generating the Q2 term in reconstruction kernel if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- rkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max,w0 = w0) else Q2 <- fastkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max,w0 = w0) } cat(" kernel; ") # Generating the Q1 term in reconstruction kernel if (hflag == TRUE){ one <- numeric(np) one[] <- 1 } else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- ridrec(cwtinput, node, phinode, noct, nvoice, Qinv, epsilon, np, w0 = w0, check = check, real = real) # # Now perform the irregular sampling # # C and Splus ... tmp <- RidgeIrregSampling(phi, node, tmp2$lam, prob) node <- tmp$node cat("node at ", node,"\n") phinode <- tmp$phinode cat("phinode at ", phinode,"\n") nbnodes <- tmp$nbnodes phinode <- as.integer(phinode) if(nbnodes < minnbnodes){ cat(" Chain too small\n") NULL } phi.x.min <- 2 * 2^(phinode[1]/nvoice) phi.x.max <- 2 * 2^(phinode[length(node)]/nvoice) x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node + 1 - x.min x.inc <- 1 np <- as.integer((x.max - x.min)/x.inc) +1 cat("(size:",np,",",nbnodes,"nodes):") # Generating the Q2 term in reconstruction kernel if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- rkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max,w0 = w0) else Q2 <- fastkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max,w0 = w0) } cat(" kernel; ") # Generating the Q1 term in reconstruction kernel if (hflag == TRUE){ one <- numeric(np) one[] <- 1 } else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- ridrec(cwtinput, node, phinode, noct, nvoice, Qinv, epsilon, np, w0 = w0, check = check, real = real) if(plot == TRUE){ par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } list(sol = tmp2$sol, A = tmp2$A, lam = tmp2$lam, dualwave = tmp2$dualwave, morvelets = tmp2$morvelets, solskel = tmp2$solskel, inputskel = tmp2$inputskel, Q2 = Q2, nbnodes = nbnodes) } Rwave/R/pca_rec.R0000644000176200001440000003662211217041512013261 0ustar liggesusers######################################################################### # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### ######################################################################### # # Functions to reconstruct a signal from the output of # the pca climber algorithm. # ######################################################################### pcarec <- function(siginput,inputwt, beemap, orientmap, noct, nvoice, compr, maxchnlng=as.numeric(dim(beemap)[1])+10,minnbnodes = 2, w0 = 2*pi, nbchain=100,bstep = 1,ptile =.01,para=5,plot=2,check=FALSE) ######################################################################### # pcarec: # ------- # Reconstruction of a real valued signal from ridges found by # pca climbers on a wavelet transform. # # input: # ------ # siginput: input signal # inputwt: continuous wavelet transform (output of cwt) # beemap: output of pca climber algorithm # orientmap: principle direction of pca climber # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # compr: subsampling rate for the ridge # maxchnlng: maxlength of a chain of ridges (a,b) # bstep: used for the chaining # ptile: # para: # plot: plot the original and reconstructed signal in display # check: check whether the reconstructed signal keeps the values # at ridges # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- pcafamily(beemap,orientmap,maxchnlng=maxchnlng,bstep=bstep,nbchain=nbchain,ptile=ptile) chain <- tmp$chain nbchain <- tmp$nbchain ordered <- tmp$ordered sigsize <- length(siginput) rec <- numeric(sigsize) plnb <- 0 if(plot != FALSE){ par(mfrow=c(2,1)) plot.ts(siginput) title("Original signal") image(tmp$ordered) title("Chained Ridges") } sol <- matrix(0,nbchain,sigsize) totnbnodes <- 0 idx <- numeric(nbchain) p <- 0 if(check==TRUE) { inputskel <- matrix(0+0i,nbchain,sigsize) solskel <- matrix(0+0i, nbchain, sigsize) } for (j in 1:nbchain){ sol[j,] <- 0 nbnode <- chain[j,1] bnode <- numeric(nbnode) anode <- numeric(nbnode) for(k in 1:nbnode) { anode[k] <- chain[j,2*k] bnode[k] <- chain[j,2*k+1] } cat("Chain number",j,"\n") tmp2 <- pcaregrec(siginput[min(bnode):max(bnode)], inputwt[min(bnode):max(bnode),], anode,bnode,compr,noct,nvoice, w0 = w0, para = para,minnbnodes = minnbnodes, check=check); if(is.list(tmp2)==TRUE) { totnbnodes <- totnbnodes + tmp2$nbnodes if((sigsize-min(bnode)) > (length(tmp2$sol)-tmp2$bstart)){ np <- length(tmp2$sol) - tmp2$bstart sol[j,min(bnode):(np+min(bnode))]<-tmp2$sol[tmp2$bstart:length(tmp2$sol)] } else { np <- sigsize - min(bnode) sol[j,min(bnode):sigsize]<-tmp2$sol[tmp2$bstart:(np+tmp2$bstart)] } if(min(bnode) < tmp2$bstart) { np <- min(bnode)-1 sol[j,1:min(bnode)]<-tmp2$sol[(tmp2$bstart-np):(tmp2$bstart)] } else { np <- tmp2$bstart-1 sol[j,(min(bnode)-np):min(bnode)]<-tmp2$sol[1:(tmp2$bstart)] } if(check==TRUE) { bridge <- tmp2$bnode aridge <- tmp2$anode wtsol <- cwt(sol[j,],noct,nvoice) for(k in 1:length(bridge)) solskel[j,k] <- wtsol[bridge[k],aridge[k]] for(k in 1:length(bridge)) inputskel[j,k] <- inputwt[bridge[k],aridge[k]] } rec <- rec+sol[j,] } plnb <- plnb + 1 p <- p + 1 idx[p] <- j } if(plot == 1){ par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput) title("Original signal") plot.ts(Re(rec)) title("Reconstructed signal") } else if (plot == 2){ par(mfrow=c(plnb+2,1)) par(mar=c(2,4,4,4)) par(cex=1.1) par(err=-1) plot.ts(siginput) title("Original signal") for (j in 1:p) plot.ts(sol[idx[j],]); plot.ts(Re(rec)) title("Reconstructed signal") } cat("Total number of ridge samples used: ",totnbnodes,"\n") par(mfrow=c(1,1)) if(check==TRUE) list(rec=rec,ordered=ordered,chain=chain, comp=tmp,inputskel=inputskel,solskel=solskel,lam=tmp2$lam) else list(rec=rec, ordered=ordered,chain=chain,comp=tmp) } PcaRidgeSampling <- function(anode, bnode, compr) ######################################################################### # PcaRidgeSampling: # ---------------- # Given a ridge (a,b)(for the Gabor transform), returns a # (regularly) subsampled version of length nbnodes. # # Input: # ------ # anode: scale coordinates of the (unsampled) ridge # bnode: time coordinates of the (unsampled) ridge # compr: compression ratio to obtain from the ridge # # Output: # ------- # bnode: time coordinates of the ridge samples (from 1 to nbnodes # step by compr) # anode: scale coordinates of the ridge samples # nbnode: number of node sampled # ######################################################################### { # number of node at the ridge nbnode <- length(anode) # compr to be integer compr <- as.integer(compr) if(compr < 1) compr <- 1 # sample rate is compr at the ridge k <- 1 count <- 1 while(k < nbnode) { anode[count] <- anode[k] bnode[count] <- bnode[k] k <- k + compr count <- count + 1 } anode[count] <- anode[nbnode] bnode[count] <- bnode[nbnode] aridge <- numeric(count) bridge <- numeric(count) aridge <- anode[1:count] bridge <- bnode[1:count] list(anode = aridge, bnode = bridge, nbnodes = count) } pcaregrec <- function(siginput,cwtinput,anode,bnode,compr,noct,nvoice, w0 = 2*pi, plot = FALSE, para = 5, minnbnodes = 2, check=FALSE) ######################################################################### # pcaregrec: # --------- # Reconstruction of a real valued signal from a (continuous) ridge # (uses a regular sampling of the ridge) # # input: # ------- # siginput: input signal # cwtinput: Continuous wavelet transform (output of cwt) # anode: the scale coordinates of the (unsampled) ridge # bnode: the time coordinates of the (unsampled) ridge # compr: subsampling rate for the wavelet coefficients (at scale 1) # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # epsilon: coeff of the Q2 term in reconstruction kernel # w0: central frequency of Morlet wavelet # fast: if set to TRUE, the kernel is computed using Riemann # sums instead of Romberg's quadrature # plot: if set to TRUE, displays original and reconstructed signals # para: constant for extending the support of reconstructed signal # outside the ridge. # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # minnbnodes: minimum number of nodes for the reconstruction # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # Q2: second part of the reconstruction kernel # nbnodes: number of nodes used for the reconstruction. # ########################################################################## { # Generate Sampled ridge # tmp <- wRidgeSampling(anode,compr,nvoice) # bnode <- tmp$node # anode <- tmp$phinode # nbnodes <- tmp$nbnodes tmp <- PcaRidgeSampling(anode, bnode, compr) bnode <- tmp$bnode anode <- tmp$anode nbnodes <- tmp$nbnodes cat("Sampled nodes (b,a): \n") for(j in 1:nbnodes) cat("(",bnode[j],anode[j],")") cat("\n") if(nbnodes < minnbnodes){ cat(" Chain too small\n") NULL } else { a.min <- 2 * 2^(min(anode)/nvoice) a.max <- 2 * 2^(max(anode)/nvoice) b.min <- min(bnode) b.max <- max(bnode) b.max <- (b.max-b.min+1) + round(para * a.max) b.min <- (b.min-b.min+1) - round(para * a.max) # location 2-b.min is the place where the min(bnode) is. # The position at 2-b.min of returned signal is aligned to # the position at min(b.node) for the reconstruction bnode <- bnode-min(bnode)+2-b.min b.inc <- 1 np <- as.integer((b.max - b.min)/b.inc) +1 cat("(size:",np,",",nbnodes,"sampled nodes):\n") # Generating the Q2 term in reconstruction kernel Q2 <- 0 # Generating the Q1 term in reconstruction kernel one <- numeric(np) one[] <- 1 Qinv <- 1/one tmp2 <- pcaridrec(cwtinput,bnode,anode,noct,nvoice, Qinv,np,w0=w0,check=check) if(plot == TRUE){ par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } lam <- tmp2$lam # if(check==TRUE) { # N <- length(lam)/2 # mlam <- numeric(N) # for(j in 1:N) # mlam[j] <- Mod(lam[j] + i * lam[N + j]) # npl(2) # plot.ts(lam,xlab="Number",ylab="Lambda Value") # title("Lambda Profile") # plot.ts(sort(mlam),xlab="Number",ylab="Mod of Lambda") # } list(sol = tmp2$sol,A = tmp2$A, lam = tmp2$lam, dualwave = tmp2$dualwave, morvelets = tmp2$morvelets,pQ2 = Q2, nbnodes=nbnodes, bstart=2-b.min, anode=tmp$anode,bnode=tmp$bnode) } } pcaridrec <- function(cwtinput,bnode,anode,noct,nvoice,Qinv,np, w0 = 2*pi, check = FALSE) ######################################################################### # pcaridrec: # --------- # Reconstruction of a real valued signal from a ridge, given # the kernel of the bilinear form. # # input: # ------ # cwtinput: Continuous wavelet transform (output of cwt) # bnode: time coordinates of the ridge samples # anode: scale coordinates of the ridge samples # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # Qinv: inverse of the reconstruction kernel # epsilon: coefficient of the Q2 term in the reconstruction kernel # np: number of samples of the reconstructed signal # w0: central frequency of Morlet wavelet # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # morwave: array of morlet wavelets located on the ridge samples # dualwave: array containing the dual wavelets. # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # ######################################################################### { # number of sampled nodes in a ridge N <- length(bnode) aridge <- anode bridge <- bnode morvelets <- pcamorwave(bridge,aridge,nvoice,np,N) cat("morvelets; ") sk <- pcazeroskeleton(cwtinput,Qinv,morvelets,bridge,aridge,N) cat("skeleton.\n") solskel <- 0 #not needed if check not done inputskel <- 0 #not needed if check not done list(sol=sk$sol,A=sk$A,lam=sk$lam,dualwave=sk$dualwave,morvelets=morvelets, solskel=solskel,inputskel = inputskel) } pcazeroskeleton <- function(cwtinput,Qinv,morvelets,bridge,aridge,N) ######################################################################### # pcazeroskeleton: # ---------------- # Computation of the reconstructed signal from the ridge when # the epsilon parameter is set to 0. # # input: # ------- # cwtinput: Continuous wavelet transform (output of cwt) # Qinv: 1D array (warning: different from skeleton) containing # the diagonal of the inverse of reconstruction kernel. # morvelets: array of morlet wavelets located on the ridge samples # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # N: number of complex constraints # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # ########################################################################## { tmp1 <- dim(morvelets)[1] constraints2 <- dim(morvelets)[2] dualwave <- matrix(0,tmp1,constraints2) for (j in 1:tmp1) { dualwave[j,] <- morvelets[j,]*Qinv[j] } A <- t(morvelets) %*% dualwave rskel <- numeric(2*N) if(is.vector(cwtinput) == TRUE) { for(j in 1:N) { rskel[j] <- Re(cwtinput[aridge[j]]) rskel[N+j] <- -Im(cwtinput[aridge[j]]) } } else { for(j in 1:N) { rskel[j] <- Re(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]) rskel[N+j] <- -Im(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]) } } B <- SVD(A) d <- B$d Invd <- numeric(length(d)) for(j in 1:(2*N)) if(d[j] < 1.0e-6) Invd[j] <- 0 else Invd[j] <- 1/d[j] lam <- B$v %*% diag(Invd) %*% t(B$u) %*% rskel sol <- dualwave%*%lam list(lam=lam,sol=sol,dualwave=dualwave,A=A) } pcamorwave <- function(bridge, aridge, nvoice, np, N, w0 = 2*pi) ######################################################################### # pcamorwave: ( the same function of morwave ) # ----------- # Generation of the wavelets located on the ridge. # # input: # ------ # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # nvoice: number of different scales per octave # np: size of the reconstruction kernel # N: number of complex constraints # w0: central frequency of Morlet wavelet # # output: # ------- # morvelets: array of morlet wavelets located on the ridge samples # ######################################################################### { morvelets <- matrix(0,np,2*N) aridge <- 2 * 2^((aridge - 1)/nvoice) tmp <- vecmorlet(np,N,bridge,aridge,w0 = w0) dim(tmp) <- c(np,N) morvelets[,1:N] <- Re(tmp[,1:N]) morvelets[,(N+1):(2*N)] <- Im(tmp[,1:N]) # Another way of generating morvelets # dirac <- 1:np # dirac[] <- 0 # for(k in 1:N) { # dirac[bridge[k]] <- 1.0; # scale <- 2 * 2^((aridge[k]-1)/nvoice); # cwtdirac <- vwt(dirac,scale); # morvelets[,k] <- Re(cwtdirac); # morvelets[,k+N] <- Im(cwtdirac); # dirac[] <- 0 # } # Still another way of generating morvelets # for(k in 1:N) { # scale <- 2 * 2^((aridge[k]-1)/nvoice); # tmp <- morlet(np,bridge[k],scale)/sqrt(2*pi); # morvelets[,k] <- Re(tmp); # morvelets[,k+N] <- Im(tmp); # } morvelets } Rwave/R/skernel.R0000644000176200001440000002502612117401320013321 0ustar liggesusers######################################################################### # $Log: Skernel.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### rwkernel <- function(node, phinode, nvoice, x.inc = 1, x.min = node[1], x.max = node[length(node)], w0 = 2*pi, plot = FALSE) ######################################################################### # rwkernel: # ------ # Computes the cost from the sample of points on the estimated ridge # and the matrix used in the reconstruction of the original signal # The output is a lng x lng matrix of complex numbers, lng being the # number of points at which the signal is to be reconstructed. # The dependence upon the original signal is only through the # sample (node,phinode) of the ridge. This should be the output # of a previously run estimation procedure. # # Input: # ------ # node: values of the variable b for the nodes of the ridge # phinode: values of the scale variable a for the nodes of the ridge # nvoice: number of scales within 1 octave # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # w0: central frequency of the wavelet # plot: if set to TRUE, displays the modulus of the matrix of Q2 # # Output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { cat("x.min = ",x.min,"\n") cat("x.max = ",x.max,"\n") cat("x.inc = ",x.inc,"\n") lng <- as.integer((x.max-x.min)/x.inc)+1 nbnode <- length(node) cat("lng = ",lng,"\n"); b.start <- x.min - 50 b.end <- x.max + 50 ker.r <- matrix(0, lng, lng) ker.i <- matrix(0, lng, lng) dim(ker.r) <- c(lng * lng, 1) dim(ker.i) <- c(lng * lng, 1) phinode <- 2 * 2^(phinode/nvoice) z <- .C("kernel", ker.r = as.double(ker.r), ker.i = as.double(ker.i), as.integer(x.min), as.integer(x.max), as.integer(x.inc), as.integer(lng), as.double(node), as.double(phinode), as.integer(nbnode), as.double(w0), as.double(b.start), as.double(b.end), PACKAGE="Rwave") ker.r <- z$ker.r ker.i <- z$ker.i dim(ker.r) <- c(lng, lng) dim(ker.i) <- c(lng, lng) ker <- matrix(0, lng, lng) ker <- ker.r + 1i*ker.i if(plot == TRUE){ par(mfrow=c(1,1)) image(Mod(ker)) title("Matrix of the reconstructing kernel (modulus)") } ker } rkernel <- function(node, phinode, nvoice, x.inc = 1, x.min = node[1], x.max = node[length(node)], w0 = 2*pi, plot = FALSE) ######################################################################### # rkernel: # ------- # Same as kernel, except that a real valued kernel is computed # (precisely the real part of the previous kernel); this applies to # real signals. # # Input: # ------ # node: values of the variable b for the nodes of the ridge # phinode: values of the scale variable a for the nodes of the ridge # nvoice: number of scales within 1 octave # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # w0: central frequency of the wavelet # plot: if set to TRUE, displays the modulus of the matrix of Q2 # # Output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { lng <- as.integer((x.max-x.min)/x.inc)+1 nbnode <- length(node) b.start <- x.min - 50 b.end <- x.max + 50 ker <- matrix(0, lng, lng) dim(ker) <- c(lng * lng, 1) phinode <- 2 * 2^(phinode/nvoice) z <- .C("rkernel", ker = as.double(ker), as.integer(x.min), as.integer(x.max), as.integer(x.inc), as.integer(lng), as.double(node), as.double(phinode), as.integer(nbnode), as.double(w0), as.double(b.start), as.double(b.end), PACKAGE="Rwave") ker <- z$ker dim(ker) <- c(lng, lng) if(plot == TRUE){ par(mfrow=c(1,1)) image(Mod(ker)) title("Matrix of the Q2 kernel (modulus)") } ker } fastkernel <- function(node, phinode, nvoice, x.inc = 1, x.min = node[1], x.max = node[length(node)], w0 = 2*pi, plot = FALSE) ######################################################################### # fastkernel: # ----------- # Same as kernel, except that the kernel is computed # using Riemann sums instead of Romberg integration. # # Input: # ------ # node: values of the variable b for the nodes of the ridge # phinode: values of the scale variable a for the nodes of the ridge # nvoice: number of scales within 1 octave # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # w0: central frequency of the wavelet # plot: if set to TRUE, displays the modulus of the matrix of Q2 # # Output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { lng <- as.integer((x.max-x.min)/x.inc)+1 nbnode <- length(node) b.start <- x.min - 50 b.end <- x.max + 50 ker.r <- matrix(0, lng, lng) ker.i <- matrix(0, lng, lng) dim(ker.r) <- c(lng * lng, 1) dim(ker.i) <- c(lng * lng, 1) phinode <- 2 * 2^(phinode/nvoice) z <- .C("fastkernel", ker.r = as.double(ker.r), ker.i = as.double(ker.i), as.integer(x.min), as.integer(x.max), as.integer(x.inc), as.integer(lng), as.double(node), as.double(phinode), as.integer(nbnode), as.double(w0), as.double(b.start), as.double(b.end), PACKAGE="Rwave") ker.r <- z$ker.r ker.i <- z$ker.i dim(ker.r) <- c(lng, lng) dim(ker.i) <- c(lng, lng) ker <- matrix(0, lng, lng) ker <- ker.r + 1i*ker.i if(plot == TRUE){ par(mfrow=c(1,1)) image(Mod(ker)) title("Matrix of the reconstructing kernel (modulus)") } ker } zerokernel <- function(x.inc = 1, x.min,x.max) ######################################################################### # zerokernel: # ----------- # Returns a zero kernel. # # Input: # ------ # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # # Output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { lng <- as.integer((x.max-x.min)/x.inc)+1 ker <- matrix(0, lng, lng) ker } gkernel <- function(node, phinode, freqstep, scale, x.inc = 1, x.min = node[1], x.max = node[length(node)], plot = FALSE) ######################################################################### # gkernel: # ------- # Same as kernel, for the case of Gabor transform. # # input: # ------ # node: values of the variable b for the nodes of the ridge # phinode: values of the frequency variable for the ridge nodes # freqstep: sampling rate for the frequency axis # scale: size of the window # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # plot: if set to TRUE, displays the modulus of the matrix of Q2 # # output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { lng <- as.integer((x.max-x.min)/x.inc)+1 nbnode <- length(node) b.start <- node[1] - 50 b.end <- node[length(node)] + 50 ker <- matrix(0, lng, lng) dim(ker) <- c(lng * lng, 1) phinode <- phinode * freqstep z <- .C("gkernel", ker = as.double(ker), as.integer(x.min), as.integer(x.max), as.integer(x.inc), as.integer(lng), as.double(node), as.double(phinode), as.integer(nbnode), as.double(scale), as.double(b.start), as.double(b.end), PACKAGE="Rwave") ker <- z$ker dim(ker) <- c(lng, lng) if(plot == TRUE){ par(mfrow=c(1,1)) image(Mod(ker)) title("Matrix of the reconstructing kernel (modulus)") } ker } fastgkernel <- function(node, phinode, freqstep, scale, x.inc = 1, x.min = node[1], x.max = node[length(node)], plot = FALSE) ######################################################################### # fastgkernel: # ------------ # Same as gkernel, except that the kernel is computed # using Riemann sums instead of Romberg integration. # # # input: # ------ # node: values of the variable b for the nodes of the ridge # phinode: values of the frequency variable for the ridge nodes # freqstep: sampling rate for the frequency axis # scale: size of the window # x.inc: step unit for the computation of the kernel # x.min: minimal value of x for the computation of Q2 # x.max: maximal value of x for the computation of Q2 # plot: if set to TRUE, displays the modulus of the matrix of Q2 # # output: # ------- # ker: matrix of the Q2 kernel # ######################################################################### { lng <- as.integer((x.max-x.min)/x.inc)+1 nbnode <- length(node) b.start <- x.min - 50 b.end <- x.max + 50 ker <- matrix(0, lng, lng) dim(ker) <- c(lng * lng, 1) phinode <- phinode*freqstep z <- .C("fastgkernel", ker = as.double(ker), as.integer(x.min), as.integer(x.max), as.integer(x.inc), as.integer(lng), as.double(node), as.double(phinode), as.integer(nbnode), as.double(scale), as.double(b.start), as.double(b.end), PACKAGE="Rwave") ker <- z$ker dim(ker) <- c(lng, lng) if(plot == TRUE){ par(mfrow=c(1,1)) image(Mod(ker)) title("Matrix of the reconstructing kernel (modulus)") } ker } Rwave/R/Snake_Annealing.R0000644000176200001440000002077211341712627014713 0ustar liggesusers######################################################################### # $Log: Snake_Annealing.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### snake <- function(tfrep, guessA, guessB, snakesize = length(guessB), tfspec = numeric(dim(modulus)[2]), subrate = 1, temprate = 3, muA = 1, muB = muA, lambdaB = 2*muB, lambdaA = 2*muA, iteration = 1000000, seed = -7, costsub = 1, stagnant = 20000, plot = TRUE) ######################################################################### # snake: # ------ # ridge extraction using snakes and simulated annealing # # input: # ------ # tfrep: the wavelet or Gabor transform. # guessA: initial guess for ridge function (frequency coordinate). # guessB: initial guess for ridge function (time coordinate). # tfspec: estimate for the contribution of the noise to the # transform modulus (1D array) # subrate: subsampling rate for the transform modulus. # temprate: constant (numerator) in the temperature schedule. # muA, muB: coeff of phi' and rho' in cost function # lambdaA,lambdaB: same thing for 2nd derivatives # iteration: maximal number of iterations # seed: initialization for random numbers generator # costsub: subsampling of the cost function in cost # costsub=1 means that the whole cost function # is returned # stagnant: maximum number of steps without move (for the # stopping criterion) # plot : when set (by default), certain results will be # displayed # # output: # ------ # A: 1D array containing the frequency coordinate of the ridge # B: 1D array containing the time coordinate of the ridge # cost: 1D array containing the cost function # ######################################################################### { sigsize <- dim(tfrep)[1] nscale <- dim(tfrep)[2] costsize <- as.integer(iteration/costsub) + 1 cost <- 1:costsize modulus <- Mod(tfrep) tfspectrum <- tfspec cost[] <- 0 phi <- as.integer(guessA) rho <- as.integer(guessB) count <- 0 dim(phi) <- c(length(phi),1) dim(rho) <- c(length(rho),1) if(plot== TRUE) image(modulus) dim(modulus) <- c(sigsize * nscale, 1) smodsize <- as.integer(sigsize/subrate) if((sigsize/subrate - as.integer(sigsize/subrate)) > 0) smodsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,smodsize,nscale) dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Smodulus_smoothing", as.double(modulus), smodulus = as.double(smodulus), as.integer(sigsize), smodsize = as.integer(smodsize), as.integer(nscale), as.integer(subrate), PACKAGE="Rwave") smodulus <- z$smodulus smodsize <- z$smodsize smodulus <- smodulus * smodulus dim(smodulus) <- c(smodsize, nscale) for (k in 1:nscale) smodulus[,k] <- smodulus[,k] - tfspectrum[k] dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Ssnake_annealing", cost = as.double(cost), as.double(smodulus), phi = as.double(phi), rho = as.double(rho), as.double(lambdaA), as.double(muA), as.double(lambdaB), as.double(muB), as.double(temprate), as.integer(sigsize), as.integer(snakesize), as.integer(nscale), as.integer(iteration), as.integer(stagnant), as.integer(seed), nb = as.integer(count), as.integer(subrate), as.integer(costsub), as.integer(smodsize), PACKAGE="Rwave") count <- z$nb cat("Number of moves:",count,"(",stagnant," still steps)\n") if(plot==TRUE) lines(z$rho+1, z$phi+1) list(A = z$phi+1, B = z$rho+1, cost = z$cost[1:count]) } snakoid <- function(modulus, guessA, guessB, snakesize = length(guessB), tfspec = numeric(dim(modulus)[2]), subrate = 1, temprate = 3, muA = 1, muB = muA, lambdaB = 2*muB, lambdaA = 2*muA, iteration = 1000000, seed = -7, costsub = 1, stagnant = 20000, plot = TRUE) ######################################################################### # snakoid: # ---------- # ridge extraction using snakes and simulated annealing # # input: # ------ # modulus: modulus of the wavelet or Gabor transform. # guessA: initial guess for ridge function (frequency coordinate). # guessB: initial guess for ridge function (time coordinate). # tfspec: estimate for the contribution of the noise to the # transform modulus (1D array) # subrate: subsampling rate for the transform modulus. # temprate: constant (numerator) in the temperature schedule. # muA, muB: coeff of phi' and rho' in cost function # lambdaA,lambdaB: same thing for 2nd derivatives # iteration: maximal number of iterations # seed: initialization for random numbers generator # costsub: subsampling of the cost function in cost # costsub=1 means that the whole cost function # is returned # stagnant: maximum number of steps without move (for the # stopping criterion) # plot: when set(default), some results will be displayed # # output: # ------ # A: 1D array containing the frequency coordinate of the ridge # B: 1D array containing the time coordinate of the ridge # cost: 1D array containing the cost function # ######################################################################### { sigsize <- dim(modulus)[1] nscale <- dim(modulus)[2] costsize <- as.integer(iteration/costsub) + 1 cost <- 1:costsize tfspectrum <- tfspec cost[] <- 0 phi <- guessA rho <- guessB count <- 0 dim(phi) <- c(length(phi),1) dim(rho) <- c(length(rho),1) if(plot== TRUE) image(modulus) dim(modulus) <- c(sigsize * nscale, 1) smodsize <- as.integer(sigsize/subrate) if((sigsize/subrate - as.integer(sigsize/subrate)) > 0) smodsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,smodsize,nscale) dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Smodulus_smoothing", as.double(modulus), smodulus = as.double(smodulus), as.integer(sigsize), smodsize = as.integer(smodsize), as.integer(nscale), as.double(subrate), PACKAGE="Rwave") smodulus <- z$smodulus smodsize <- z$smodsize smodulus <- smodulus * smodulus dim(smodulus) <- c(smodsize, nscale) for (k in 1:nscale) smodulus[,k] <- smodulus[,k] - tfspectrum[k] dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Ssnakenoid_annealing", cost = as.double(cost), as.double(smodulus), phi = as.double(phi), rho = as.double(rho), as.double(lambdaA), as.double(muA), as.double(lambdaB), as.double(muB), as.double(temprate), as.integer(sigsize), as.integer(snakesize), as.integer(nscale), as.integer(iteration), as.integer(stagnant), as.integer(seed), nb = as.integer(count), as.integer(subrate), as.integer(costsub), as.integer(smodsize), PACKAGE="Rwave") count <- z$nb cat("Number of moves:",count,"(",stagnant," still steps)\n") if(plot== TRUE) lines(z$rho+1, z$phi+1) list(A = z$phi+1, B = z$rho+1, cost = z$cost[1:count]) } snakeview <- function(modulus,snake) ######################################################################### # snakeview: # ---------- # Restrict time-frequency transform to a snake # # input: # ------ # modulus: modulus of the wavelet (or Gabor) transform # snake: B and A components of a snake # # output: # ------- # img: 2D array containing the restriction of the transform # modulus to the snake # ######################################################################### { A <- snake$A B <- snake$B snakesize <- length(A) sigsize <- dim(modulus)[1] nscale <- dim(modulus)[2] img <- matrix(0,sigsize,nscale) for(i in 1:snakesize) img[B[i],A[i]] <- modulus[B[i],A[i]] img } Rwave/R/Cwt_phase.R0000644000176200001440000000621311341712542013601 0ustar liggesusers######################################################################### # $Log: Cwt_phase.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### cwtp <- function(input, noctave, nvoice = 1, w0 = 2*pi, twoD = TRUE, plot = TRUE) ######################################################################### # cwtp: # ---- # continuous wavelet transform function: # compute the continuous wavelet transform with Morlet wavelet, # and its phase derivative (minus the wavelet frequency) # # input: # ------ # input: input signal (possibly complex-valued) # noctave: number of powers of 2 for the scale variable # nvoice: number of scales between 2 consecutive powers of 2 # w0: central frequency of Morlet wavelet # twoD: if set to TRUE, organizes the output as a 2D array # (signal_size X nb_scales) # if not: 3D array (signal_size X noctave X nvoice) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # wt: continuous (complex) wavelet transform # f: derivative of wavelet transform phase # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- noctave * nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) Foutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(Foutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) ## dyn.load("/usr/people/bruno/Swave/wave.a") ## dyn.load("/usr/people/whwang/Swave/wave.a") z <- .C("Scwt_phase", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), Ftmp = as.double(Foutput), as.integer(noctave), as.integer(nvoice), as.integer(newsize), as.double(w0), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp Foutput <- z$Ftmp dim(Routput) <- c(newsize,pp) dim(Foutput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) if(twoD) { Ftmp <- Foutput[1:isize,] output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) image(Mod(output)) list(wt=output,f=Ftmp) } else { Rtmp <- array(0,c(isize,noctave,nvoice)) Itmp <- array(0,c(isize,noctave,nvoice)) Ftmp <- array(0,c(isize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { Rtmp[,i,j] <- Routput[1:isize,(i-1)*nvoice+j] Itmp[,i,j] <- Ioutput[1:isize,(i-1)*nvoice+j] Ftmp[,i,j] <- Foutput[1:isize,(i-1)*nvoice+j] } list(wt=Rtmp+1i*Itmp, f=Ftmp) } } Rwave/R/Cwt_Morlet.R0000644000176200001440000002201114125076332013740 0ustar liggesusers######################################################################### # $Log: Cwt_Morlet.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### cwt <- function(input, noctave, nvoice = 1, w0 = 2*pi, twoD = TRUE, plot = TRUE) ######################################################################### # cwt: # --- # continuous wavelet transform function # compute the continuous wavelet transform with (complex-valued) # Morlet wavelet # # Input: # ------ # input: input signal (possibly complex-valued) # noctave: number of powers of 2 for the scale variable # nvoice: number of scales between 2 consecutive powers of 2 # w0: central frequency of Morlet wavelet # twoD: if set to TRUE, organizes the output as a 2D array # (signal_size X nb_scales) # if not: 3D array (signal_size X noctave X nvoice) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # Output: # ------- # tmp: continuous (complex) wavelet transform # ######################################################################### { oldinput <- input isize <- length(oldinput) ######################################################### ########## patch submitted by Robert Alberts 9/28/2021 # begin code patch to ensure linear convolution # calculate number of zeros required to ensure linear convolution max_scaleFactor <- 2^(noctave - 1/nvoice) morlet_size_to_use <- 26 num_zero_choices <- c(ceiling(morlet_size_to_use * max_scaleFactor)-isize,isize) num_zeros_for_linear_convolution <- max(num_zero_choices) # pad the end of the input data vector with num_zeros_for_linear_convolution oldinput <- c(oldinput,as.vector(rep(0,num_zeros_for_linear_convolution))) #end of code patch ensuring linear convolution ######################################################### tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- noctave * nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) z <- .C("Scwt_morlet", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(noctave), as.integer(nvoice), as.integer(newsize), as.double(w0), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) if(twoD) { output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) { image(Mod(output), xlab="Time", ylab="log(scale)", main="Wavelet Transform Modulus") } output } else { Rtmp <- array(0,c(isize,noctave,nvoice)) Itmp <- array(0,c(isize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { Rtmp[,i,j] <- Routput[1:isize,(i-1)*nvoice+j] Itmp[,i,j] <- Ioutput[1:isize,(i-1)*nvoice+j] } Rtmp + 1i*Itmp } } cwtpolar <- function(cwt, threshold=0.0) ######################################################################### # cwtpolar: # -------- # continuous wavelet transform conversion: # converts one of the possible outputs of cwt to modulus and phase # # input: # ------ # cwt: 3D array containing a continuous wavelet transform (output # of cwt, with twoD=FALSE) # threshold: the phase is forced to -pi if the modulus is # less than threshold. # # output: # ------- # output1: modulus # output2: phase # ######################################################################### { tmp1 <- cwt sigsize <- dim(tmp1)[1] # sig size noctave <- dim(tmp1)[2] nvoice <- dim(tmp1)[3] output1 <- array(0,c(sigsize,noctave,nvoice)) output2 <- array(0,c(sigsize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { output1[,i,j] <- sqrt(Re(tmp1[,i,j])^2 + Im(tmp1[,i,j])^2) output2[,i,j] <- atan2(Im(tmp1[,i,j]), Re(tmp1[,i,j])) } ma <- max(output1) rel <- threshold * ma dim(output1) <- c(sigsize * noctave * nvoice,1) dim(output2) <- c(sigsize * noctave * nvoice,1) output2[abs(output1) < rel] <- -3.14159 dim(output1) <- c(sigsize,noctave,nvoice) dim(output2) <- c(sigsize,noctave,nvoice) list(modulus=output1,argument=output2) } cwtimage <- function(input) ######################################################################### # cwtimage: # --------- # continuous wavelet transform display # converts the output (modulus or argument) of cwtpolar to a # 2D array and displays on the graphic device # # input: # ------ # input: 3D array containing a continuous wavelet transform (output # of cwtpolar # output: # ------- # output: 2D array # ######################################################################### { sigsize <- dim(input)[1] noctave <- dim(input)[2] nvoice <- dim(input)[3] output <- matrix(0,sigsize, noctave * nvoice) for(i in 1:noctave) { k <- (i-1) * nvoice for(j in 1:nvoice) { output[,k+j] <- input[,i,j] } } image(output) output } vwt <- function(input, scale, w0 = 2*pi) ######################################################################### # vwt: voice Morlet wavelet transform # ---- # continuous wavelet transform on one scale # compute the continuous wavelet transform with (complex-valued) # Morlet wavelet # # input: # ------ # input: input signal (possibly complex-valued) # scale: value of the scale at which the transform is computed # w0: central frequency of Morlet wavelet # # output: # ------- # Routput + i Ioutput: voice wavelet transform (complex 1D array) # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) Routput <- numeric(newsize) Ioutput <- numeric(newsize) dim(input) <- c(newsize,1) z <- .C("Svwt_morlet", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.double(scale), as.integer(newsize), as.double(w0), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp Routput[1:isize] + 1i*Ioutput[1:isize] } morlet <- function(sigsize, location, scale, w0 = 2*pi) ######################################################################### # morlet: Morlet's wavelet # ------- # Generates a Morlet wavelet for given location and scale # # input: # ------ # sigsize: signal size (dimension of the array) # location: location of the wavelet # scale: value of the scale at which the transform is computed # w0: central frequency of Morlet wavelet # # output: # ------- # z$wavelet.r + z$wavelet.i * i: wavelet (complex 1D array # of size sigsize) # ######################################################################### { wavelet.r <- numeric(sigsize) wavelet.i <- numeric(sigsize) z <- .C("morlet_time", as.double(w0), as.double(scale), as.integer(location), wavelet.r = as.double(wavelet.r), wavelet.i = as.double(wavelet.i), as.integer(sigsize), PACKAGE="Rwave") z$wavelet.r + 1i*z$wavelet.i } vecmorlet <- function(sigsize, nbnodes, bridge, aridge, w0 = 2*pi) ######################################################################### # vecmorlet: vector of Morlet's wavelets # --------- # Generates morlet wavelets located on the ridge # # input: # ------ # sigsize: signal size (dimension of the array) # nbnodes: number of ridge samples # bridge: b coordinates of the ridge samples # aridge: acoordinates of the ridge samples # w0: central frequency of Morlet wavelet # # output: # ------- # z$morlet.r + z$morlet.i * i: 2D array containing the morlet # wavelets located on the ridge # ######################################################################### { morlet.r <- numeric(nbnodes * sigsize) morlet.i <- numeric(nbnodes * sigsize) z <- .C("vmorlet_time", as.double(w0), as.double(aridge), as.integer(bridge), morlet.r = as.double(morlet.r), morlet.i = as.double(morlet.i), as.integer(sigsize), as.integer(nbnodes), PACKAGE="Rwave") z$morlet.r + 1i*z$morlet.i } Rwave/R/Pca_Climbers.R0000644000176200001440000003356011341712620014211 0ustar liggesusers######################################################################### # $Log: Pca_Climbers.S,v $ # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### pcacrc <- function(tfrep, tfspec = numeric(dim(tfrep)[2]), grida = 10, gridb = 20, pct = 0.1, count = 10000, bstep = 3, iteration = 10000, rate = .001, seed = -7, nbclimb = 10, flag.int = TRUE, chain = TRUE, flag.temp = FALSE, lineflag = FALSE, flag.cwt = FALSE) ######################################################################### # pcacrc: Time-frequency multiple ridge estimation (pca climbers) # ------ # use the pca climber algorithm to evaluate ridges of # continuous Time-Frequency transform # # input: # ------ # tfrep: wavelet or Gabor transform # tfspec: additional potential (coming from learning the noise) # grida : window of a # gridb : window of b # pct : the percent number of points in window 2*grida and # 2*gridb to select histogram # count : the maximal number of repetitive selection, if # location was chosen before # iteration: number of iterations # rate: initial value of the temperature # seed: initialization for random numbers generator # nbclimb: number of crazy climbers # bstep: step size for the climber walk in the time direction # flag.int: if set to TRUE, computes the integral on the ridge. # chain: if set to TRUE, chains the ridges. # flag.temp: if set to TRUE, keeps a constant temperature. # flag.cwt: if set to TRUE, the bstep as well as the block size # of a and b are adjusted according to the scale of wavelet # transform(not implemented yet). # linfflag: if set to TRUE, the line segments oriented to the # where the climber will move freely at the block is shown in # image # # output: # ------- # beemap: 2D array containing the (weighted or unweighted) # occupation measure (integrated with respect to time) # pcamap: 2D array containing number from 1 to 4, denoting the # direction a climber will go at some position; where # 1 moving freely along b, 3 freely along a, 2 along # line a = -b, and 4 along the line a = b. The restricted # move is perdendicular to the free move. # ######################################################################### { tfspectrum <- tfspec d <- dim(tfrep) sigsize <- d[1] nscale <- d[2] sqmodulus <- Re(tfrep*Conj(tfrep)) for (k in 1:nscale) sqmodulus[,k] <- sqmodulus[,k] - tfspectrum[k] image(sqmodulus) # percentage of points to be selected in a block # considering overlapping 1/2 on each coordinate with neighborhood nbpoint <- as.integer(2* grida * 2 * gridb * pct) # nbpoint <- as.integer(grida * gridb * pct) # number of grid size nbx <- as.integer(sigsize/gridb) nby <- as.integer(nscale/grida) if((sigsize/gridb - nbx) > 0) nbx <- nbx + 1 if((nscale/grida - nby) > 0) nby <- nby + 1 nbblock <- nbx * nby # first two locations at each block stores the lower-left corner of the block # followed by the locations of up-right corner and by the coordinates of the # selected points in the block. The locations are in the order of (x, y) tstsize <- 2 * nbpoint + 4 tst <- matrix(0, tstsize, nbblock) dim(tst) <- c(nbblock * tstsize,1) # the map of points selected in all the block pointmap <- matrix(0,sigsize,nscale) dim(pointmap) <- c(sigsize * nscale, 1) dim(sqmodulus) <- c(sigsize * nscale, 1) z <- .C("Spointmap", as.double(sqmodulus), as.integer(sigsize), as.integer(nscale), as.integer(gridb), as.integer(grida), as.integer(nbblock), as.integer(nbpoint), pointmap = as.integer(pointmap), tst =as.double(tst), as.integer(tstsize), as.integer(count), as.integer(seed), PACKAGE="Rwave") pointmap <- z$pointmap tst <- z$tst dim(pointmap) <- c(sigsize,nscale) dim(tst) <- c(tstsize, nbblock) # principle component analysis and calculate the direction at each block pcamap <- matrix(1,sigsize,nscale) # first eigenvector of a block eigv1 <- matrix(0,nbblock,2) # to draw eigenvector in a block if(lineflag) { lng <- min(grida, gridb) oldLng <- lng linex <- numeric(oldLng) liney <- numeric(oldLng) } for(j in 1:nbblock) { left <- max(1,as.integer(tst[1,j])) down <- max(1,as.integer(tst[2,j])) right <- min(as.integer(tst[3,j]),sigsize) up <- min(as.integer(tst[4,j]),nscale) input <- tst[5:tstsize,j] dim(input) <- c(2,nbpoint) input <- t(input) ctst <- var(input) eig<- eigen(ctst) # cat(" ratio in eigenvalues = ",abs(eig$values[1]/eig$values[2])," \n") # eigen vector 1 eigv1[j,] <- eig$vector[,1] # shifted center position of a block if(lineflag) { centerx <- as.integer((left + right)/2) centery <- as.integer((down + up)/2) } # theta of the eigen vector 1; -pi < theta <= pi theta <- atan2((eigv1[j,])[2],(eigv1[j,])[1]) # along x : denote 1 in the pcamap if(((theta <= pi/8) && (theta > -pi/8)) || (theta > 7*pi/8 || theta <= -7*pi/8)) { pcamap[left:(right-1),down:(up-1)] <- 1 if(lineflag) { Lng <- min(lng,(sigsize-centerx)) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) linex[] <- x1:x2 liney[] <- centery lines(linex,liney) } } # along x=y : denoted as 2 in pcamap if(((theta > pi/8) && (theta <= 3*pi/8)) || ((theta > -7*pi/8) && (theta <= -5*pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 2 if(lineflag) { Lng <- min(lng,sigsize-centerx) Lng <- min(Lng,nscale-centery) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- x1:x2 liney[] <- y1:y2 lines(linex,liney) } } # along y : as 3 in pcamap if(((theta > 3*pi/8) && (theta <= 5*pi/8)) || ((theta > -5*pi/8) && (theta <= -3*pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 3 if(lineflag) { Lng <- min(lng, nscale-centery) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- centerx liney[] <- y1:y2 lines(linex,liney) } } # along x=-y : as 4 in pcamap if(((theta > 5*pi/8) && (theta <= 7*pi/8)) || ((theta > -3*pi/8) && (theta <= -pi/8))) { pcamap[left:(right-1),down:(up-1)] <- 4 if(lineflag) { Lng <- min(lng,nscale-centery) Lng <- min(Lng,sigsize-centerx) if(Lng != oldLng) { linex <- numeric(Lng) liney <- numeric(Lng) } llng <- as.integer(Lng/2) x1 <- max(centerx-llng,1) x2 <- min(sigsize,x1 + Lng-1) y1 <- max(centery-llng,1) y2 <- min(sigsize,y1 + Lng-1) linex[] <- x1:x2 liney[] <- y2:y1 lines(linex,liney) } } if(lineflag) oldLng <- Lng } # From the following on, it is similar to the process of crazy climbers .... beemap <- matrix(0,sigsize,nscale) dim(beemap) <- c(nscale * sigsize, 1) dim(pcamap) <- c(nscale * sigsize, 1) z <- .C("Spca_annealing", as.double(sqmodulus), beemap= as.double(beemap), as.integer(pcamap), as.double(rate), as.integer(sigsize), as.integer(nscale), as.integer(iteration), as.integer(seed), as.integer(bstep), as.integer(nbclimb), as.integer(flag.int), as.integer(chain), as.integer(flag.temp), PACKAGE="Rwave") beemap <- z$beemap dim(beemap) <- c(sigsize, nscale) dim(pcamap) <- c(sigsize, nscale) image(beemap) list(beemap = beemap, pcamap = pcamap) } pcafamily <-function(pcaridge, orientmap, maxchnlng=as.numeric(dim(pcaridge)[1])+10, bstep = 1, nbchain = 100, ptile = 0.05) ######################################################################### # pcafamily: # --------- # chain the ridges obtained by pca climber. # # input: # ------ # pcaridge: ridge found by pca climber # orientmap : the first eigen vector direction at each position # bstep: maximal length for a gap in a ridge # nbchain: maximum number of chains # ptile: relative threshold for the ridges # maxchnlng: maximal chain length # # output: # ------ # ordered: ordered map: image containing the ridges # (displayed with different colors) # chain: 2D array containing the chained ridges, according # to the chain data structure: # chain[,1]: first point of the ridge # chain[,2]: length of the chain # chain[,3:(chain[,2]+2)]: values of the ridge # nbchain: number of chains. # ######################################################################### { d <- dim(pcaridge) sigsize <- d[1] nscale <- d[2] threshold <- range(pcaridge)[2] * ptile sz <- 2 * (maxchnlng); chain <- matrix(-1,nbchain,sz) orderedmap <- matrix(0,sigsize,nscale) dim(chain) <- c(nbchain * sz, 1) dim(pcaridge) <- c(nscale * sigsize, 1) dim(orderedmap) <- c(nscale * sigsize, 1) dim(orientmap) <- c(nscale * sigsize, 1) z <- .C("Spca_family", as.double(pcaridge), as.integer(orientmap), orderedmap = as.double(orderedmap), chain = as.integer(chain), chainnb = as.integer(nbchain), as.integer(sigsize), as.integer(nscale), as.integer(bstep), as.double(threshold), as.integer(maxchnlng), PACKAGE="Rwave") orderedmap <- z$orderedmap chain <- z$chain dim(orderedmap) <- c(sigsize,nscale) dim(chain) <- c(nbchain,sz) nbchain <- z$chainnb chain <- chain +1 chain[,1] <- chain[,1]-1 list(ordered = orderedmap, chain = chain, nbchain=nbchain) } pcamaxima <- function(beemap,orientmap) { d <- dim(beemap) sigsize <- d[1] nscale <- d[2] tfmaxima <- matrix(0,sigsize,nscale) dim(orientmap) <- c(nscale * sigsize, 1) dim(beemap) <- c(nscale * sigsize, 1) dim(tfmaxima) <- c(nscale * sigsize, 1) z <- .C("Stf_pcaridge", as.double(beemap), tfmaxima = as.double(tfmaxima), as.integer(sigsize), as.integer(nscale), as.integer(orientmap), PACKAGE="Rwave") tfmaxima <- z$tfmaxima dim(tfmaxima) <- c(sigsize,nscale) tfmaxima } simplepcarec <- function(siginput, tfinput, beemap, orientmap, bstep = 5, ptile = .01, plot = 2) ######################################################################### # simplepcarec: # ------------- # Simple reconstruction of a real valued signal from ridges found by # pca climbers. # # input: # ------ # siginput: input signal # tfinput: continuous time-frequency transform (output of cwt or cgt) # beemap: output of pca climber algorithm # orientmap: pca dirction of climber # bstep: used for the chaining # ptile: # plot: if set to 1, displays the signal, the components, and # signal and reconstruction one after another. If set to # 2, displays the signal, the components, and the # reconstruction on the same page. Else, no plot. # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- pcafamily(beemap,orientmap,ptile=ptile) chain <- tmp$chain nbchain <- tmp$nbchain rec <- numeric(length(siginput)) if(plot != FALSE) { par(mfrow=c(2,1)) plot.ts(siginput) title("Original signal") image(tmp$ordered) title("Chained Ridges") } npl(1) sigsize <- dim(tfinput)[1] nscale <- dim(tfinput)[2] rec <- numeric(sigsize) tmp3 <- matrix(0+0i,nbchain,sigsize) for (j in 1:nbchain){ for(i in 1:chain[j,1]) { cat("The (b,a) at chain", j,"is (",chain[j,2*i+1],chain[j,2*i],")\n") tmp3[j,chain[j,2*i+1]] <- tmp3[j,chain[j,2*i+1]]+ 2*tfinput[chain[j,2*i+1],chain[j,2*i]] } rec <- rec + Re(tmp3[j,]) } if(plot == 1) { par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput) title("Original signal") plot.ts(rec) title("Reconstructed signal") } else if (plot == 2) { par(mfrow=c(nbchain+2,1)) par(mar=c(2,4,4,4)) par(cex=1.1) par(err=-1) plot.ts(siginput) title("Original signal") for (j in 1:nbchain) plot.ts(Re(tmp3[j,])) plot.ts(rec) title("Reconstructed signal") } list(rec=rec, ordered=tmp$ordered, chain = tmp$chain, comp=tmp3) } Rwave/R/mreconst.R0000644000176200001440000000623411341716267013531 0ustar liggesusers######################################################################### # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, Andrea Wang # Princeton University # All right reserved ######################################################################## mrecons <- function(extrema, filtername="Gaussian1", readflag=FALSE) #**************************************************************** # mrecons # -------- # Reconstruct from dyadic extrema. The reconstructed signal # preserves locations and values at extrema. This is Carmona's # method of extrema reconstruction. # # input # ----- # extrema : the extrema representation # filtername : filters (Gaussain1 stands filters corresponding to # Mallat and Zhong's wavelet. And, the Haar stands for the # filters for Haar basis. # readflag: if set to TRUE, read kernel from a precomputed file. # # output # ------ # f: signal reconstructed from the wavelet transform extrema # g: f plus mean of f # h: f plus coarse scale of f #**************************************************************** { pure <- extrema$original x <- adjust.length(pure) pure.data <- x$signal data <- extrema$original maxresoln <- extrema$maxresoln np <- extrema$np if(2^maxresoln > np) stop("The support of the coarsest scale filter is bigger than signal size") if((readflag && (maxresoln > 9)) || (np > 4096)) stop("Can not use readflag") dim(extrema$extrema) <- c(length(extrema$extrema), 1) f <- 1:np z <- .C("extrema_reconst", as.character(filtername), a = as.double(f), as.double(extrema$extrema), as.integer(maxresoln), as.integer(np), as.integer(readflag), PACKAGE="Rwave") f <- z$a g <- f + mean(pure.data) h <- f + extrema$Sf lim <- range(f, g, h, pure.data) par(mfrow=c(3,1)) plot.ts(f, ylim=lim, xlab="", ylab="", main="Reconstruction") plot.ts(g, ylim=lim, xlab="", ylab="", main="Reconstruction + Mean") plot.ts(h, ylim=lim, xlab="", ylab="", main="Reconstruction + Sf") par(mfrow=c(1,1)) list(f=f, g=g, h=h) } dwinverse <- function(wt, filtername="Gaussian1") #**************************************************************** # dwinverse # --------- # Invert the dyadic wavelet transform. # # input # ----- # wt: the wavelet transform # filtername : filters used. ("Gaussian1" stands for the filters # corresponds to those of Mallat and Zhong's wavlet. And # "Haar" stands for the filters of Haar basis. # # output # ------ # f: the reconstructed signal #**************************************************************** { Sf <- wt$Sf Sf <- c(Sf) dim(Sf) <- c(length(Sf), 1) Wf <- wt$Wf Wf <- c(Wf) dim(Wf) <- c(length(Wf), 1) np <- wt$np maxresoln <- wt$maxresoln fback <- 1:np dim(fback) <- c(length(fback), 1) z <- .C("Sinverse_wavelet_transform", a = as.double(fback), as.double(Sf), as.double(Wf), as.integer(maxresoln), as.integer(np), as.character(filtername), PACKAGE="Rwave") f <- z$a f } Rwave/R/Cwt_Thierry.R0000644000176200001440000001010714070702437014130 0ustar liggesusers######################################################################### # $Log: Cwt_Thierry.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### cwtTh <- function(input, noctave, nvoice = 1, moments, twoD = TRUE, plot = TRUE) ######################################################################### # cwtTh: Cauchy's wavelet transform # ----- # continuous wavelet transform function: # compute the continuous wavelet transform with (complex-valued) # Cauchy's wavelet # # input: # ------ # input: input signal (possibly complex-valued) # noctave: number of powers of 2 for the scale variable # nvoice: number of scales between 2 consecutive powers of 2 # moments: number of vanishing moments for the wavelet # twoD: if set to TRUE, organizes the output as a 2D array # (signal_size X nb_scales) # if not: 3D array (signal_size X noctave X nvoice) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # tmp: continuous (complex) wavelet transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- noctave * nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) z <- .C("Scwt_thierry", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(noctave), as.integer(nvoice), as.integer(newsize), as.integer(moments), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) if(twoD) { output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) { image(Mod(output),xlab="Time",ylab="log(scale)") title("Wavelet Transform Modulus") } output } else { Rtmp <- array(0,c(isize,noctave,nvoice)) Itmp <- array(0,c(isize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { Rtmp[,i,j] <- Routput[1:isize,(i-1)*nvoice+j] Itmp[,i,j] <- Ioutput[1:isize,(i-1)*nvoice+j] } Rtmp + 1i*Itmp } } vwtTh <- function(input, scale, moments) ######################################################################### # vwtTh: # ----- # continuous wavelet transform on one scale: # compute the continuous wavelet transform with (complex-valued) # Cauchy's wavelet # # input: # ------ # input: input signal (possibly complex-valued) # scale: value of the scale at which the transform is computed # moments: number of vanishing moments # # output: # ------- # Routput + i Ioutput: voice wavelet transform (complex 1D array) # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) Routput <- numeric(newsize) Ioutput <- numeric(newsize) dim(input) <- c(newsize,1) z <- .C("Svwt_thierry", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.double(scale), as.integer(newsize), as.integer(moments), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp Routput[1:isize] + 1i*Ioutput[1:isize] } Rwave/R/cwt_dog.R0000644000176200001440000000764611341712540013323 0ustar liggesusers######################################################################### # $Log: Cwt_DOG.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### DOG <- function(input, noctave, nvoice = 1, moments, twoD = TRUE, plot = TRUE) ######################################################################### # DOG: Derivative of Gaussian # ---- # continuous wavelet transform function: # compute the continuous wavelet transform with (complex-valued) # derivative of gaussians wavelet # # input: # ------ # input: input signal (possibly complex-valued) # noctave: number of powers of 2 for the scale variable # nvoice: number of scales between 2 consecutive powers of 2 # moments: number of vanishing moments for the wavelet # twoD: if set to TRUE, organizes the output as a 2D array # (signal_size X nb_scales) # if not: 3D array (signal_size X noctave X nvoice) # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # tmp: continuous (complex) wavelet transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) pp <- noctave * nvoice Routput <- matrix(0,newsize,pp) Ioutput <- matrix(0,newsize,pp) output <- matrix(0,newsize,pp) dim(Routput) <- c(pp * newsize,1) dim(Ioutput) <- c(pp * newsize,1) dim(input) <- c(newsize,1) z <- .C("Scwt_DOG", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(noctave), as.integer(nvoice), as.integer(newsize), as.integer(moments), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize,pp) dim(Ioutput) <- c(newsize,pp) if(twoD) { output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) image(Mod(output)) output } else { Rtmp <- array(0,c(isize,noctave,nvoice)) Itmp <- array(0,c(isize,noctave,nvoice)) for(i in 1:noctave) for(j in 1:nvoice) { Rtmp[,i,j] <- Routput[1:isize,(i-1)*nvoice+j] Itmp[,i,j] <- Ioutput[1:isize,(i-1)*nvoice+j] } Rtmp + 1i * Itmp } } vDOG <- function(input, scale, moments) ######################################################################### # vDOG: # ----- # continuous wavelet transform on one scale: # compute the continuous wavelet transform with (complex-valued) # derivative of gaussians wavelet # # input: # ------ # input: input signal (possibly complex-valued) # scale: value of the scale at which the transform is computed # moments: number of vanishing moments # # output: # ------- # Routput + i Ioutput: voice wavelet transform (complex 1D array) # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) Routput <- numeric(newsize) Ioutput <- numeric(newsize) dim(input) <- c(newsize,1) z <- .C("Svwt_DOG", as.double(Re(input)), as.double(Im(input)), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.double(scale), as.integer(newsize), as.integer(moments), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp Routput[1:isize] + 1i*Ioutput[1:isize] } Rwave/R/simul.R0000644000176200001440000000762514070702361013025 0ustar liggesusers######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### #*********************************************************************# # mnpval #*********************************************************************# mnpval <- function(inputdata, maxresoln, wl=128, scale=FALSE) { x <- adjust.length(inputdata) s <- x$signal np <- x$length num.of.windows <- (np/wl - 1) * 4 + 1 pval <- matrix(0, nrow=maxresoln, ncol=np) pval <- t(pval) dim(pval) <- c(length(pval), 1) z <- .C("normal_pval_compute", a=as.double(pval), as.double(s), as.integer(maxresoln), as.integer(np), as.integer(num.of.windows), as.integer(wl), PACKAGE="Rwave") pval <- t(z$a) dim(pval) <- c(np, maxresoln) plotResult(pval, s, maxresoln, scale) list( original=s, pval=pval, maxresoln=maxresoln, np=np ) } #*********************************************************************# # mbpval #*********************************************************************# mbpval <- function(inputdata, maxresoln, wl=128, scale=FALSE) { x <- adjust.length(inputdata) s <- x$signal np <- x$length num.of.windows <- (np/wl - 1) * 4 + 1 pval <- matrix(0, nrow=maxresoln, ncol=np) pval <- t(pval) dim(pval) <- c(length(pval), 1) z <- .C("bootstrap_pval_compute", a=as.double(pval), as.double(s), as.integer(maxresoln), as.integer(np), as.integer(num.of.windows), as.integer(wl), PACKAGE="Rwave") pval <- t(z$a) dim(pval) <- c(np, maxresoln) plotResult(pval, s, maxresoln, scale) list( original=s, pval=pval, maxresoln=maxresoln, np=np ) } #*********************************************************************# # mntrim #*********************************************************************# mntrim <- function(extrema, scale=FALSE, prct=.95) { s <- extrema$original maxresoln <- extrema$maxresoln np <- extrema$np sample.size <- 128 nthresh <- 1:maxresoln # Find the threshold for each resoln z <- .C("nthresh_compute", a=as.double(nthresh), as.double(s), as.integer(maxresoln), as.integer(sample.size), as.double(prct), PACKAGE="Rwave") nthresh <- z$a trim <- matrix(0, nrow=np, ncol=maxresoln) for (j in 1:maxresoln) { # Keep the extrema if the absolute value of the extrema >= threshold temp <- (abs(extrema$extrema[,j]) >= nthresh[j]) trim[,j] <- temp * extrema$extrema[,j] } cat("number of extrema left =", sum(trim!=0), "\n") plotResult(trim, s, maxresoln, scale) list( original=s, extrema=trim, Sf=extrema$Sf, maxresoln=maxresoln, np=np ) } #*********************************************************************# # mbtrim #*********************************************************************# mbtrim <- function(extrema, scale=FALSE, prct=.95) { s <- extrema$original maxresoln <- extrema$maxresoln np <- extrema$np sample.size <- 128 bthresh <- 1:maxresoln # Find the threshold for each resoln z <- .C("bthresh_compute", a=as.double(bthresh), as.double(s), as.integer(maxresoln), as.integer(sample.size), as.double(prct), PACKAGE="Rwave") bthresh <- z$a trim <- matrix(0, nrow=np, ncol=maxresoln) for (j in 1:maxresoln) { # Keep the extrema if the absolute value of the extrema >= threshold temp <- (abs(extrema$extrema[,j]) >= bthresh[j]) trim[,j] <- temp * extrema$extrema[,j] } cat("number of extrema left =", sum(trim!=0), "\n") plotResult(trim, s, maxresoln, scale) list( original=s, extrema=trim, Sf=extrema$Sf, maxresoln=maxresoln, np=np ) } Rwave/R/Crazy_Climbers.R0000644000176200001440000001177111341712511014575 0ustar liggesusers######################################################################### # $Log: Crazy_Climbers.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### crc <- function(tfrep, tfspec = numeric(dim(tfrep)[2]), bstep = 3, iteration = 10000, rate = .001, seed = -7, nbclimb=10, flag.int = TRUE, chain = TRUE, flag.temp = FALSE) ######################################################################### # crc: Time-frequency multiple ridge estimation (crazy climbers) # ---- # use the crazy climber algorithm to evaluate ridges of # continuous Time-Frequency transform # # input: # ------ # tfrep: wavelet or Gabor transform # tfspec: additional potential (coming from learning the noise) # iteration: number of iterations # rate: initial value of the temperature # seed: initialization for random numbers generator # nbclimb: number of crazy climbers # bstep: step size for the climber walk in the time direction # flag.int: if set to TRUE, computes the integral on the ridge. # chain: if set to TRUE, chains the ridges. # flag.temp: if set to TRUE, keeps a constant temperature. # # output: # ------- # beemap: 2D array containing the (weighted or unweighted) # occupation measure (integrated with respect to time) # ######################################################################### { tfspectrum <- tfspec d <- dim(tfrep) sigsize <- d[1] nscale <- d[2] beemap <- matrix(0,sigsize,nscale) sqmodulus <- Re(tfrep*Conj(tfrep)) for (k in 1:nscale) sqmodulus[,k] <- sqmodulus[,k] - tfspectrum[k] dim(beemap) <- c(nscale * sigsize, 1) dim(sqmodulus) <- c(nscale * sigsize, 1) z <- .C("Sbee_annealing", as.double(sqmodulus), beemap= as.double(beemap), as.double(rate), as.integer(sigsize), as.integer(nscale), as.integer(iteration), as.integer(seed), as.integer(bstep), as.integer(nbclimb), as.integer(flag.int), as.integer(chain), as.integer(flag.temp), PACKAGE="Rwave") beemap <- z$beemap dim(beemap) <- c(sigsize,nscale) if(dev.set() != 1) image(beemap) beemap } cfamily <- function(ccridge, bstep = 1, nbchain = 100, ptile = 0.05) ######################################################################### # cfamily: # -------- # chain the ridges obtained by crazy climber. # # input: # ------ # ccridge: unchained ridge (output of Bee_Annealing) # bstep: maximal length for a gap in a ridge # nbchain: maximum number of chains # ptile: relative threshold for the ridges # # output: # ------ # ordered: ordered map: image containing the ridges # (displayed with different colors) # chain: 2D array containing the chained ridges, according # to the chain data structure: # chain[,1]: first point of the ridge # chain[,2]: length of the chain # chain[,3:(chain[,2]+2)]: values of the ridge # nbchain: number of chains. # ######################################################################### { d <- dim(ccridge) sigsize <- d[1] nscale <- d[2] threshold <- range(ccridge)[2] * ptile sz <- sigsize + 2 chain <- matrix(-1,nbchain,sz) orderedmap <- matrix(0,sigsize,nscale) dim(chain) <- c(nbchain * sz, 1) dim(ccridge) <- c(nscale * sigsize, 1) dim(orderedmap) <- c(nscale * sigsize, 1) z <- .C("Scrazy_family", as.double(ccridge), orderedmap = as.double(orderedmap), chain = as.integer(chain), chainnb = as.integer(nbchain), as.integer(sigsize), as.integer(nscale), as.integer(bstep), as.double(threshold), PACKAGE="Rwave") orderedmap <- z$orderedmap chain <- z$chain dim(orderedmap) <- c(sigsize,nscale) dim(chain) <- c(nbchain,sz) nbchain <- z$chainnb chain <- chain +1 chain[,2] <- chain[,2]-1 list(ordered = orderedmap, chain = chain, nbchain=nbchain) } crfview <- function(beemap, twod=TRUE) ######################################################################### # crfview: # -------- # displays a family of chained ridges # ######################################################################### { if (twod) image(beemap$ordered > 0) else { Dim <- dim(beemap$ordered) matmp <- matrix(0,Dim[1],Dim[2]) matmp[1,1] <- 1 image(matmp) for (k in 1:beemap$nbchain){ start <- beemap$chain[k,1] end <- start + beemap$chain[k,2] lines(start:(end-1), beemap$chain[k,3:(end-start+2)], type="l") } } title(" Chained Ridges") cat("") } Rwave/R/noise.R0000644000176200001440000000565011217041512012777 0ustar liggesusers######################################################################### # $Log: Noise.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### tfpct <- function(input,percent=.8,plot=TRUE) ######################################################################### # tfpct: # ------ # compute a percentile of time-frequency representation frequency # by frequency # # input: # ------ # input: modulus of the continuous wavelet transform (2D array) # percent: value of the percentile to be computed # plot: if set to TRUE, displays the values of the energy as a # function of the scale # # output: # ------- # output: 1D array of size nbscales containing the noise estimate # ######################################################################### { nscale <- dim(input)[2] output <- numeric(nscale) for(i in 1:nscale) output[i] <- quantile(input[,i],percent) if(plot)plot.ts(output) output } tfmean <- function(input,plot=TRUE) ######################################################################### # tfmean: # ------- # compute the mean of time-frequency representation frequency # by frequency # # input: # ------ # input: modulus of the continuous wavelet transform (2D array) # plot: if set to TRUE, displays the values of the energy as a # function of the scale # # output: # ------- # output: 1D array of size nbscales containing the noise estimate # ######################################################################### { nscale <- dim(input)[2] output <- numeric(nscale) for(i in 1:nscale) output[i] <- mean(input[,i]) if(plot) plot.ts(output) output } tfvar <- function(input,plot=TRUE) ######################################################################### # tfvar: # ------ # compute the variance of time-frequency representation frequency # by frequency # # input: # ------ # input: modulus of the continuous wavelet transform (2D array) # plot: if set to TRUE, displays the values of the energy as a # function of the scale # # output: # ------- # output: 1D array of size nbscales containing the noise estimate # ######################################################################### { nscale <- dim(input)[2] output <- numeric(nscale) for(i in 1:nscale) output[i] <- var(input[,i]) if(plot) plot.ts(output) output } Rwave/R/wv.R0000644000176200001440000000413111341713413012313 0ustar liggesusers######################################################################### # $Log: WV.S,v $ ######################################################################### # # (c) Copyright 1998 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### WV <- function(input, nvoice, freqstep = (1/nvoice), plot = TRUE) ######################################################################### # WV: # --- # Wigner-Ville function # compute the Wigner-Ville transform, without any smoothing # # input: # ------ # input: input signal (possibly complex-valued) # nvoice: number of frequency bands # freqstep: sampling rate for the frequency axis # plot: if set to TRUE, displays the modulus of cwt on the graphic # device. # # output: # ------- # output: (complex) Wigner-Ville transform # ######################################################################### { oldinput <- input isize <- length(oldinput) tmp <- adjust.length(oldinput) input <- tmp$signal newsize <- length(input) ## pp <- nvoice pp <- newsize Routput <- matrix(0, newsize, pp) Ioutput <- matrix(0, newsize, pp) output <- matrix(0, newsize, pp) dim(Routput) <- c(pp * newsize, 1) dim(Ioutput) <- c(pp * newsize, 1) dim(input) <- c(newsize, 1) z <- .C("WV", as.double(input), Rtmp = as.double(Routput), Itmp = as.double(Ioutput), as.integer(nvoice), as.double(freqstep), as.integer(newsize), PACKAGE="Rwave") Routput <- z$Rtmp Ioutput <- z$Itmp dim(Routput) <- c(newsize, pp) dim(Ioutput) <- c(newsize, pp) output <- Routput[1:isize,] + 1i*Ioutput[1:isize,] if(plot) { image(Mod(output[,1:(isize/2)]), xlab="Time", ylab="Frequency") title("Wigner-Ville Transform Modulus") } output } Rwave/R/Ridge_Icm.R0000644000176200001440000000612411341712622013506 0ustar liggesusers######################################################################### # $Log: Ridge_Icm.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### icm <- function(modulus, guess, tfspec = numeric(dim(modulus)[2]), subrate = 1, mu = 1, lambda = 2*mu, iteration = 100) ######################################################################### # icm: # ---- # ridge extraction using icm algorithm # # Input: # ------ # modulus: modulus of the wavelet or Gabor transform. # guess: initial guess for ridge function (1D array). # tfspec: estimate for the contribution of the noise to the # transform square modulus (1D array). # subrate: subsampling rate for the transform square modulus. # lambda: coefficient in front of phi'' in the cost function # mu: coefficient in front of phi' in the cost function # iteration: maximal number of iterations # # Output: # ------- # ridge: 1D array (of length sigsize) containing the ridge # cost: 1D array containing the cost function # ######################################################################### { sigsize <- dim(modulus)[1] nscale <- dim(modulus)[2] costsize <- iteration cost <- 1:costsize tfspectrum <- tfspec cost[] <- 0 phi <- as.integer(guess) count <- 0 dim(phi) <- c(sigsize,1) dim(modulus) <- c(sigsize * nscale, 1) smodsize <- as.integer(sigsize/subrate) if((sigsize/subrate - as.integer(sigsize/subrate)) > 0) smodsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,smodsize,nscale) dim(smodulus) <- c(smodsize * nscale, 1) if (subrate != 1){ z <- .C("Smodulus_smoothing", as.double(modulus), smodulus = as.double(smodulus), as.integer(sigsize), smodsize = as.integer(smodsize), as.integer(nscale), as.integer(subrate), PACKAGE="Rwave") smodulus <- z$smodulus smodsize <- z$smodsize } else smodulus <- modulus smodulus <- smodulus * smodulus dim(smodulus) <- c(smodsize, nscale) for (k in 1:nscale) smodulus[,k] <- smodulus[,k] - tfspectrum[k] dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Sridge_icm", cost = as.double(cost), as.double(smodulus), phi = as.double(phi), as.double(lambda), as.double(mu), as.integer(sigsize), as.integer(nscale), as.integer(iteration), nb = as.integer(count), as.integer(subrate), as.integer(smodsize), PACKAGE="Rwave") count <- z$nb cat("Number of iterations:",count,"\n") list(ridge = z$phi+1, cost = z$cost[1:count]) } Rwave/R/Ridge_Annealing.R0000644000176200001440000001660711341712621014700 0ustar liggesusers######################################################################### # $Log: Ridge_Annealing.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # University of California, Irvine # All right reserved ######################################################################### corona <- function(tfrep, guess, tfspec = numeric(dim(tfrep)[2]), subrate = 1, temprate = 3, mu = 1, lambda = 2*mu, iteration = 1000000, seed = -7, stagnant = 20000, costsub = 1, plot = TRUE) ######################################################################### # corona: # ------- # ridge extraction using simulated annealing # compute the continuous wavelet transform ridge from the cwt # modulus, using simulated annealing # # Input: # ------ # tfrep: wavelet or Gabor transform. # guess: initial guess for ridge function (1D array). # tfspec: estimate for the contribution of the noise to the # transform modulus (1D array) # subrate: subsampling rate for the transform modulus. # temprate: constant (numerator) in the temperature schedule. # lambda: coefficient in front of phi' in the cost function # mu: coefficient in front of phi'' in the cost function # iteration: maximal number of iterations # seed: initialization for random numbers generator # stagnant: maximum number of steps without move (for the # stopping criterion) # costsub: subsampling of the cost function in cost # costsub = 1 means that the whole cost function # is returned # plot: when set(default), some results will be shown on # the display # # Output: # ------- # ridge: 1D array (of length sigsize) containing the ridge # cost: 1D array containing the cost function # ######################################################################### { sigsize <- dim(tfrep)[1] nscale <- dim(tfrep)[2] blocksize <- 1 costsize <- as.integer(iteration/blocksize) + 1 cost <- 1:costsize modulus <- Mod(tfrep) tfspectrum <- tfspec cost[] <- 0 phi <- as.integer(guess) count <- 0 dim(phi) <- c(sigsize,1) dim(modulus) <- c(sigsize * nscale, 1) smodsize <- as.integer(sigsize/subrate) if((sigsize/subrate - as.integer(sigsize/subrate)) > 0) smodsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,smodsize,nscale) dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Smodulus_smoothing", as.double(modulus), smodulus = as.double(smodulus), as.integer(sigsize), smodsize = as.integer(smodsize), as.integer(nscale), as.integer(subrate), PACKAGE="Rwave") smodulus <- z$smodulus smodsize <- z$smodsize smodulus <- smodulus * smodulus dim(smodulus) <- c(smodsize, nscale) for (k in 1:nscale) smodulus[,k] <- smodulus[,k] - tfspectrum[k] dim(smodulus) <- c(smodsize * nscale, 1) cat("dimension of smodulus",dim(smodulus),"\n") z <- .C("Sridge_annealing", cost = as.double(cost), as.double(smodulus), phi = as.double(phi), as.double(lambda), as.double(mu), as.double(temprate), as.integer(sigsize), as.integer(nscale), as.integer(iteration), as.integer(stagnant), as.integer(seed), nb = as.integer(count), as.integer(subrate), as.integer(costsub), as.integer(smodsize), PACKAGE="Rwave") count <- z$nb cat("Number of iterations:",(count-1)*costsub,"(stagnant=",stagnant,")\n") if(plot == TRUE) { image(Mod(tfrep)) lines(z$phi+1) } list(ridge = z$phi+1, cost = z$cost[1:count]) } coronoid <- function(tfrep, guess, tfspec = numeric(dim(tfrep)[2]), subrate = 1, temprate = 3, mu = 1, lambda = 2*mu, iteration = 1000000, seed = -7, stagnant = 20000, costsub = 1,plot=TRUE) ######################################################################### # coronoid: # ---------- # ridge extraction using modified simulated annealing # Modification of Sridge_annealing, the cost function is # replaced with another one, in which the smoothness penalty # is proportional to the transform modulus. # # Input: # ------ # tfrep: wavelet or Gabor transform. # guess: initial guess for ridge function (1D array). # tfspec: estimate for the contribution of the noise to the # transform modulus (1D array) # subrate: subsampling rate for the transform modulus. # temprate: constant (numerator) in the temperature schedule. # lambda: coefficient in front of phi' in the cost function # mu: coefficient in front of phi'' in the cost function # iteration: maximal number of iterations # seed: initialization for random numbers generator # stagnant: maximum number of steps without move (for the # stopping criterion) # costsub: subsampling of the cost function in cost # costsub=1 means that the whole cost function # is returned # plot: when set(default), some results will be shown on # the display # # Output: # ------- # ridge: 1D array (of length sigsize) containing the ridge # cost: 1D array containing the cost function # ######################################################################### { sigsize <- dim(tfrep)[1] nscale <- dim(tfrep)[2] costsize <- as.integer(iteration/costsub) + 1 cost <- 1:costsize modulus <- Mod(tfrep) tfspectrum <- tfspec cost[] <- 0 phi <- as.integer(guess) count <- 0 dim(phi) <- c(sigsize,1) dim(modulus) <- c(sigsize * nscale, 1) smodsize <- as.integer(sigsize/subrate) if((sigsize/subrate - as.integer(sigsize/subrate)) > 0) smodsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,smodsize,nscale) dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Smodulus_smoothing", as.double(modulus), smodulus = as.double(smodulus), as.integer(sigsize), smodsize = as.integer(smodsize), as.integer(nscale), as.integer(subrate), PACKAGE="Rwave") smodulus <- z$smodulus smodsize <- z$smodsize smodulus <- smodulus * smodulus dim(smodulus) <- c(smodsize, nscale) for (k in 1:nscale) smodulus[,k] <- smodulus[,k] - tfspectrum[k] dim(smodulus) <- c(smodsize * nscale, 1) z <- .C("Sridge_coronoid", cost = as.double(cost), as.double(smodulus), phi = as.double(phi), as.double(lambda), as.double(mu), as.double(temprate), as.integer(sigsize), as.integer(nscale), as.integer(iteration), as.integer(stagnant), as.integer(seed), nb = as.integer(count), as.integer(subrate), as.integer(costsub), as.integer(smodsize), PACKAGE="Rwave") count <- z$nb cat("Number of iterations:",(count-1)*costsub,"(stagnant=",stagnant,")\n") if(plot == TRUE) { image(Mod(tfrep)) lines(z$phi+1) } list(ridge = z$phi+1, cost = z$cost[1:count]) } Rwave/R/plot.R0000644000176200001440000000576411217041512012646 0ustar liggesusers ######################################################################### # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, Andrea Wang # Princeton University # All right reserved ######################################################################## plotwt <- function(original, psi, phi, maxresoln, scale=FALSE, yaxtype="s") #*********************************************************************# # plotwt # ------ # Plot wavelet transform # Output the original signal, wavelet transform Wf starting resoln 1, # and Sf at the last resoln # Used by mw and dw #*********************************************************************# { par.orig <- par(no.readonly = TRUE) # Save the original plot parameters par(mfrow = c((maxresoln+2), 1)) par(mar=c(2.0, 2.0, 0.5, 0.5)) par(oma=c(1,0,0,0)) # Change 1 to a larger number to allow a larger # bottom margin if ( !scale ) { plot.ts(original,bty="n",yaxt=yaxtype) for (j in 1:maxresoln) plot.ts(psi[,j],bty="n",yaxt=yaxtype) plot.ts(phi, bty="n",yaxt=yaxtype) } else { limit <- range(original, psi, phi) plot.ts(original, ylim=limit, bty="n",yaxt=yaxtype) for (j in 1:maxresoln) plot.ts(psi[,j], ylim=limit, bty="n",yaxt=yaxtype) plot.ts(phi, ylim=limit, bty="n",yaxt=yaxtype) } par(par.orig) } plotResult <- function(result, original, maxresoln, scale=FALSE, yaxtype="s") #*********************************************************************# # plotResult # ----------- # function for the output of the following S functions: # dnpval, dbpval, region, dntrim # mnpval, ext, mntrim, localvar #*********************************************************************# { par.orig <- par(no.readonly = TRUE) # Save the original plot parameters par(mar=c(2.0, 2.0, 0.5, 0.5)) par(oma=c(1,0,0,0)) # Change 1 to a larger number to allow a larger # bottom margin par(mfrow = c(maxresoln+1, 1)) if ( !scale ) { plot.ts(original, bty="n",yaxt=yaxtype) for (j in 1:maxresoln) plot.ts(result[,j], bty="n",yaxt=yaxtype) } else { ymin <- min(result) ymax <- max(result) plot.ts(original, bty="n") for (j in 1:maxresoln) plot.ts(result[,j], ylim=c(ymin, ymax), bty="n",yaxt=yaxtype) } par(par.orig) par(mfrow=c(1,1)) } wpl <- function(dwtrans) #*********************************************************************# # wpl # --- # Plot dyadic wavelet transform (output of mw). #*********************************************************************# { maxresoln <- dwtrans$maxresoln plotwt(dwtrans$original, dwtrans$Wf, dwtrans$Sf,maxresoln) cat("") } epl <- function(dwext) #*********************************************************************# # epl # --- # Plot wavelet transform extrema (output of ext). #*********************************************************************# { maxresoln <- dwext$maxresoln plotResult(dwext$extrema, dwext$original, maxresoln) cat("") } Rwave/R/mw.R0000644000176200001440000000531011341712306012302 0ustar liggesusers######################################################################### # $log: mw.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, Andrea Wang # Princeton University # All right reserved ######################################################################## check.maxresoln <- function( maxresoln, np ) #*********************************************************************# # check.maxresoln # --------------- # stop when the size of 2^maxresoln is no less than signal size # # input # ----- # maxresoln: number of decomposition # np: signal size # # output # ------ #*********************************************************************# { if ( 2^(maxresoln+1) > np ) stop("maxresoln is too large for the given signal") } mw <- function(inputdata,maxresoln,filtername="Gaussian1",scale=FALSE, plot=TRUE) #*********************************************************************# # mw # -- # mw computes the wavelet decomposition by Mallat and Zhong's wavelet. # # input # ----- # inputdata: either a text file or an S object of input data. # maxresoln: number of decomposition # filename: name of filter (Gaussian1 stands for Mallat and Zhong's filter ; # Haar stands for the Haar basis). # scale: when set, the wavelet transform at each scale will be plotted # with the same scale. # plot : indicate if the wavelet transform at each scale will be plotted. # # output # ------ # original: original signal # Wf: wavelet transform of signal # Sf: signal at a lower resolution # maxresoln: number of decomposition # np: size of signal #*********************************************************************# { x <- adjust.length(inputdata) s <- x$signal np <- x$length Sf <- matrix(0, nrow=(maxresoln+1), ncol=np) Wf <- matrix(0, nrow=maxresoln, ncol=np) ## Convert a matrix maxresoln by np matrix into a vector Sf <- t(Sf) dim(Sf) <- c(length(Sf),1) Wf <- t(Wf) dim(Wf) <- c(length(Wf),1) y <- .C("Sf_compute", Sf=as.double(Sf), as.double(s), as.integer(maxresoln), as.integer(np), as.character(filtername), PACKAGE="Rwave") z <- .C("Wf_compute", Wf=as.double(Wf), as.double(y$Sf), as.integer(maxresoln), as.integer(np), as.character(filtername), PACKAGE="Rwave") ## Convert the vectors into the original matrix Sf <- t(y$Sf) Sf <- Sf[(maxresoln*np+1):((maxresoln+1)*np)] Wf <- t(z$Wf) dim(Wf) <- c(np, maxresoln) if(plot) plotwt(s, Wf, Sf, maxresoln, scale) list( original=s, Wf=Wf, Sf=Sf, maxresoln=maxresoln, np=np ) } Rwave/R/00util.R0000644000176200001440000001417211341712503013001 0ustar liggesusers######################################################################### # $Log: Util.S,v $ # # (c) Copyright 1997 # by # Author: Rene Carmona,Bruno Torresani,Wen-Liang Hwang,Andra Wang # Princeton University # All right reserved ######################################################################### smoothwt <- function(modulus, subrate, flag = FALSE) ######################################################################### # smoothwt: # -------- # smooth the wavelet (or Gabor) transform in the b direction # # input: # ------ # modulus: modulus of the wavelet (or Gabor) transform # subrate: size of the smoothing window # flag: if set to TRUE, subsamples the smoothed transform by # subrate. # # output: # ------- # smoothed transform (2D array) # ######################################################################### { sigsize <- dim(modulus)[1] nscale <- dim(modulus)[2] if(flag) { smodulus <- matrix(0,sigsize,nscale) dim(smodulus) <- c(sigsize * nscale, 1) } else { modsize <- as.integer(sigsize/subrate) + 1 smodulus <- matrix(0,modsize,nscale) dim(smodulus) <- c(modsize * nscale, 1) } dim(modulus) <- c(sigsize * nscale, 1) z <- .C("Ssmoothwt", sm = as.double(smodulus), as.double(modulus), as.integer(sigsize), as.integer(nscale), as.integer(subrate), as.integer(flag), PACKAGE="Rwave") if(flag) dim(z$sm) <- c(sigsize, nscale) else dim(z$sm) <- c(modsize, nscale) z$sm } smoothts <- function(ts, windowsize) ######################################################################### # smooth a time series by averaging window # # Arguments: # time series # window size ######################################################################### { sigsize <- length(ts) sts <- numeric(sigsize) nscale <- 1 stssize <- sigsize dim(sts) <- c(sigsize, 1) dim(ts) <- c(sigsize, 1) subrate <- windowsize # subrate <- 1 z <- .C("Smodulus_smoothing", as.double(ts), sts = as.double(sts), as.integer(sigsize), stssize = as.integer(stssize), as.integer(nscale), as.integer(subrate), PACKAGE="Rwave") sts <- z$sts sts } adjust.length <- function(inputdata) ######################################################################### # adjust.length adds zeros to the end of the data if necessary so that # its length is a power of 2. It returns the data with zeros added if # nessary and the length of the adjusted data. # # Arguments: # is either a text file or an S object containing # data. ######################################################################### { if (is.character(inputdata)) s <- scan(inputdata) else s <- inputdata np <- length(s) pow <- 1 while ( 2*pow < np ) pow <- 2*pow new.np <- 2*pow if ( np == new.np ) list( signal=s, length=np ) else { new.s <- 1:new.np new.s[1:new.np] <- 0 new.s[1:np] <- s list( signal=new.s, length=new.np ) } } ######################################################################### # npl: # --- # plots with n rows. # # input: # ------ # nrow: number of rows # ######################################################################### npl <- function(nbrow) { par(mfrow = c(nbrow, 1)) cat("") } ######################################################################### # SpecGen: # -------- # Estimate power spectrum # # input: # ------ # input: input signal. # spans: length of Daniell's smoother. # taper: relative size of tapering window (cosine taper). # ######################################################################### SpecGen <- function(input, spans = 9, taper = 0.2) { tmp <- spec.pgram(input,spans,taper) tmp1 <- tmp$spec tmp <- 10^(tmp1/10) spec <- tmp spec } ######################################################################### # SampleGen: # ---------- # generate a real sample with prescribed spectrum # # input: # ------ # nspec: spectral density # ######################################################################### SampleGen <- function(spec) { sqspec <- sqrt(spec) d <- length(sqspec) size <- d tmp <- rnorm(2 * size) real <- numeric(size) imag <- numeric(size) real <- tmp[1:size] a <- size+1 b <- 2 * size imag <- tmp[a:b] real1 <- real * sqspec[1:size] imag1 <- imag * sqspec[1:size] real2 <- numeric(2 * size) imag2 <- numeric(2 * size) real2[1:size] <- real1 imag2[1:size] <- imag1 for(i in 2:size) { real2[b-i+2] <- real1[i] imag2[b-i+2] <- -imag1[i] } imag2[1] <- 0 tmp1 <- fft(real2 + 1i*imag2, inverse=TRUE) sample <- Re(tmp1)/sqrt((2*size)) sample } hurst.est <- function(wspec, range, nvoice, plot=TRUE) ######################################################################### # hurst.est: # ---------- # estimate Hurst exponent from (part of) wavelet spectrum # # input: # ------ # wspec: wavelet spectrum. # nvoice: number of voices. # plot: if set to TRUE, displays regression line on current plot. # # output: # ------- # intercept and slope of regression line. Slope is Hurst exponent. # ######################################################################### { loctmp <- lsfit(range,log(wspec[range],base=2^(2/nvoice))) if(plot) abline(loctmp) loctmp$coef } wspec.pl <- function(wspec, nvoice) ######################################################################### # wspec.pl # ---------- # Displays normalized log of wavelet spectrum # # input: # ------ # wspec: wavelet spectrum. # nvoice: number of voices. # ######################################################################### { plot.ts(log(wspec, base=2^(2/nvoice))) title("log(wavelet spectrum)", xlab="log(scale)", ylab="V(a)") cat(" ") } Rwave/R/radar.R0000644000176200001440000001104511217041512012746 0ustar liggesusers############################################################ # Functions processing radar images and their example. ############################################################ ###################################### # processing Radar images from V. Chen ###################################### ## b727 <- matrix(scan("b727s.dat"),ncol=512,byrow=TRUE) ## b727 <- matrix(scan("b727r.dat"),ncol=256,byrow=TRUE) ## ncol <- dim(b727)[2]/2 ## b727r<- b727[,-1+2*(1:ncol)] ## b727i<- b727[,2*(1:ncol)] ## B727 <- t(Conj(b727r + i*b727i)) ## nrow <- dim(B727)[1] ## ncol <- dim(B727)[2] ## shift fft 1D data ## ----------------- fftshift <- function(x) { lng <- length(x) y <- numeric(lng) y[1:(lng/2)] <- x[(lng/2+1):(lng)] y[(lng/2+1):lng] <- x[1:(lng/2)] y } ## The following tow S-routine concludes our Radar experiments ## ------------------------------------------------------------- ## b727 <- matrix(scan("b727s.dat"),ncol=512,byrow=TRUE) ## b727 <- matrix(scan("b727r.dat"),ncol=256,byrow=TRUE) ## Generating the original image ## ----------------------------- ## e.g. B727 <- showRadar(b727) showRadar<- function(x, plot=TRUE) { ncol <- dim(x)[2]/2 xr<- x[,-1+2*(1:ncol)] xi<- x[,2*(1:ncol)] y <- t(Conj(xr + 1i*xi)) oy <- t(apply(apply(y,2,fftshift),1,fftshift)) oy <- apply(oy,2,fft) oy <- t(apply(apply(oy,2,fftshift),1,fftshift)) if(plot) image(Mod(t(oy))) oy } ## Enhancing Radar Image by Gabor Transform (V.Chen) ## ------------------------------------------------ ## gtime <- 128 ## scale <- 50 ## e.g. B727 <- cgtRadar(b727,gtime,scale) ## e.g. ## b727 <- matrix(scan("b727s.dat"),ncol=512,byrow=TRUE) ## b727 <- matrix(scan("b727r.dat"),ncol=256,byrow=TRUE) ## ncol <- dim(b727)[2]/2 ## b727r<- b727[,-1+2*(1:ncol)] ## b727i<- b727[,2*(1:ncol)] ## b727 <- t(Conj(complex(real=b727r, imag=b727i))) ## B727 <- cgtRadar(b727,gtime,scale,flag=FALSE) ## image(t(apply(Mod(B727$cgtout[,2,]),1,fftshift))) cgtRadar <- function(x,gtime,scale,flag=TRUE,plot=TRUE) { y <- x if(flag) { ncol <- dim(x)[2]/2 xr<- x[,-1+2*(1:ncol)] xi<- x[,2*(1:ncol)] y <- t(Conj(xr + 1i*xi)) } nrow <- dim(y)[1] ncol <- dim(y)[2] cgty <- array(0+0i,c(ncol,nrow,gtime)) cgtyy <- array(0+0i,c(ncol,nrow,gtime)) for(k in 1:ncol) cgty[k,,] <- cgt(Re(y[,k]),gtime,2/gtime,scale,plot=FALSE) + 1i*cgt(Im(y[,k]),gtime,2/gtime,scale,plot=FALSE) for(k in 1:nrow) cgtyy[,k,] <- t(apply(cgty[,k,],1,fftshift)) oy <- t(apply(apply(Mod(cgty),c(1,3),mean),1,fftshift)) if(plot) image(oy) list(output=oy,cgtout=cgtyy) } ## Generate X, Y, Z for the command : cloud cloudXYZ <- function(dim1, dim2,dim3) { II <- rep(1:dim1,dim2*dim3) dim(II) <- c(dim1,dim2,dim3) KK <- rep(1:dim3,dim2) dim(KK) <- c(dim3,dim2) KK <- t(KK) KK <- rep(KK,dim1) dim(KK) <- c(dim2 * dim3, dim1) KK <- t(KK) dim(KK) <- c(dim1, dim2, dim3) JJ <- rep(1:dim2,dim1) dim(JJ) <- c(dim2,dim1) JJ <- t(JJ) JJ <- rep(JJ,dim3) dim(JJ) <- c(dim1,dim2,dim3) list(II=II, JJ=JJ, KK=KK) } ## Commands show points : ## cgtout <- B727$cgtout ## tt <- cloudXYZ(dim(cgtout)[1], dim(cgtout)[2], dim(cgtout)[3]) ## range(abs(cgtout)) ## SS <- (abs(cgtout) > 4.0) ## XX <- tt$II[SS] ## YY <- tt$JJ[SS] ## ZZ <- tt$KK[SS] ## XX[length(XX)+1] <- 0 ## XX[length(XX)+1] <- dim1 ## YY[length(YY)+1] <- 0 ## YY[length(YY)+1] <- dim2 ## ZZ[length(ZZ)+1] <- 0 ## ZZ[length(ZZ)+1] <- dim3 ## cloud(ZZ~XX*YY) ## showpoints <- function(cgtout,low,high) { ## X <- 1:crossrange ## XX <- X %*% t(rep(1,crossrange)) ## YY <- t(XX) ## freq <- dim(cgtout)[2] ## ZZ <- matrix(0,crossrange,crossrange) ## modmax <- max(Mod(cgtout)) ## for(j in 1:crossrange) ## for(k in 1:crossrange) ## ZZ[j,k] <- maxpos(Mod(cgtout[j,,k]),low*modmax,high*modmax) ## cloud(ZZ~XX*YY) ##} ## maxpos <- function(x,low,high) { ## pos <- 1 ## lng <- length(x) ## maxval <- max(x) ## if((maxval >= low) & (maxval <= high)) { ## for(j in 1:lng) { ## if(x[j] >= maxval) { ## pos <- j ## } ## } ## } ## pos ## } ## showpoints <- function(cgtout,low,high) { ## crossrange <- dim(cgtout)[1] ## gabortime <- dim(cgtout)[3] ## freq <- dim(cgtout)[2] ## modmax <- max(Mod(cgtout)) ## tt <-persp(matrix(1,crossrange,gabortime),zlim=1:freq) ## TT <- (Mod(cgtout) > low * modmax) * (Mod(cgtout) <= high * modmax) ## for(k in 1:gabortime) { ## for(j in 1:freq) { ## for(i in 1:crossrange) { ## if(TT[i,j,k]==TRUE) ## points(perspp(i,k,j,tt)) ## } ## } ## } ## tt ## } Rwave/R/extrema.R0000644000176200001440000000325611341717366013346 0ustar liggesusers######################################################################### # $log: extrema.S,v $ ######################################################################### # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen L. Hwang, Andrea Wang # Princeton University # All right reserved ######################################################################## ext <- function(wt, scale=FALSE, plot=TRUE) #**************************************************************** # ext # --- # compute the extrema of the dyadic wavelet transform. # # input # ----- # wt: wavelet transform # scale: a flag indicating if the extrema at each # resolution will be plotted at the same sacle. # # output # ------ # original: original signal # extrema: extrema representation # Sf: coarse resolution of signal # maxresoln: number of decomposition # np: size of signal #**************************************************************** { s <- wt$original maxresoln <- wt$maxresoln np <- wt$np extrema <- matrix(0, nrow=maxresoln, ncol=np) extrema <- t(extrema) dim(extrema) <- c(length(extrema), 1) t(wt$Wf) # Note: transposed wt is not assigned to wt dim(wt$Wf) <- c(length(wt$Wf), 1) z <- .C("modulus_maxima", a=as.double(extrema), as.double(wt$Wf), as.integer(maxresoln), as.integer(np), PACKAGE="Rwave") extrema <- t(z$a) dim(extrema) <- c(np, maxresoln) cat("number of extrema =", sum(extrema!=0), "\n") if(plot) plotResult(extrema, s, maxresoln, scale) list(original=s,extrema=extrema,Sf=wt$Sf,maxresoln=maxresoln,np=np) } Rwave/R/svd.R0000644000176200001440000000213511217041512012451 0ustar liggesusers #**************************************************************# # (c) Copyright 1997 # # by # # Author: Rene Carmona, Bruno Torresani, Wen L. Hwang # # Princeton University # # All right reserved # #**************************************************************# ## compute the svd (single value decomposition) ## The Input/Output of the command is the same as the commands svd in Splus SVD <- function(a) { m <- dim(a)[1] n <- dim(a)[2] ## diagonal elements w <- numeric(n) dim(w) <- c(n,1) v <- matrix(0,n,n) v <- c(v) dim(v) <- c(length(v),1) a <- c(a) dim(a) <- c(length(a),1) z <- .C("Ssvdecomp", u= as.double(a), as.integer(m), as.integer(n), w = as.double(w), v = as.double(v), PACKAGE="Rwave") u <- z$u dim(u) <- c(n,n) w <- z$w dim(w) <- c(n,1) v <- z$v dim(v) <- c(n,n) list(d=w, u=u, v=v) } Rwave/R/gRidge_Recons.R0000644000176200001440000002426111341712412014375 0ustar liggesusers######################################################################### # $Log: gRidge_Recons.S,v $ # Revision 1.2 1995/04/05 18:56:55 bruno # *** empty log message *** # # Revision 1.1 1995/04/02 01:04:16 bruno # Initial revision # # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### gregrec <- function(siginput, gtinput, phi, nbnodes, nvoice, freqstep, scale, epsilon = 0, fast = FALSE, plot = FALSE, para = 0, hflag = FALSE, real = FALSE, check = FALSE) ######################################################################### # gregrec: # ------- # Reconstruction of a real valued signal from a (continuous) # Gabor ridge (uses a regular sampling of the ridge) # # input: # ------- # siginput: input signal # gtinput: Continuous gabor transform (output of cgt) # phi: (unsampled) ridge # nbnodes: number of nodes used for the reconstruction. # nvoice: number of different scales per octave # freqstep: sampling rate for the frequency axis # epsilon: coeff of the Q2 term in reconstruction kernel # fast: if set to TRUE, the kernel is computed using Riemann # sums instead of Romberg's quadrature # plot: if set to TRUE, displays original and reconstructed signals # para: scale parameter for extrapolating the ridges. # hflag:if set to TRUE, uses $Q_1$ as first term in the kernel. # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # gaborets: array containing the wavelets on sampled ridge. # solskel: Gabor transform of sol, restricted to the ridge # inputskel: Gabor transform of signal, restricted to the ridge # Q2: second part of the reconstruction kernel ######################################################################### { tmp <- RidgeSampling(phi,nbnodes) node <- tmp$node phinode <- tmp$phinode phi.x.min <- scale phi.x.max <- scale x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node - x.min + 1 x.inc <- 1 np <- as.integer((x.max-x.min)/x.inc)+1 cat(" (np:",np,")") if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- gkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) else Q2 <- fastgkernel(node,phinode,freqstep,scale,x.min = x.min, x.max = x.max) } cat(" kernel;") # Generating the Q1 term in reconstruction kernel if (hflag == TRUE) one <- gsampleOne(node,scale,np) else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- gridrec(gtinput,node,phinode,nvoice, freqstep,scale,Qinv,epsilon,np, real = real, check = check) if(plot == TRUE){ par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } npl(2) lam <- tmp2$lam plot.ts(lam,xlab="Number",ylab="Lambda Value") title("Lambda Profile") N <- length(lam)/2 mlam <- numeric(N) for(j in 1:N) mlam[j] <- Mod(lam[j] + 1i*lam[N + j]) plot.ts(sort(mlam)) list(sol=tmp2$sol,A=tmp2$A,lam=tmp2$lam,dualwave=tmp2$dualwave, gaborets=tmp2$gaborets, solskel=tmp2$solskel, inputskel = tmp2$inputskel, Q2 = Q2) } gridrec <- function(gtinput, node, phinode, nvoice, freqstep, scale, Qinv, epsilon, np, real = FALSE, check = FALSE) ######################################################################### # gridrec: # -------- # Reconstruction of a real valued signal from a gabor ridge. # # input: # ------ # gtinput: Continuous gabor transform (output of cgt) # node: time coordinates of the ridge samples. # phinode: frequency coordinates of the ridge samples. # nvoice: number of different frequencies. # freqstep: sampling rate for the frequency axis. # scale: scale of the window. # Qinv: inverse of the reconstruction kernel # epsilon: coefficient of the Q2 term in the reconstruction kernel # np: number of samples of the reconstructed signal # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # check: if set to TRUE, computes the Gabor transform of the # reconstructed signal. # # output: # ------- # sol: reconstruction from a ridge # A: matrix. # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual gaborlets. # gaborets: array of gaborlets located on the ridge samples # solskel: Gabor transform of sol, restricted to the ridge # inputskel: Gabor transform of signal, restricted to the ridge # ######################################################################### { N <- length(node) omegaridge <- phinode bridge <- node if(real == TRUE) gaborets <- gwave2(bridge,omegaridge,nvoice,freqstep,scale,np,N) else gaborets <- gwave(bridge,omegaridge,nvoice,freqstep,scale,np,N) cat("gaborets;") if(epsilon == 0){ if(real == TRUE) sk <- zeroskeleton2(gtinput,Qinv,gaborets,bridge,omegaridge,N) else sk <- zeroskeleton(gtinput,Qinv,gaborets,bridge,omegaridge,N) } else sk <- skeleton(gtinput,Qinv,gaborets,bridge,omegaridge,N) cat("skeleton.\n") solskel <- 0 #not needed if check not done inputskel <- 0 #not needed if check not done if(check == TRUE){ solskel <- complex(N) inputskel <- complex(N) gtsol <- cgt(sk$sol,nvoice,freqstep,plot=FALSE) for(j in 1:N) solskel[j] <- gtsol[bridge[j],omegaridge[j]] for (j in 1:N) inputskel[j] <- gtinput[bridge[j],omegaridge[j]] } list(sol=sk$sol,A=sk$A,lam=sk$lam,dualwave=sk$dualwave,gaborets=gaborets, solskel=solskel,inputskel = inputskel) } gwave <- function(bridge,omegaridge,nvoice,freqstep,scale,np,N) ######################################################################### # gwave: # ------ # Generation of the gaborets located on the ridge # # input: # ------ # bridge: time coordinates of the ridge samples # omegaridge: frequency coordinates of the ridge samples # nvoice: number of different scales per octave # freqstep: sampling rate for the frequency axis # scale: scale of the window # np: size of the reconstruction kernel # N: number of complex constraints # # output: # ------- # gaborets: array of morlet wavelets located on the ridge samples # ######################################################################### { gaborets <- matrix(0,np,2*N) omegaridge <- omegaridge * freqstep tmp <- vecgabor(np,N,bridge,omegaridge,scale) dim(tmp) <- c(np,N) gaborets[,1:N] <- Re(tmp[,1:N]) gaborets[,(N+1):(2*N)] <- Im(tmp[,1:N]) # Alternative way of generating gaborets # for(k in 1:N) { # omega <- omegaridge[k]*freqstep; # tmp <- gabor(np,bridge[k],omega,scale); # gaborets[,k] <- Re(tmp); # gaborets[,k+N] <- Im(tmp); # } # Still another way of generating gaborets # # dirac <- 1:np # dirac[] <- 0 # for(k in 1:N) { # dirac[bridge[k]] <- 1.0; # omega <- omegaridge[k]*freqstep; # gtdirac <- vgt(dirac,omega,scale,open=FALSE,plot=FALSE); # gaborets[,k] <- Re(gtdirac); # gaborets[,k+N] <- Im(gtdirac); # dirac[] <- 0 # } gaborets } gwave2 <- function(bridge,omegaridge,nvoice,freqstep,scale,np,N) ######################################################################### # gwave2: # ------- # Generation of the real parts of gaborets located on the ridge # # input: # ------ # bridge: time coordinates of the ridge samples # omegaridge: frequency coordinates of the ridge samples # nvoice: number of different scales per octave # freqstep: sampling rate for the frequency axis # scale: scale of the window # np: size of the reconstruction kernel # N: number of complex constraints # # output: # ------- # gaborets: array of morlet wavelets located on the ridge samples # ######################################################################### { omegaridge <- omegaridge * freqstep gaborets <- Re(vecgabor(np,N,bridge,omegaridge,scale)) dim(gaborets) <- c(np,N) # for(k in 1:N) { # omega <- omegaridge[k]*freqstep; # tmp <- gabor(np,bridge[k],omega,scale); # gaborets[,k] <- Re(tmp); # } gaborets } gsampleOne <- function(node,scale,np) ######################################################################### # gsampleOne: # ----------- # # Generate a ``sampled identity" # # input: # ------ # node: location of the reconstruction gabor functions # scale: scale of the gabor functions # np: size of the reconstructed signal # # # output: # ------- # dia: diagonal of the ``sampled'' Q1 term (1D vector) # ######################################################################### { dia <- numeric(np) N <- length(node) normalization <- sqrt(pi) * scale for(j in 1:np) { tmp1 <- (j-node)/scale tmp1 <- exp(-(tmp1 * tmp1)) dia[j] <- sum(tmp1) #/normalization } dia # for(j in 1:np) { # tmp <- 0 # for(k in 1:N) { # b <- node[k] # tmp1 <- (j-b)/scale # tmp1 <- exp(-(tmp1 * tmp1)) # tmp <- tmp + tmp1 # } # dia[j] <- tmp #/normalization # } dia } Rwave/R/Ridge_Recons.R0000644000176200001440000005242711217041512014231 0ustar liggesusers######################################################################### # $Log: Ridge_Recons.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### regrec <- function(siginput, cwtinput, phi, compr, noct, nvoice, epsilon = 0, w0 = 2*pi, fast = FALSE, plot = FALSE, para = 0, hflag = FALSE, check = FALSE, minnbnodes = 2, real = FALSE) ######################################################################### # regrec: # ------- # Reconstruction of a real valued signal from a (continuous) ridge # (uses a regular sampling of the ridge) # # input: # ------- # siginput: input signal # cwtinput: Continuous wavelet transform (output of cwt) # phi: (unsampled) ridge # compr: subsampling rate for the wavelet coefficients (at scale 1) # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # epsilon: coeff of the Q2 term in reconstruction kernel # w0: central frequency of Morlet wavelet # fast: if set to TRUE, the kernel is computed using Riemann # sums instead of Romberg's quadrature # plot: if set to TRUE, displays original and reconstructed signals # para: constant for extending the support of reconstructed signal # outside the ridge. # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # minnbnodes: minimum number of nodes for the reconstruction # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # morvelets: array containing the wavelets on sampled ridge. # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # Q2: second part of the reconstruction kernel # nbnodes: number of nodes used for the reconstruction. # ########################################################################## { ## Generate Sampled ridge tmp <- wRidgeSampling(phi,compr,nvoice) node <- tmp$node phinode <- tmp$phinode nbnodes <- tmp$nbnodes phinode <- as.integer(phinode) if(nbnodes < minnbnodes){ cat(" Chain too small\n") NULL } else { phi.x.min <- 2 * 2^(phinode[1]/nvoice) phi.x.max <- 2 * 2^(phinode[length(node)]/nvoice) x.min <- node[1] x.max <- node[length(node)] x.max <- x.max + round(para * phi.x.max) x.min <- x.min - round(para * phi.x.min) node <- node + 1 - x.min x.inc <- 1 np <- as.integer((x.max - x.min)/x.inc) +1 cat("(size:",np,",",nbnodes,"nodes):") fast <- FALSE ## Generating the Q2 term in reconstruction kernel if(epsilon == 0) Q2 <- 0 else { if (fast == FALSE) Q2 <- rkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max, w0 = w0) else Q2 <- fastkernel(node, phinode, nvoice, x.min = x.min, x.max = x.max, w0 = w0) } ## Generating the Q1 term in reconstruction kernel if (hflag == TRUE){ one <- numeric(np) one[] <- 1 } else{ one <- numeric(np) one[] <- 1 } if (epsilon !=0 ){ Q <- epsilon * Q2 for(j in 1:np) Q[j,j] <- Q[j,j] + one[j] Qinv <- solve(Q) } else{ Qinv <- 1/one } tmp2 <- ridrec(cwtinput, node, phinode, noct, nvoice, Qinv, epsilon, np, w0=w0, check=check, real=real) if(plot == TRUE) { par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } npl(2) lam <- tmp2$lam if(plot == TRUE) { plot.ts(lam,xlab="Number",ylab="Lambda Value") title("Lambda Profile") } N <- length(lam)/2 mlam <- numeric(N) for(j in 1:N) mlam[j] <- Mod(lam[j] + lam[N + j]*(1i)) if(plot == TRUE) plot.ts(sort(mlam)) list(sol = tmp2$sol, A = tmp2$A, lam = tmp2$lam, dualwave = tmp2$dualwave, morvelets = tmp2$morvelets, solskel = tmp2$solskel, inputskel = tmp2$inputskel, Q2 = Q2, nbnodes = nbnodes) } } ridrec <- function(cwtinput, node, phinode, noct, nvoice, Qinv, epsilon, np, w0 = 2*pi, check = FALSE, real = FALSE) ######################################################################### # ridrec: # ------ # Reconstruction of a real valued signal from a ridge, given # the kernel of the bilinear form. # # input: # ------ # cwtinput: Continuous wavelet transform (output of cwt) # node: time coordinates of the ridge samples # phinode: scale coordinates of the ridge samples # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # Qinv: inverse of the reconstruction kernel # epsilon: coefficient of the Q2 term in the reconstruction kernel # np: number of samples of the reconstructed signal # w0: central frequency of Morlet wavelet # check: if set to TRUE, computes the wavelet transform of the # reconstructed signal # real: if set to TRUE, only uses constraints on the real part # of the transform for the reconstruction. # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # morvelets: array of morlet wavelets located on the ridge samples # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # ######################################################################### { N <- length(node) aridge <- phinode bridge <- node if (real == TRUE) morvelets <- morwave2(bridge,aridge,nvoice,np,N) else morvelets <- morwave(bridge,aridge,nvoice,np,N) cat("morvelets; ") if( epsilon == 0){ if (real == TRUE) sk <- zeroskeleton2(cwtinput,Qinv,morvelets,bridge,aridge,N) else sk <- zeroskeleton(cwtinput,Qinv,morvelets,bridge,aridge,N) } else { if(real == TRUE) sk <- skeleton2(cwtinput,Qinv,morvelets,bridge,aridge,N) else sk <- skeleton(cwtinput,Qinv,morvelets,bridge,aridge,N) } cat("skeleton.\n") solskel <- 0 #not needed if check not done inputskel <- 0 #not needed if check not done if(check == TRUE){ wtsol <- cwt(Re(sk$sol),noct,nvoice) solskel <- complex(N) for(j in 1:N) solskel[j] <- wtsol[bridge[j],aridge[j]] inputskel <- complex(N) for (j in 1:N) inputskel[j] <- cwtinput[bridge[j],aridge[j]] } list(sol=sk$sol,A=sk$A,lam=sk$lam,dualwave=sk$dualwave,morvelets=morvelets, solskel=solskel,inputskel = inputskel) } morwave <- function(bridge, aridge, nvoice, np, N, w0 = 2*pi) ######################################################################### # morwave: # ------- # Generation of the wavelets located on the ridge. # # input: # ------ # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # nvoice: number of different scales per octave # np: size of the reconstruction kernel # N: number of complex constraints # w0: central frequency of Morlet wavelet # # output: # ------- # morvelets: array of morlet wavelets located on the ridge samples # ######################################################################### { morvelets <- matrix(0,np,2*N) aridge <- 2 * 2^((aridge - 1)/nvoice) tmp <- vecmorlet(np,N,bridge,aridge,w0 = w0) dim(tmp) <- c(np,N) morvelets[,1:N] <- Re(tmp[,1:N]) morvelets[,(N+1):(2*N)] <- Im(tmp[,1:N]) # Another way of generating morvelets # dirac <- 1:np # dirac[] <- 0 # for(k in 1:N) { # dirac[bridge[k]] <- 1.0; # scale <- 2 * 2^((aridge[k]-1)/nvoice); # cwtdirac <- vwt(dirac,scale,open=FALSE); # morvelets[,k] <- Re(cwtdirac); # morvelets[,k+N] <- Im(cwtdirac); # dirac[] <- 0 # } # Still another way of generating morvelets # for(k in 1:N) { # scale <- 2 * 2^((aridge[k]-1)/nvoice); # tmp <- morlet(np,bridge[k],scale)/sqrt(2*pi); # morvelets[,k] <- Re(tmp); # morvelets[,k+N] <- Im(tmp); # } morvelets } morwave2 <- function(bridge, aridge, nvoice, np, N, w0 = 2*pi) ######################################################################### # morwave2: # --------- # Generation of the real parts of morlet wavelets # located on the ridge. # # input: # ------- # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # nvoice: number of different scales per octave # np: size of the reconstruction kernel # N: number of real constraints # w0: central frequency of Morlet wavelet # # output: # ------- # morvelets: array of morlet wavelets located on the ridge samples # ######################################################################### { morvelets <- matrix(0,np,N) aridge <- 2 * 2^((aridge - 1)/nvoice) morvelets <- Re(vecmorlet(np,N,bridge,aridge,w0 = w0)) dim(morvelets)<- c(np,N) # changed by Wen 5/22 # # aridge <- 2 * 2^((aridge - 1)/nvoice) # morvelets <- Re(vecmorlet(np,N,bridge,aridge,w0 = w0)) # dim(morvelets) <- c(np,N) morvelets } skeleton <- function(cwtinput, Qinv, morvelets, bridge, aridge, N) ######################################################################### # skeleton: # -------- # Computation of the reconstructed signal from the ridge # # input: # ------- # cwtinput: Continuous wavelet transform (output of cwt) # Qinv: inverse of the reconstruction kernel (2D array) # morvelets: array of morlet wavelets located on the ridge samples # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # N: number of complex constraints # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # ########################################################################## { dualwave <- Qinv %*% morvelets A <- t(morvelets) %*% dualwave rskel <- numeric(2*N) for(j in 1:N) { rskel[j] <- Re(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]); rskel[N+j] <- -Im(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]) } B <- SVD(A) d <- B$d Invd <- numeric(length(d)) for(j in 1:(2*N)) if(d[j] < 1.0e-6) Invd[j] <- 0 else Invd[j] <- 1/d[j] lam <- B$v %*% diag(Invd) %*% t(B$u) %*% rskel sol <- dualwave%*%lam list(lam=lam,sol=sol,dualwave=dualwave,A=A) } skeleton2 <- function(cwtinput, Qinv, morvelets, bridge, aridge, N) ######################################################################### # skeleton2: # --------- # Computation of the reconstructed signal from the ridge, in the # case of real constraints. # # input: # ------- # cwtinput: Continuous wavelet transform (output of cwt) # Qinv: inverse of the reconstruction kernel (2D array) # morvelets: array of morlet wavelets located on the ridge samples # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # N: number of real constraints # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # ########################################################################## { dualwave <- Qinv %*% morvelets A <- t(morvelets) %*% dualwave rskel <- numeric(N) for(j in 1:N) { rskel[j] <- Re(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]); } B <- SVD(A) d <- B$d Invd <- numeric(length(d)) for(j in 1:N) if(d[j] < 1.0e-6) Invd[j] <- 0 else Invd[j] <- 1/d[j] lam <- B$v %*% diag(Invd) %*% t(B$u) %*% rskel sol <- dualwave%*%lam list(lam=lam,sol=sol,dualwave=dualwave,A=A) } zeroskeleton <- function(cwtinput, Qinv, morvelets, bridge, aridge, N) ######################################################################### # zeroskeleton: # ------------- # Computation of the reconstructed signal from the ridge when # the epsilon parameter is set to 0. # # input: # ------- # cwtinput: Continuous wavelet transform (output of cwt) # Qinv: 1D array (warning: different from skeleton) containing # the diagonal of the inverse of reconstruction kernel. # morvelets: array of morlet wavelets located on the ridge samples # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # N: number of complex constraints # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # ########################################################################## { tmp1 <- dim(morvelets)[1] tmp2 <- dim(morvelets)[2] cat(dim(morvelets)) dualwave <- matrix(0,tmp1,tmp2) for (j in 1:tmp1) dualwave[j,] <- morvelets[j,]*Qinv[j] A <- t(morvelets) %*% dualwave rskel <- numeric(2*N) for(j in 1:N) { rskel[j] <- Re(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]); rskel[N+j] <- -Im(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]) } B <- SVD(A) d <- B$d Invd <- numeric(length(d)) for(j in 1:(2*N)) if(d[j] < 1.0e-6) Invd[j] <- 0 else Invd[j] <- 1/d[j] lam <- B$v %*% diag(Invd) %*% t(B$u) %*% rskel sol <- dualwave%*%lam list(lam=lam,sol=sol,dualwave=dualwave,A=A) } zeroskeleton2 <- function(cwtinput, Qinv, morvelets, bridge, aridge, N) ######################################################################### # zeroskeleton2: # ------------- # Computation of the reconstructed signal from the ridge when # the epsilon parameter is set to 0 and the constraints are real. # # input: # ------- # cwtinput: Continuous wavelet transform (output of cwt) # Qinv: 1D array (warning: different than in skeleton) containing # the diagonal of the inverse of reconstruction kernel. # morvelets: array of morlet wavelets located on the ridge samples # bridge: time coordinates of the ridge samples # aridge: scale coordinates of the ridge samples # N: number of real constraints # # output: # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # ########################################################################## { tmp1 <- dim(morvelets)[1] tmp2 <- dim(morvelets)[2] dualwave <- matrix(0,tmp1,tmp2) for (j in 1:tmp1) dualwave[j,] <- morvelets[j,]*Qinv[j] A <- t(morvelets) %*% dualwave rskel <- numeric(N) for(j in 1:N) rskel[j] <- Re(cwtinput[bridge[j]-bridge[1]+1,aridge[j]]); B <- SVD(A) d <- B$d Invd <- numeric(length(d)) for(j in 1:N) if(d[j] < 1.0e-6) Invd[j] <- 0 else Invd[j] <- 1/d[j] lam <- B$v %*% diag(Invd) %*% t(B$u) %*% rskel sol <- dualwave%*%lam list(lam=lam,sol=sol,dualwave=morvelets,A=A) } regrec2 <- function(siginput, cwtinput, phi, nbnodes, noct, nvoice, Q2, epsilon = 0.5, w0 = 2*pi , plot = FALSE) ######################################################################### # regrec2: # ------- # Reconstruction of a real valued signal from a (continuous) ridge # (uses a regular sampling of the ridge), from a precomputed kernel. # # input: # ------- # siginput: input signal # cwtinput: Continuous wavelet transform (output of cwt) # phi: (unsampled) ridge # nbnodes: number of samples on the ridge # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # Q2: second part of the reconstruction kernel # epsilon: coeff of the Q2 term in reconstruction kernel # w0: central frequency of Morlet wavelet # plot: if set to TRUE, displays original and reconstructed signals # # output: same as ridrec # ------- # sol: reconstruction from a ridge # A: matrix # lam: coefficients of dual wavelets in reconstructed signal. # dualwave: array containing the dual wavelets. # morvelets: array of morlet wavelets located on the ridge samples # solskel: wavelet transform of sol, restricted to the ridge # inputskel: wavelet transform of signal, restricted to the ridge # ######################################################################### { tmp <- RidgeSampling(phi,nbnodes) node <- tmp$node phinode <- tmp$phinode np <- dim(Q2)[1] one <- diag(np) Q <- one + epsilon * Re(Q2) if(epsilon == 0) Qinv <- one else Qinv <- solve(Q) tmp2 <- ridrec(cwtinput,node,phinode,noct,nvoice,Qinv,epsilon,np) if(plot == TRUE){ par(mfrow=c(2,1)) plot.ts(Re(siginput)) title("Original signal") plot.ts(Re(tmp2$sol)) title("Reconstructed signal") } tmp2 } RidgeSampling <- function(phi, nbnodes) ######################################################################### # RidgeSampling: # -------------- # Given a ridge phi (for the Gabor transform), returns a # (regularly) subsampled version of length nbnodes. # # Input: # ------ # phi: ridge # nbnodes: number of samples. # # Output: # ------- # node: time coordinates of the ridge samples # phinode: frequency coordinates of the ridge samples # ######################################################################### { node <- numeric(nbnodes) phinode <- numeric(nbnodes) N <- nbnodes LL <- length(phi) for (i in 1:(N+1)) node[i] <- as.integer(((LL-1)*i+nbnodes-LL+1)/nbnodes) for (i in 1:(N+1)) phinode[i] <- phi[node[i]] list(node = node,phinode = phinode) } wRidgeSampling <- function(phi, compr, nvoice) ######################################################################### # wRidgeSampling: # --------------- # Given a ridge phi, returns a subsampled version of length # nbnodes (wavelet case). # # Input: # ------ # phi: ridge # compr: subsampling rate for the wavelet coefficients (at scale 1) # when compr <= 0, uses all the points in a ridge # # Output: # ------- # node: time coordinates of the ridge samples # phinode: frequency coordinates of the ridge samples # nbnodes: number of samples. # ######################################################################### { LL <- length(phi) node <- numeric(LL) phinode <- numeric(LL) LN <- 1 j <- 1 node[1] <- 1 # We multiply a number on the phi. This number is obtained experimentally # If we have a ridge which is linear of scale, then the subsampling is # adapted with s, however, in the wavelet case, the ridge is linear # in log(scale), the subsampling rate is therefore adapted to k*s^l # l here is the constant 100/15, and k is compr aridge <- 2 * 2^((phi-1)/(nvoice * 100/15)) # while (node[j] < LL){ # j <- j + 1 # LN <- round(compr * aridge[node[j-1]]) # cat("LN=",LN) # node[j] <- node[j-1] + LN # cat("; node=",node[j],"\n") # phinode[j] <- phi[node[j]] # cat("; phinode=",phinode[j],"\n") # } nbnodes <- 0 while (node[j] < LL){ phinode[j] <- phi[node[j]] nbnodes <- nbnodes + 1 # To guarantee at least advance by one LN <- max(1,round(compr * aridge[node[j]])) j <- j + 1 node[j] <- node[j-1] + LN } tmpnode <- numeric(nbnodes) tmpphinode <- numeric(nbnodes) tmpnode <- node[1:nbnodes] tmpphinode <- phinode[1:nbnodes] list(node = tmpnode,phinode = tmpphinode, nbnodes = nbnodes) } sridrec <- function(tfinput, ridge) ######################################################################### # sridrec # ------- # Simple reconstruction of a real valued signal from a ridge, # by restriction of the wavelet transform. # # Input: # ------ # tfinput: Continuous time-frequency transform (output of cwt or cgt) # ridge: (unsampled) ridge # # Output: # ------- # rec: reconstructed signal # ######################################################################### { bsize <- dim(tfinput)[1] asize <- dim(tfinput)[2] rec <- numeric(bsize) rec[] <- 0 + 0i for(i in 1:bsize) { if(ridge[i] > 0) rec[i] <- rec[i] + 2 * tfinput[i,ridge[i]] } Re(rec) } Rwave/R/crc_rec.R0000644000176200001440000002451111341712403013261 0ustar liggesusers######################################################################### # $Log: Crc_Rec.S,v $ ######################################################################### # # (c) Copyright 1997 # by # Author: Rene Carmona, Bruno Torresani, Wen-Liang Hwang # Princeton University # All right reserved ######################################################################### ######################################################################### # # Functions to reconstruct a signal from the output of # the crazy climber algorithm. # ######################################################################### crcrec <- function(siginput, inputwt, beemap, noct, nvoice, compr, minnbnodes = 2, w0 = 2*pi, bstep = 5, ptile = 0.01, epsilon = 0, fast = FALSE, para = 5, real = FALSE, plot = 2) ######################################################################### # crcrec: # ------- # Reconstruction of a real valued signal from ridges found by # crazy climbers on a wavelet transform. # # input: # ------ # siginput: input signal # inputwt: continuous wavelet transform (output of cwt) # beemap: output of crazy climber algorithm # noct: number of octaves (powers of 2) # nvoice: number of different scales per octave # compr: subsampling rate for the ridge # bstep: used for the chaining # ptile: # epsilon: coeff of the Q2 part of reconstruction kernel # fast: if set to TRUE, computes the Q2 kernel by Riemann sums # if not, uses a Romberg adaptive step quadrature. # para: # plot: plot the original and reconstructed signal in display # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- cfamily(beemap,bstep,ptile=ptile) chain <- tmp$chain nbchain <- tmp$nbchain ordered <- tmp$ordered sigsize <- length(siginput) rec <- numeric(sigsize) plnb <- 0 if(plot != FALSE) { par(mfrow=c(2,1)) plot.ts(siginput, main="Original signal") image(tmp$ordered, main="Chained Ridges") } tmp <- matrix(0,nbchain,length(siginput)) totnbnodes <- 0 idx <- numeric(nbchain) p <- 0 for(j in 1:nbchain) { phi.x.min <- 2 * 2^(chain[j,3]/nvoice) if(chain[j,2] > (para*phi.x.min)) { cat("Chain number",j) phi.x.max <- 2 * 2^(chain[j,(2+chain[j,2])]/nvoice) x.min <- chain[j,1] x.max <- chain[j,1] + chain[j,2] - 1 x.min <- x.min - round(para * phi.x.min) x.max <- x.max + round(para * phi.x.max) tmp2 <- regrec(siginput[chain[j,1]:(chain[j,1]+chain[j,2]-1)], inputwt[chain[j,1]:(chain[j,1]+chain[j,2]-1),], chain[j,3:(chain[j,2]+2)], compr,noct,nvoice, epsilon, w0 = w0 ,fast = fast, para = para, minnbnodes = minnbnodes, real = real) if(is.list(tmp2)==TRUE) { totnbnodes <- totnbnodes + tmp2$nbnodes np <- length(tmp2$sol) start <- max(1,x.min) end <- min(sigsize,x.min+np-1) start1 <- max(1,2-x.min) end1 <- min(np, sigsize +1 - x.min) end <- end1 - start1 + start rec[start:end] <- rec[start:end] + tmp2$sol[start1:end1] tmp[j,start:end] <- Re(tmp2$sol[start1:end1]) } plnb <- plnb + 1 p <- p + 1 idx[p] <- j } } if(plot == 1) { par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput, main="Original signal") plot.ts(Re(rec), main="Reconstructed signal") } else { if(plot == 2) { par(mfrow=c(plnb+2,1)) par(mar=c(2,0,0,0)) par(cex=1.1) par(err=-1) plot.ts(siginput, main="Original signal") for (j in 1:p) plot.ts(tmp[idx[j],]) plot.ts(Re(rec), main="Reconstructed signal") } } cat("Total number of ridge samples used: ", totnbnodes, "\n") par(mfrow=c(1,1)) list(rec=rec, ordered = ordered, chain = chain, comp = tmp) } gcrcrec <- function(siginput, inputgt, beemap, nvoice, freqstep, scale, compr, bstep = 5, ptile = .01, epsilon = 0, fast = TRUE, para = 5, minnbnodes = 3, hflag = FALSE, real= FALSE, plot = 2) ######################################################################### # gcrcrec: # ------- # Reconstruction of a real valued signal from ridges found by # crazy climbers on the gabor transform. # # input: # ------ # siginput: input signal # inputgt: continuous gabor transform (output of cgt) # beemap: output of crazy climber algorithm # nvoice: number of different frequencies # freqstep: difference between two consecutive frequencies # scale: scale of the window # compr: subsampling rate for the ridge # bstep: used for the chaining # ptile: # epsilon: coeff of the Q2 part of reconstruction kernel # fast: if set to TRUE, computes the Q2 kernel by Riemann sums # if not, uses a Romberg adaptive step quadrature. # para: # minnbnodes: minimal number of nodes for a sampled ridge. # hflag: if set to FALSE, uses the identity as first term # in the reconstruction kernel. If not, uses Q1 instead. # plot: if set to 1, displays the signal, the components, and # signal and reconstruction one after another. If set to # 2, displays the signal, the components, and the # reconstruction on the same page. Else, no plot. # real: if set to true, uses only real constraints. # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- cfamily(beemap,bstep,ptile=ptile) chain <- tmp$chain nbchain <- tmp$nbchain ordered <- tmp$ordered sigsize <- length(siginput) rec <- numeric(sigsize) plnb <- 0 if(plot != FALSE) { par(mfrow=c(2,1)) plot.ts(siginput, main="Original signal") image(tmp$ordered, main="Chained Ridges") } totnbnodes <- 0 tmp <- matrix(0,nbchain,length(siginput)) for(j in 1:nbchain) { if(chain[j,2] > scale) { nbnodes <- round(chain[j,2]/compr) if(nbnodes < minnbnodes) nbnodes <- minnbnodes totnbnodes <- totnbnodes + nbnodes cat("Chain number",j) phi.x.min <- scale phi.x.max <- scale x.min <- chain[j,1] x.max <- chain[j,1] + chain[j,2] - 1 x.min <- x.min - round(para * phi.x.min) x.max <- x.max + round(para * phi.x.max) x.inc <- 1 np <- as.integer((x.max-x.min)/x.inc) + 1 tmp2 <- gregrec(siginput[chain[j,1]:(chain[j,1]+chain[j,2]-1)], inputgt[chain[j,1]:(chain[j,1]+chain[j,2]-1),], chain[j,3:(chain[j,2]+2)], nbnodes, nvoice, freqstep, scale, epsilon, fast, para = para, hflag = hflag, real = real) start <- max(1,x.min) end <- min(sigsize,x.min+np-1) start1 <- max(1,2-x.min) end1 <- min(np, sigsize +1 - x.min) end <- end1 - start1 + start rec[start:end] <- rec[start:end] + tmp2$sol[start1:end1] tmp[j,start:end] <- tmp2$sol[start1:end1] plnb <- plnb + 1 plot.ts(tmp[j,]) } } if(plot == 1) { par(mfrow=c(2,1)) par(cex=1.1) plot.ts(siginput, main="Original signal") plot.ts(rec, main="Reconstructed signal") } else if (plot == 2) { par(mfrow=c(plnb+2,1)) par(mar=c(2,4,4,4)) par(cex=1.1) par(err=-1) plot.ts(siginput, main="Original signal") for (j in 1:nbchain) plot.ts(tmp[j,]) plot.ts(rec, main="Reconstructed signal") } cat("Total number of ridge samples used: ", totnbnodes, "\n") par(mfrow=c(1,1)) list(rec = rec, ordered = ordered, chain = chain, comp = tmp) } scrcrec <- function(siginput, tfinput, beemap, bstep = 5, ptile = 0.01, plot = 2) ######################################################################### # scrcrec: # -------- # Simple reconstruction of a real valued signal from ridges found by # crazy climbers. # # input: # ------ # siginput: input signal # tfinput: continuous time-frequency transform (output of cwt or cgt) # beemap: output of crazy climber algorithm # bstep: used for the chaining # ptile: # plot: if set to 1, displays the signal, the components, and # signal and reconstruction one after another. If set to # 2, displays the signal, the components, and the # reconstruction on the same page. Else, no plot. # # output: # ------- # rec: reconstructed signal # ordered: image of the ridges (with different colors) # comp: 2D array containing the signals reconstructed from ridges # ######################################################################### { tmp <- cfamily(beemap,bstep, ptile=ptile) chain <- tmp$chain nbchain <- tmp$nbchain rec <- numeric(length(siginput)) if(plot != FALSE) { par(mfrow=c(2,1)) plot.ts(siginput, main="Original signal") image(tmp$ordered, main="Chained Ridges") } npl(1) tmp3 <- matrix(0,nbchain,length(siginput)) rdg <- numeric(dim(tfinput)[1]) for (j in 1:nbchain) { bnext <- chain[j,1] for(k in 1:chain[j,2]) { rdg[bnext] <- chain[j,2+k] bnext <- bnext + 1 } tmp3[j,] <- sridrec(tfinput,rdg) rec <- rec + tmp3[j,] rdg[] <- 0 ## plot.ts(tmp3[j,]) } if(plot <= 2) { par(mfrow=c(2,1)) plot.ts(siginput, main="Original signal") plot.ts(rec, main="Reconstructed signal") } else { par(mfrow=c(nbchain+2,1)) par(mar=rep(2,4)) par(err=-1) plot.ts(siginput, main="Original signal") for(j in 1:nbchain) plot.ts(tmp3[j,],main=j) plot.ts(rec, main="Reconstructed signal") } list(rec=rec, ordered=tmp$ordered, chain=tmp$chain, comp=tmp3) } Rwave/MD50000644000176200001440000004025514125127122011651 0ustar liggesusersec3f0975bed767e26c0d241b8004648b *DESCRIPTION 292ecea061715923063eee9b5eb43e23 *NAMESPACE 6b5041e029729ade28358970ed45ef95 *NEWS 22ec47a09dbd6788a5389a28c89cff61 *R/00util.R e8128ea36ac2bdf000fa5fc9bc9f32e4 *R/Crazy_Climbers.R b825564486586e5a1da76877a028a8ff *R/Crc_Irrec.R 11f0280fcb4d26e8e03a91078c2d1f8f *R/Cwt_Morlet.R 71f59434c61f6f9d5394e4b55ab6e9e8 *R/Cwt_Squeezing.R 8b878c6c25b324da5d18fff9631ea69a *R/Cwt_Thierry.R 49454d71f96f67dd264b4758240cef23 *R/Cwt_phase.R 78d8283e2c71629203db5aa0574ccbe8 *R/Hessian_Climbers.R 02aa0a6eab267128e1f7b735ebb91da9 *R/Pca_Climbers.R 18d10e5baa4f7f937edd8f116ce1f8ae *R/Ridge_Annealing.R cc6f33d0bbc64e8d209476a314bea405 *R/Ridge_Icm.R 95477e5ee72c00d18081ac1f2128eb13 *R/Ridge_Irregular.R 6f77cbc792566ac6a7fc123398894d83 *R/Ridge_Recons.R c85f1962789241a53d074e86c91472ee *R/Snake_Annealing.R f685cf424d19253a0e4a7eaa8479ff08 *R/TF_Maxima.R ce42a6fba81514d34e5a2e8d0bc78b41 *R/crc_rec.R 5cf9ff350c5bb6767a31a0ba44062ac9 *R/cwt_dog.R 3a9ea365df6a2954fdd27618bd94f424 *R/extrema.R 6b4663e7d7c8f2399bb661f1b2d909cb *R/gRidge_Irregular.R 83caeb317fec84450897c7548f1b43da *R/gRidge_Recons.R 4546ae4c5b6f7e723f19246659882ead *R/gabor.R a3571c345aeeab8b2d7614d5f125233f *R/ingrid.R ada8b699d7ef85ec6b102596676ba9fb *R/mgabor.R e2fa2e9e24af3928e71c320b9d66bb73 *R/mreconst.R 17a027ad802cb24b3e6e7a2dff16d51a *R/mw.R 2070104d7908a1cbaa510418aef1686e *R/noise.R e0125957f8b5453b60d0f4e96d76a778 *R/pca_rec.R c311c43075e0bbb443b46dac73e537f5 *R/plot.R e31e0e6688a4c78f65c06ffa4895d2c8 *R/radar.R 8f8a7bedbf9ef6a4f8fa2893798aa2e1 *R/recon2d.R b878fab2fe5d0e94d6f0fc888583554b *R/robust.R 703bce05b7fd5e4544413d25e4326413 *R/simul.R 9c6235b7771e2216decb09d204ed4876 *R/skernel.R b7b68fa517a437a7f1e99a081c71d98c *R/svd.R b7198a07ca3adca043b78a1782ad09c3 *R/wv.R 8a54ed976f41461998936d42af93a5b2 *data/A0.rda 0eda9fe20964625e97b50324b56382ab *data/A0.txt.gz 98ad708964c8f3b715b728e54cc9a184 *data/A4.rda ad11c0f6e4115fe7f7a399d8b7dadce2 *data/A4.txt.gz a2f6e3fa1fc37674429e19c4063cfc4e *data/B0.rda 1e8c03a6148c52466ab3a177a94d9542 *data/B0.txt.gz b1514706111c0aa58c1ecc0b7a29ab9b *data/B4.rda 2dbed00c7809774966e12650c41bab95 *data/B4.txt.gz 6f00c8c0285d3d1c89785cd716faed3a *data/C0.rda 5ee73239fe76280ce879d276b15ebae5 *data/C0.txt.gz 91c685f3e90812c2850d617c809d6554 *data/C4.rda 07f638ce7f3c4249129c301b462cbb6e *data/C4.txt.gz 7859ffdb73712c7bb441bbce02fbd0d8 *data/D0.rda 9c00927cb04fe6a6a768d5d47bc35d61 *data/D0.txt.gz 86e6d42febec72be1e0570402ae80741 *data/D4.rda 48993749ac4ce5518fa0a4a686e92e3f *data/D4.txt.gz 41b0ca98d8d26c32ca35f7fcc37f3558 *data/Ekg.rda 4c787bdece5ac3a72a4182a567461a55 *data/HOWAREYOU.rda d4e381efe59ea9caad2bb41ecbda2b24 *data/HOWAREYOU.txt.gz 737dd5786dd839354bc42645d8c072c6 *data/HeartRate.txt.gz 585c2a9f32ad96956d447c58be90e64e *data/W_tilda.1.rda b19fd650d0e7cedb91f1f384c44368d5 *data/W_tilda.1.txt.gz 7b1c1be6d18f31ccbeb8c07ae7d0ecf4 *data/W_tilda.2.rda c1ffbf83ba3d5828c710d603c00a763a *data/W_tilda.2.txt.gz 529572767c710fb591e90bd6432500ea *data/W_tilda.3.rda 465bbfc07ab87593968d0c6bcd4aff09 *data/W_tilda.3.txt.gz d856fa1efd643d27737d6356d9486262 *data/W_tilda.4.rda 06bdc382ea86f1522f675ec4f0b480ed *data/W_tilda.4.txt.gz c67a6f9a096d8e345943a62a7d8455aa *data/W_tilda.5.rda 3a7608a17054f5b2f3c7f263fdfb3523 *data/W_tilda.5.txt.gz 8462c9990b93180ae05e7c4b2029390c *data/W_tilda.6.rda b33a9d805d6960e207e7c9568c58bf4d *data/W_tilda.6.txt.gz e740d73051e761eae43994304fdbf2a1 *data/W_tilda.7.rda 3b23e98c76273bbf2f4922b5a741bd6e *data/W_tilda.7.txt.gz ee11d58802a0d563ac0175d20cd59aaa *data/W_tilda.8.rda 8226e02436c628f8bbcde3c442d552b2 *data/W_tilda.8.txt.gz 58ffff7d95745f959d87e87a545ca4c3 *data/W_tilda.9.rda 9a4e58bbcb4e6c0809412fed5e8a2e15 *data/W_tilda.9.txt.gz cf670f69378340208cc68ff893cf346f *data/YN.rda 6fdcf0a9c5427001f7cb732e296599e5 *data/YNdiff.rda 36cf6c72467a81afb40a4e07a42eec5c *data/amber7.rda 61b05defbb0a7a806ba6e3dbef8cc653 *data/amber8.rda 12205c1991b2fce85a250915be840abf *data/amber9.rda 331dfaea00811df29ae0d43e3d5aed39 *data/back1.000.rda c6f63bcafe72da482a4b17fc9621a1ab *data/back1.180.rda ae048bfe1b29201f632855a7e76b9036 *data/back1.220.rda 6d04b669fa3612d9c0c96d555cfa0f4f *data/backscatter.1.000.txt.gz 269401f0541adcceab178117493c2c47 *data/backscatter.1.180.txt.gz 4d9da8f8b84f91b9e216794167d9a3a4 *data/backscatter.1.220.txt.gz 22c49dd5119e3d78e318bb3c1480ce95 *data/ch.rda 722edd21c0462a7ca55c5ac36522c741 *data/chirpm5db.dat.txt.gz 0ce3921fa0349a4f069a78298d3c4183 *data/click.asc.txt.gz 2243b894c3b5e344eebeaf2231e1fe91 *data/click.rda 7e4ce6bd352fa8a017df1ae2f32c044d *data/datalist aa237e9a37b4d0d0307665fe3bbe8bbb *data/noisy.dat.txt.gz 0bd68bfc6bfe9023a11f0d464c942077 *data/noisywave.rda a5f948f56904705c9b6b3e644c01fbf0 *data/pixel_8.7.txt.gz a22c6133ab71df60affd3252461b8394 *data/pixel_8.8.txt.gz 1719b7c7063e21b0f2119b72bfab7589 *data/pixel_8.9.txt.gz 4000bd385c200af7eb9f251d12ab825d *data/pure.dat.txt.gz b676370c283f438df38db35d1ef77763 *data/purwave.rda 1359679a7b1381706a06b49da3cd0bb8 *data/sig_W_tilda.1.rda da315c9d54bd0486d17ea8cce39afc51 *data/sig_W_tilda.1.txt.gz ab9a67d7a133eaa7ae0fb370abeea1be *data/sig_W_tilda.2.rda 0d08ee7faa9f0b0985435fb4fe096074 *data/sig_W_tilda.2.txt.gz 4f6dfe5728f611808713bfbc805dd887 *data/sig_W_tilda.3.rda 791d524a133da20558ae083198c9ddb2 *data/sig_W_tilda.3.txt.gz ceff841dd0c98534dc87747b714c4584 *data/sig_W_tilda.4.rda 12fcb74ca5f269bf63951737c860f4b0 *data/sig_W_tilda.4.txt.gz 3be70fa825ac540596559b01076fd5b0 *data/sig_W_tilda.5.rda c33416b064f7395951406edfe6be0330 *data/sig_W_tilda.5.txt.gz 16c705843a563e267d2c82da9f437157 *data/signal_W_tilda.1.rda b19fd650d0e7cedb91f1f384c44368d5 *data/signal_W_tilda.1.txt.gz fbebba44b3c71e999b39aca7d405055a *data/signal_W_tilda.2.rda c1ffbf83ba3d5828c710d603c00a763a *data/signal_W_tilda.2.txt.gz ad8dd0a458c77060fac5883600731ccf *data/signal_W_tilda.3.rda 465bbfc07ab87593968d0c6bcd4aff09 *data/signal_W_tilda.3.txt.gz 2a5f72760c61403bc4c0aabd92d7049f *data/signal_W_tilda.4.rda 06bdc382ea86f1522f675ec4f0b480ed *data/signal_W_tilda.4.txt.gz 1f2a1da7fc0b9b11a94b3be9eee6d784 *data/signal_W_tilda.5.rda 3a7608a17054f5b2f3c7f263fdfb3523 *data/signal_W_tilda.5.txt.gz ed5d59fc4467e213f31a8f05e2f771a7 *data/signal_W_tilda.6.rda b33a9d805d6960e207e7c9568c58bf4d *data/signal_W_tilda.6.txt.gz 57ee5155d605f9a3209e5170cb6c92f4 *data/signal_W_tilda.7.rda 73fc36a349f859caebd97d874eb19c32 *data/signal_W_tilda.7.txt.gz 7d93c1c04a3d70251a64e8777cbdab48 *data/signal_W_tilda.8.rda 44a0d29fcfda298ed1bc9645f15d6bbc *data/signal_W_tilda.8.txt.gz fd415192122c3f7ab14cd9714dfdb3b6 *data/signal_W_tilda.9.rda a7cca647dc9cea14ccaf5842fa9bd69a *data/signal_W_tilda.9.txt.gz 42bde1f3e80e91abde710df45ba68932 *data/yen.txt.gz d7ec2a99b480309d2917378a1656e671 *data/yendiff.txt.gz 5a9cfc011b5a1c6fa205b68f2e82bd8e *demo/00Index 8b64c278524f2ffff1d282d9b18620c4 *demo/chapter1.R b8e12c38b8fa3a024531f3e795d0e9e7 *demo/chapter3.R 6f613fdffab2fc318fc161a0784bc782 *demo/chapter8.R 9fafcd46e58f4478ae71f84befbb71f0 *inst/COPYRIGHTS 977a2df45cd6baf6b99a129864a68daf *man/DOG.Rd a1e74c21677cbf0ec32a338d647e8202 *man/Ekg.Rd b59cfe64908542e23ebedbd2ae5b4da6 *man/HOWAREYOU.Rd 285be38c13a5de9909bbc852c69c3d93 *man/HeartRate.Rd af35628f166321544083f323a3452c2d *man/RidgeSampling.Rd db06c0870ab14db0e234452d6e44bcf9 *man/Rwave-internal.Rd 0aa33aee177eb00c5bda5a35dd1d5647 *man/SVD.Rd 315fa243017686e21a6fe0e059876f2b *man/W_tilda.1.Rd cee6fda366436164ed8c5231fad77a36 *man/W_tilda.2.Rd c5045868dfd0a6ed631c0faff6126a65 *man/W_tilda.3.Rd 2b1ded936079fddcceb2babaca881c95 *man/W_tilda.4.Rd e40fbdb66b7a00a82457d0fa6f46dc85 *man/W_tilda.5.Rd 7dafb9280381288d1c24591e24f255c3 *man/W_tilda.6.Rd 1ce5e37b50805570ce856ad84cd6983b *man/W_tilda.7.Rd 78dc7653fb6cca4b1879918f2c7f5cda *man/W_tilda.8.Rd cc9544d2eccd6f0b7904cd2abfe1209e *man/W_tilda.9.Rd 2a4dae77d9fd6c38c625a9859d88a481 *man/YN.Rd 0372d3d2ce5b49ecc20d23310e4b2d12 *man/YNdiff.Rd 5fa6913bab229511e30c63720620ec09 *man/a0.Rd 530823f77f6aafd87af5e9d1e7123a9e *man/a4.Rd d6cb55e9da672a6e28bb5c47b34041f6 *man/adjust.length.Rd 7e484be89fb6271595c85de4b03b9c83 *man/amber7.Rd 435c28a93d18b7c732342b1b2d373901 *man/amber8.Rd b0c9bc1df270eacc8696977c0b5893c1 *man/amber9.Rd 385d5143739d0657e616bb1d45d42a9b *man/b0.Rd e286ba6c7b29dbaebd63568d1e2a2b6d *man/b4.Rd 16731b0f21344125162ff052a26e7738 *man/back1.000.Rd 2cf27e3029a78770aa11d7bda134fcd0 *man/back1.180.Rd c9f7ee1840702994c7f101397c98cc49 *man/back1.220.Rd 70327424b89f397402b29505db012afc *man/backscatter.1.000.Rd 64aa497369db806ec5018c32aff9eec4 *man/backscatter.1.180.Rd 529814fb6035a23c629a11a250a99772 *man/backscatter.1.220.Rd 36d6d1f50e0cbeb2c96bafc99b44f691 *man/c0.Rd bd84849f5a222f92f597647b1bf0213a *man/c4.Rd 899ae36366b3281f8be4188911b16f3e *man/cfamily.Rd 7d1b3da251f24b017e3b06ba2ed84a23 *man/cgt.Rd a6e4e16c4fa6de6d8fcf0631a9bd8439 *man/ch.Rd 49278af683f7ac0eef417a8852cfced9 *man/check.maxresoln.Rd 73c43cf4375fb427ad3985046b08b3f2 *man/chirpm5db.dat.Rd fe7d3404b585f5074a702c3650454760 *man/cleanph.Rd 1e301506fd52324eb5394f4b96cc6c72 *man/click.Rd ccb588bbe9e2de41137bd6f88053da49 *man/click.asc.Rd 03f10f039e9445ec4c9f94992795b215 *man/corona.Rd d76a2de510c1a70a832781be4eef0bfa *man/coronoid.Rd c45a0527816b90bb0180b5353342158b *man/crc.Rd a94b3ead423ef9628510d9144f3b0ea3 *man/crcrec.Rd 0878fc245ad00576d92055b8cc6e4ccc *man/crfview.Rd f4235d662552900e59b47f881e033dd0 *man/cwt.Rd bf162fe9f19547b054d96df346af5cc2 *man/cwtimage.Rd 0b45c62cf546e681fc3434b4e34f40b2 *man/cwtp.Rd 58a4d7eb504a702edd82729dc8038a0a *man/cwtpolar.Rd bff69127c875b95c6c029aa1b001b09b *man/cwtsquiz.Rd 634ebed56c977d61e444871e29fbab82 *man/cwtth.Rd e0e3908101da58baff07d86e3d78cdd4 *man/d0.Rd fd57bda3415569a7742f04f719c81eb5 *man/d4.Rd dfb814a77c92fa4bd2fd0a4dd513987c *man/dwinverse.Rd 76a47baccf643eba7a8b47d3a3b1e4a1 *man/epl.Rd 5a4b0fb64ed67ecbf496591a5741a4a9 *man/ext.Rd a610605fdbf533fbc7a6caabaea570f8 *man/fastgkernel.Rd 8644a7b5035d891aa122f2371bdf7a60 *man/fastkernel.Rd c31335a15d3db2277b17cae037a8a187 *man/gabor.Rd d5b12b1030bb85fbdb6f0294f2d710ca *man/gcrcrec.Rd 14b07d694a3ccf0e84b6b0bcec8dff9d *man/gkernel.Rd d01e2beeedf723e634a380564da508c3 *man/gregrec.Rd b817b3196f97faa53df18d5e3f350e8c *man/gridrec.Rd 3d28e0f39f56239e570c853a7f08c1c2 *man/gsampleOne.Rd d964e3b7144762c922d1446d530f1eee *man/gwave.Rd 234a424d9f6a8295f464634cb20c0bd0 *man/gwave2.Rd 5d4ec7528100efec98c3f013dbfdb0c2 *man/hurst.est.Rd 8ed098f5a3b5c2bdd05f6097a6b12164 *man/icm.Rd c6de045110e9c83e90dd1e45fa0949a4 *man/mbtrim.Rd fc45879820501626923080d630899117 *man/mntrim.Rd ad9f62fae859cec094f3be8fddbc77e1 *man/morlet.Rd ad4b31876d4b65a3a3badfe2f9d1cb61 *man/morwave.Rd e6c7dd063f697c02240f68df911082f7 *man/morwave2.Rd d8efc1e9945bedd9b544119d52d1f7cd *man/mrecons.Rd 1b3214cc668836597c98182140013871 *man/mw.Rd d4d3fd48cd5d0009c02a1a12b3a6be67 *man/noisy.dat.Rd 618f05951ffb2eb5e6f7f7c49947755b *man/noisywave.Rd 8c05f92b746d14292374482d535bc017 *man/npl.Rd ae4514c604d26004e75b0902a26f8fd3 *man/pixel_8.7.Rd 4dfd4711b60000328dd023e459770b38 *man/pixel_8.8.Rd 893f3f1c71ea26ddc0ff56111e58814b *man/pixel_8.9.Rd c307739c378dac5865cabc00967b2cd9 *man/plotResult.Rd ec6190223ab44cbaf0d182667a792548 *man/plotwt.Rd b05172e6b8f1970e2db7ce62a6e0bcd5 *man/pure.dat.Rd 842ce683119483e4feb129452e6b1a55 *man/purwave.Rd 91c8119e6ec8bd94bf1d07edbdd9dc8e *man/regrec.Rd 878334f6883ca8ec2a0ecde27fa2f944 *man/regrec2.Rd 7bc314b2c3b09e464a651391c4524082 *man/ridrec.Rd bc76a01a28012aa29d7a4122a05cb4b7 *man/rkernel.Rd b38e026fd111a1e0327f0c4de2c81332 *man/rwkernel.Rd 0d4dc14cb824eed79d745d264752923a *man/scrcrec.Rd d2d8745a1d741b431d4494c4a68a7d0c *man/sig_W_tilda.1.Rd 9fbf37916aaa0a5c6fae5da31d388327 *man/sig_W_tilda.2.Rd ac9a70a430ead5fd0988b4c6b6230c75 *man/sig_W_tilda.3.Rd 63a7518e5e9f0397044212d215423f7b *man/sig_W_tilda.4.Rd ce116b2e2929a74cbefe256d69ea03c8 *man/sig_W_tilda.5.Rd 91d3672ca05965991651f4a178b6593b *man/signal_W_tilda.1.Rd bdd0d3682668a878b8a9112323da7531 *man/signal_W_tilda.2.Rd d3f89bf910c89f6511661efc80477d08 *man/signal_W_tilda.3.Rd 50cc64c5dfc424a95e33f99316e46f19 *man/signal_W_tilda.4.Rd 0e6dd798bde2004373023167a9fea361 *man/signal_W_tilda.5.Rd fb8581ff14607fa3f007cb501b4d3d81 *man/signal_W_tilda.6.Rd 7e3782447ce74bac37cd94457d11860e *man/signal_W_tilda.7.Rd 7cc97b76f02ae129ff841c1e4629cc56 *man/signal_W_tilda.8.Rd a4987179bff7183a7c052d026fea918c *man/signal_W_tilda.9.Rd b43e83e4591488b95396ae4715f9228f *man/skeleton.Rd 20415735667da8f7c630cd69322d9dc1 *man/skeleton2.Rd 035485dd341ea60695152b4597a232ae *man/smoothts.Rd cbcac498c70ac16641771eebe1e38d8b *man/smoothwt.Rd 980f40a5199e0f05bf41bf03008a66d0 *man/snake.Rd 2a96aa6d5548e57cfd907d09fc51fc79 *man/snakeview.Rd 9e65dd0881892fd9e99691d8fbe592a4 *man/snakoid.Rd bf7101a8d0a891ebcf057425e1a7ea0b *man/sridrec.Rd 82f320d3ad44ee022c79e910aa844e4e *man/tfgmax.Rd 07615a666480f4903bcd7538373a7787 *man/tflmax.Rd a32bb05a2cf5382beec952316aba8666 *man/tfmean.Rd ef8bce4e742f7041af0e0f7d8e3fa577 *man/tfpct.Rd b2c379477a63d75bee94be960960e6d6 *man/tfvar.Rd 19243c52d0097c5da5ffba3103793d22 *man/vdog.Rd 85cfec306d96403350c2a5217ae47126 *man/vecgabor.Rd 4798930e1cdadaefc1049704f04b5259 *man/vecmorlet.Rd 1f0111dd78ac41e69f21c1b0e8a4dd5e *man/vgt.Rd 4607130a0183f28abeb5c7e8d5cb90b1 *man/vwt.Rd c83eecf76ce5cfb2000b7d026262907e *man/wRidgeSampling.Rd 8d2bdbc7b93f13200f66c4a7268468b8 *man/wpl.Rd e6b995edc17c235e36b2afd1ce8ca355 *man/wspec.pl.Rd b9cbee054425f078e29ace2ca3a6515c *man/wv.Rd c5a25cde2db1b488bbc2ef4709f50673 *man/yen.Rd e92265428f641c1a937ba21a9d0087c1 *man/yendiff.Rd f6f173fc36e01e221bf455c7a2d90743 *man/zerokernel.Rd 6342925351f9d3773bcdacb774615515 *man/zeroskeleton.Rd 5b015c6356e546b40e3da91a9e933a55 *man/zeroskeleton2.Rd 034f222858faf2a7053c7847f9186269 *src/Swave.h 846217aaba7aa8c731d1840463694918 *src/bee_annealing.c 67d3f196efb9de81defb06ae61054164 *src/choldc.c 28ed14e23ad38b9a0254fe0158284461 *src/compinteg.c aa3971ec424f1c4b76dfad6c75bfe639 *src/complex.c 7c15708283c36ecdb2e3d7d67c9f5a18 *src/complex.h 5925e648fca71a8e413fb0adbad1d31b *src/crazy_family.c c489f005b97ff6be329124b052e1f078 *src/cwt_dog.c 47f64a48b484db614956a55c94e19ff8 *src/cwt_maxima.c a23192b6d277c2b58c2e1eb57a8b57e8 *src/cwt_morlet.c 2d80b0b6ec1a4a2e8e1de2a2ecb7a551 *src/cwt_phase.c cfe486520ef34a6c5c4761ceafe151b8 *src/cwt_thierry.c b246db763adbfc1f928dbcec10e29aa0 *src/dau.c 2972032441047bcfa2211ccfb4f0bc9b *src/dau_wave.c a9fe6b847101faf06721db56be7cafb7 *src/dau_wave.h 66fffcb82e61e99760a0d6757474ebe1 *src/denoise.h b9bae662962f0b63a823b3a39a9ad2ff *src/dualwavelet.c e61efdfc3fd1e264612b794dcb50b7cf *src/dwfilter.c 4eccca092f874d5b378d8e800a55dfe3 *src/dwinverse.c dfd9f6b764f2a29e35bd90c1ee87c613 *src/dwkernel.c 2c9716c86dfba9e015b9f1d527e3cd98 *src/dwvector.c 2e5461b9f674fb64ee9e11996fb07b7c *src/dyadic.h 291072fca2eac39656cf7aad78b711a3 *src/extrema.c b390530f4e4ff052550ef29189dfcf30 *src/fft.c f83fdebfb5b1d3054ed053f901147cb1 *src/four1.c ac4ce717f9401b0d4715b43f44e54911 *src/gabor.c 81a5be89e8c3503417fa9df9d9f65f4b *src/gkernel.c 936ad1598749a153f6129acfdde3558e *src/hessian_climbers.c 5101f363b5643dae19b03b45f18f1538 *src/icm.c ae8afd8bb9435ba4d854673843b2a164 *src/init.c f1584945345b01bf808a34f0a17e2eed *src/mreconst.c 800a554d684964266e41cc28bb272327 *src/multiply.c d4ecb0fabdd3382fc508c206d36768f2 *src/mw.c b0a8313cd3263416ae3ddfb89dac524e *src/optimize.c d1557f76336ca4ddece87c66b9a35675 *src/pca_climbers.c 912cf9521612cb985659cabbd0956b49 *src/pca_family.c 50cc7e6f3e0bcff97f96a30ff05863ee *src/polint.c 422d192788579bc5f6565147a02dcc3f *src/pvalue.h 6e55f9030bfd41be2e118ebac1f560d7 *src/qcksrt.c e2c6901b620e116eb990f9fbee53ba1c *src/random.h 38e20c1678ea01b9be51cccc5db5c9fe *src/randomwalker.c 3ebff0da42c9d8cda1bc62895cce1590 *src/randomwalker2.c 8b9aab838f40a80a7220c89bd90ee277 *src/ridge_annealing.c 63dba49e3c19421b552810dda54b328a *src/ridge_coronoid.c f969480a8cc3e9d8c2b823090e174fc4 *src/ridge_snakenoid.c 517fd3d82bc332a4073cc7cc1c00ff91 *src/rwkernel.c 8181fc0ac354b3ad833f55438d1e5e1c *src/rwkernel.h 97c14a9ccf0fca61091b06ae2634169c *src/simul.c ebd5bff05564588929c39bd780858abe *src/smoothwt.c 81bc0907de746ebd8e11c37baf1e0680 *src/snake_annealing.c a318053577138a4aa03dc7c872d92bdb *src/snakesub.c 910821f971b0777e897265e0ec47b99a *src/spline.c cacc44e8b73590af24a27156a8b3f906 *src/splint2.c f91325c25c4d84b24e1adae205527ad2 *src/splridge.c 7a26115ee5238eeff55941411ab127b5 *src/splsnake.c 26fbf85046c1020ffc29d5f0b3aa04e7 *src/svd.c 2bd3bdd963c147e6fb8febfee1a6a79b *src/util.c f0ab06a28735c5239eeb6bcbbab1d531 *src/wv.c Rwave/inst/0000755000176200001440000000000013230166326012315 5ustar liggesusersRwave/inst/COPYRIGHTS0000644000176200001440000000004313230166326013730 0ustar liggesusersCopyright University of California