|
马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
原始图形如下,添加了噪声,使用的是db3小波,做了5层分解。0 z Z( d- s3 x' c' b
可是使用模极大值法检测不到第二个波的波头,不知道为什么?$ `, b' q- f1 `* z# l; [1 D7 c# \
请达人指教。 u& H6 e& c' R
源程序在如下$ e8 t7 v6 t# J" J* c
plot(cable(:,1),cable(:,2))4 ?3 B [/ ?+ p% z
tcable=cable(:,1);
1 O( W2 B/ a& v+ f" H% Zycable=cable(:,2);
8 o* Y1 ^' @% n, }2 j" qlength(ycable)
3 v3 S( r! s U& O4 p7 n6 H
" S1 o5 c# S& z7 L) D1 a6 p* usignal_length=33856;. L8 t- b8 d7 F* G! F4 X0 x3 C
t(1:signal_length,1)=0;
7 R# E1 w2 N) j+ L. ]3 [- L% i Ncable=length(tcable);1 R. y1 }6 {" N/ ?8 M3 N$ t! h
for i=1:Ncable/ j. r# ^- _0 R
t(i,1)=tcable(i,1);
' S6 o5 H2 T5 ~6 ` end$ r, R8 h3 D. a2 E9 u* i; S9 E6 M6 d8 ~
q* x5 y: e$ w3 E- qy(1:signal_length,1)=0;! E# \9 C5 F- v
for i=1:Ncable8 C1 \2 D4 F; E
y(i,1)=ycable(i,1);
H: l9 V7 C- vend
9 A& a: n' t" P noise=0.01*rand(1,length(y));8 ^2 }2 j: ~3 g6 q7 z" j
y_noise=y+noise';
! G9 }, F& b9 W; W% X8 ]% @3 @% d# |9 [) F2 @3 G
signal=y_noise;9 {4 c: D9 I" R1 s
%plot(t,signal)9 }9 b1 n, w3 _; B% s d6 k& D
points=length(signal); level=5; sr=360; num_inter=6; wf='db3';
' x% E5 g( Z; H%所处理数据的长度 分解的级数 抽样率 迭代次数 小波名称5 N+ z' e! x1 P4 v6 h
offset=0;
7 p7 O# J! n# F. c5 v9 G E0 p; K8 j/ Z7 s) C
; A. X$ q; s% X, n+ K; C%____进行二进制小波变换(离散平稳小波变换),并给出各级波形:8 n" a3 x1 V- Q% Q3 D2 ?2 r5 N- r
[Lo_D,Hi_D,Lo_R,Hi_R]=wfilters(wf);%Lo_D:分解低通滤波器$ P( e/ ?0 T# V: H- l
%Hi_D:分解高通滤波器: e6 X6 G1 R" x k
%Lo_R:重建低通滤波器 [5 J1 p: M; q, l- E) P% x' ?
%Hi_R:重建高通滤波器
7 \3 b# b# L9 C/ N p# [
& M1 \% w0 [( W$ Z[swa,swd] = swt(signal,level,Lo_D,Hi_D);%swa小波概貌
0 X* H( M+ S# b$ d" L/ x# S# \9 X %swd小波系数7 P4 B( k: y4 ^
/ Q# e( @6 T& H/ M2 G. R) wfigure;%figure1# H, N7 ~) o# F7 Y) r
subplot(level,1,1); plot(real(signal)); grid on;axis tight;
" H5 ^. g: i5 g" J) Bfor i=1:level
2 Q5 M0 q. J, i- i4 A subplot(level+1,2,2*(i)+1);
6 f1 ~& \( y! W) j plot(swa(i,:)); axis tight;grid on;xlabel('time');
0 ]. \3 G) d( ^) n ylabel(strcat('a ',num2str(i)));0 O: d/ o9 a4 a! l
subplot(level+1,2,2*(i)+2);
; |& z( {2 Q' i9 C& b, L. l plot(swd(i,:)); axis tight;grid on;
/ ~7 V" u" w4 Y3 n2 O* D: M2 Pylabel(strcat('d ',num2str(i)));/ z; a6 D/ y, W. S4 i
end
7 g5 w2 L/ U8 T7 P `0 Z8 b%以上内容是对信号进行离散小波变换。
6 C4 Y( T+ O6 Y6 v+ s/ |2 u%尺度为52 y" K- J2 g3 I1 W6 A a
! T5 J( V5 ~/ x5 y9 t) w1 M. T# ~" B! K, K k0 W4 e# A4 T8 v* `& q q; a
. I2 A0 D5 G1 k B9 o" k1 Y) ]
%____求小波变换的模极大值及其位置,并按级给出小波变换模极大的波形:8 d% Z4 s `* y
% swa:小波概貌; swd:小波细节;
- R1 w& k. V$ `% ddw:局部极大位置; wpeak:小波变换的局部极大序列。; [* ?/ ^6 l% j1 G) m
ddw=zeros(size(swd));%建立与swd维数相同的矩阵,矩阵值都为零( a4 h" i/ B% q5 g# F
pddw=ddw;7 W8 |+ C/ ] q, F- ?
nddw=ddw;8 O3 N2 M) J0 f3 J) c
posw=swd.*(swd>0);%.*数组乘法,将swd中小于零的数置零
3 ^- E5 m4 B: b$ r! ~& tpdw=((posw(:,1:points-1)-posw(:,2:points))<0);2 w) D# h$ S& T; D
pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);6 D6 \/ k8 K$ x3 q" D$ N. f
negw=swd.*(swd<0);%将swd中大于零的数置零
$ h( t' q" k% b* F- k, k) _* Endw=((negw(:,1:points-1)-negw(:,2:points))>0);
0 `" m# c) u* N& | Inddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);5 Z8 v8 r2 ?3 @# p ]% c/ l% ~
ddw=pddw|nddw;%|:或
7 ~* h% {$ T* }" Fddw(:,1)=1;. @ V) G. `' x) _: H. ] C. H8 B) A
ddw(:,points)=1;
# [. T% D$ | |/ E8 f8 Qwpeak=ddw.*swd;
( a$ t R! r* E) H* r- u( a. e/ K Twpeak(:,1)=wpeak(:,1)+1e-10;%第一列的值加上1e-10,不知道出于什么目的,目前看来不会对结果产生影响$ f! k2 S4 U3 H/ D. T5 Q0 ?7 t1 i% {
wpeak(:,points)=wpeak(:,points)+1e-10;%同理,将最后一列的值加上1e-10,不知道出于什么目的,目前看来同样不会对结果产生影响
; ?6 k2 C; d$ i/ i. \5 Q%以上内容为:寻找每级尺度上小波变换系数对应的模极大值点, B+ |# w0 e: [. H- K
0 A, k( n( |* ]. e& m5 Wwpeak_threshold=wpeak(level,:)/max(abs(wpeak(level,:)));! L' ]3 q& C+ q1 j3 d/ F
threshold=0.1; % 阈值
* J8 z" F: j" M; V* Q/ }2 }$ k+ p( p% U5 E. g! l
for i=1:points;* y; g7 k( s8 Y" @8 [/ B C$ A8 w
if (abs(wpeak_threshold(i))<threshold)6 k* e9 X, p( ]8 \! l% X
wpeak(level,i)=0;
" n) K S) g- p& }; l9 A0 F: r/ O end
6 \7 V+ b' b5 [; I" g' E5 ?end; ) G( O9 y8 {5 ]! \% } p' m
D5_wpeak=wpeak(level,:);
8 F A1 q0 r! d& b, [$ d. G4 J& E2 d3 V) e5 ?
%对最大尺度2.^J上的极大值点设定阈值T0,将低于阈值T0的模极大值点去掉,
3 k. ~; @- n5 P! e5 F# \: r# B
; x( x/ i2 X: G$ x% r! v3 o9 Y8 F" W: V" k8 v' L
%____进行模极大值的处理:, E1 U$ T! t; k/ i/ v% T
%%C=0.8; 9 r9 O; e$ ?( ?" Y
%此参数需要调节,为了在最大尺度上设定合适阈值,以确定最大尺度上该保留的模极大值点。
2 A) U- m9 c$ s0 i+ e G%%D5_wpeak=wpeak(level,:);5 f- N9 h* Q2 G& \6 l" K* u& P
%%M=max(abs(D5_wpeak));. M$ ?0 g& L- d6 l; H& @/ d
%%Thr=C*M/level; %阈值计算,可参考论文:"3mm波段脉冲雷达系统研究和小波去噪分析"。8 N, a( x5 r2 h; b: T3 [# A
%%for i=1:points3 v( s& T: M$ ?( R
%% if(abs(D5_wpeak(i))<Thr)- r+ F; d: e8 E& ?' c( k$ q9 B
%% wpeak(level,i)=0;
3 I& g& ]; L6 R% k, }5 k* B& m7 ^%% end
. b- E& t2 w7 w, N3 e$ a; q%%end7 ~& L0 s$ c H5 ^) e
%%D5_wpeak=wpeak(level,:);
, f; h' I6 w7 z \; ]3 m' x1 R) M: q) _5 ?# e8 C" J
figure;%figure2
: m8 l5 g, E2 l3 Usubplot(level+1,1,1); plot(real(signal)); grid on;axis tight;
: U$ s2 W: b0 dfor i=1:level0 L* k3 N# M2 y# d7 R
subplot(level+1,1,i+1);
* j, R/ x! _" v( b6 `0 O plot(wpeak(i,:)); axis tight;grid on;
. ^0 G }# V: w2 p* C1 k/ A6 `- q1 Xylabel(strcat('j= ',num2str(i)));; {: }, J% L- e8 M
end
/ f }# F( U) o1 e
! e1 s, H9 `4 q& Q2 Y9 U& L2 l. Y" `, W/ ^
%步骤4
- O" P' U/ |- |6 v+ L%模极大值的处理方式:: q$ n, b3 U1 f3 P3 T' P! m
%在尺度j上极大值点位置,构造一个搜索区域,& v5 G5 d% f( P2 ~# w: Q( ]
%在尺度j-1中,极大值点落在该区域的点保留,其他的置0;
! w3 A4 C+ \: `# Y2 wD4_wpeak=wpeak(level-1,:);) e% X8 \% b' }2 ]& ^- K6 ?* x( g
sousu=6;: p9 Y; S6 _' |# `9 y
D5_p=(D5_wpeak~=0);
6 l$ d) w1 B8 S/ iO_d5=sousu;%该参数确定在上一级搜索极大值的范围,可以调整。
( o5 ?& t( @ m5 ~7 q( P: H$ K; F% wfor P_d5=O_d5:(length(D5_wpeak)-O_d5);6 m# C' x; j0 ^4 S) Q: A
if D5_p(P_d5)==1;
) S5 v% M) y" K for i=1:O_d5-1;) d0 ?% ]) f& N/ b& a
D5_p(P_d5-i)=1; 0 e: n7 c6 e4 m' B( ]8 C8 }
end ;
& W& Q. k3 w. Q7 x$ Q end; ! \7 N# D( M, U, j5 N, [
end;# h6 M |5 j) n, c9 y- d
D4_wpeak=D4_wpeak.*D5_p;/ c, C. [+ B( l0 t/ d4 |) i. s
* ]$ j) ?2 R2 m5 D1 N( t$ G! y, {D3_wpeak=wpeak(level-2,:);* o. G& a2 K1 y8 a& C
D4_p=(D4_wpeak~=0);& p: L' d& m9 T* a- d0 M5 z) V
O_d4=sousu;%该参数确定在上一级搜索极大值的范围,可以调整。& q- |0 {% ^* |; a8 z v8 C: _# D
for P_d4=O_d4:(length(D4_wpeak)-O_d4);
$ [% [3 f) S5 f f' X$ f8 { if D4_p(P_d4)==1;
* p# s- n" A9 K" U" k Y for i=1:O_d4-1;
! K7 X5 d! ~- g# \7 G& M D4_p(P_d4-i)=1; & p% L7 }2 E) u3 I
end ;; R9 [$ M$ c( v. E* ]9 Z# w, P
end;
1 e" T& X5 l7 send;
9 t* y% L& S Z1 c/ U/ h* AD3_wpeak=D3_wpeak.*D4_p;) W5 B) }2 B- a) y- N; w6 K
. ~! y5 {% S6 S4 R) y
D2_wpeak=wpeak(level-3,:);4 L: l% \9 Y. \( B8 F: R
D3_p=(D3_wpeak~=0);- C% |0 q" E/ d5 U: J8 n
O_d3=sousu;%该参数确定在上一级搜索极大值的范围,可以调整。6 d1 k$ K; j/ H6 \% i& g/ u4 N' W
for P_d3=O_d3:(length(D3_wpeak)-O_d3);
# e% ~ Q; a! O8 n; j if D3_p(P_d3)==1;
2 k! h' x* J: b for i=1:O_d3-1;! w# U, ?' }' `6 `+ r
D3_p(P_d3-i)=1;
/ }! v' w1 _2 { A end ;
; v. R+ y7 S+ [0 b( P$ x! [: p end;
; F' ]$ V$ F/ ^7 t) h# c" ~3 R8 |end;
( C( }8 D$ j E8 d9 f# [D2_wpeak=D2_wpeak.*D3_p;: E: e* \: [/ U0 o
5 g, X9 M6 k( I
%第一层单独处理,在第二层极大值点位置上,保留第一层相应极大值点:
3 H! G7 B+ E l7 DD1_wpeak=wpeak(level-4,:);# g+ k) J3 _8 Y, \( Q s7 {
D2_p=(D2_wpeak~=0);
# T+ A) ?& d6 F5 HD1_wpeak=D1_wpeak.*D2_p;, L/ g w+ r) s5 s
3 f3 C$ K( @, ?wpeak=[D1_wpeak' D2_wpeak' D3_wpeak' D4_wpeak' D5_wpeak'];7 }0 T N$ w+ z. w/ e- Q5 B
wpeak=wpeak';: o# `# U- Q8 d E
, p. a) ^# W$ c%____重构信号:8 E/ Z6 ~. T9 z/ C
pswa=swa(level,:); % pswa: 为待重建的信号4 I, g$ V7 C) p5 r8 d/ D
wframe=(wpeak~=0); %迭代初始化
1 f: o( }. x& M. ]$ ww0=zeros(1,points);
, A4 u" o3 N- B0 y" Y" P[a,d]=swt(w0,level,Lo_D,Hi_D);
/ P* |8 r8 x7 B; R% @$ w! Yw2=d; % w2为待重建小波
+ [6 i; w3 D6 \ for j=1:num_inter
% U- [- F! E3 |) S8 N& @ w2=Py_Pgama(d,wpeak,wframe,1,sr); % 先进行Py投影和 Pgama投影# {" E# d/ z0 V O, C
w0=iswt(pswa,w2,Lo_R,Hi_R); % 再进行Pv投影
; u2 x% o; ~8 B" Z) Q2 F6 X) C [a,d]=swt(w0,level,Lo_D,Hi_D); % Pv7 P. e* A. }3 ~
end
6 |7 K b: K" ^* V7 n f4 ~ pswa=iswt(swa(level,:),w2,Lo_R,Hi_R); % 计算重建信号 2 Q' L, P1 Q. ^( o
p* y2 K- e' l9 ] y, sxcrr=y'-pswa; % 重建误差! }7 V% G1 k! |! {+ A! ?
figure;%figure3
/ M" D4 P+ J' A5 o& }+ u" Ssubplot(411)$ A$ T; V" E h \7 o/ h; W
plot(y(1:points),'r');) a0 u3 W7 A: g$ H
axis tight;, V* [& p3 w- D( U; p
subplot(412)
K6 X+ Z) e4 ?% vplot(signal(1:points),'r');
, ?7 z0 y1 [. [5 {- O( i6 o( ~axis tight;
3 f$ B- Y. j! w8 Q0 p: q; Osubplot(413)
3 W. T5 G. r, a/ a- yplot(pswa(1:points)); " y; p6 I1 L* I. z! m
axis tight;
, \& I$ p6 {6 v" S6 Nsubplot(414)
: C! {9 @) y! T* Zplot(xcrr(1:points));
- n' h/ L' E; t2 aaxis tight;
; K) D7 S: i1 c m2 @figure%figure4 t2 h! v' X r3 y) V& z! }6 J
subplot(611)
$ `" U! H8 {/ t2 i" j7 Lplot(signal);
\3 q; Q9 V0 x4 _: S5 a6 Ksubplot(612)
5 m( ]: e6 |/ ^. S6 ^ }plot(D5_wpeak);
) N# k4 c$ N' j( V; @9 {+ K2 ~subplot(613)
( l1 x+ r, W* t& J- U9 y8 T' `plot(D4_wpeak);( ]1 I0 T! q$ F/ }3 H
subplot(614)
# B9 F" l$ L4 `& T, {2 I* G5 a6 n/ Dplot(D3_wpeak);
8 V0 w+ L/ C+ Dsubplot(615)
3 r: X4 n! f1 B9 d0 splot(D2_wpeak);
' D& s: K# J6 M Ksubplot(616): X9 {9 S* a5 \+ A1 ]6 o% x( @0 e
plot(D1_wpeak);
* Y# p9 E- J s6 k/ a4 C+ w4 ?[value,index]=max(abs(D2_wpeak))+ Z$ ]7 `. F% Y {7 }5 e
[value,index]=max(abs(D1_wpeak)) |
|