SUB_WAVELET/Fortran/SUB_WAVELET.f90

96 lines
2.7 KiB
Fortran
Raw Normal View History

2025-04-17 17:31:56 +08:00
!<21><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SUBROUTINE SUB_WAVELET(n,&
Data_Error,&
Data_Re,&
Error)&
bind(C, name="SUB_WAVELET")
!DEC$ ATTRIBUTES DLLEXPORT::SUB_WAVELET
implicit none
!<21>ӿ<EFBFBD>
integer :: n
real*8 :: Data_Error(n),Data_Re(n),Error(n)
!<21>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>
character(len=3) :: Wavelets(10) !<21>˲<EFBFBD><CBB2><EFBFBD>ʽ
integer :: Plies_Numbers(5) !<21>ֲ<EFBFBD><D6B2><EFBFBD>
real*8 :: c(1000),ca(1000),thr,cd(1000,6),ysoft(1000,6),c1(2000)
integer :: nc,nl,nca,ncd(6),nc1,i,j,k,ii
integer,allocatable :: l(:)
real*8 :: R_SN,R_SN_Max
character(len=3) :: Wavelets_best
integer :: Plies_Bset(2)
real*8 :: Wave_Bset(n)
!<21><>ʼ<EFBFBD><CABC>
Data_Re = 0
Error = 0
!<21><><EFBFBD><EFBFBD>
!<21><><EFBFBD><EFBFBD><EFBFBD>źŷֽ<C5B7><D6BD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>ʽ<EFBFBD>Լ<EFBFBD><D4BC>ֲ<EFBFBD><D6B2><EFBFBD>Ӱ<EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0>
Wavelets = ['db2','db3','db4','db5','db6',&
'db7','db8','fk4','fk6','fk8']
Plies_Numbers = [2,3,4,5,6]
R_SN_Max = 0
do i=1,10
do j=1,5
!<21>źŷֽ<C5B7>
nl = Plies_Numbers(j)+2
allocate(l(nl))
call wavedec(n,Data_Error,Plies_Numbers(j),Wavelets(i),nc,c,nl,l)
!<21><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
call appcoef(nc,c(1:nc),nl,l,Plies_Numbers(j),Wavelets(i),nca,ca)
!<21><>ֵ<EFBFBD><D6B5>ȡ
thr = (2.0*log(real(n)))**0.5
!<21><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶϸ<C6B5><CFB8>ϵ<EFBFBD><CFB5>
ncd = 0
do k=1,Plies_Numbers(j)
call detcoef(nc,c,nl,l,k,ncd(k),cd(:,k))
!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
call wthresh(ncd(k),cd(1:ncd(k),k),thr,ysoft(1:ncd(k),k))
end do
do k=1,Plies_Numbers(j)
cd(:,k) = ysoft(:,k)
nc1 = nca
c1(1:nc1) = ca(1:nca)
do ii=6,1,-1
if(ncd(ii)/=0) then
c1(nc1+1:nc1+ncd(ii)) = cd(1:ncd(ii),ii)
nc1 = nc1+ncd(ii)
end if
end do
!<21><><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>
call appcoef(nc1,c1(1:nc1),nl,l,0,Wavelets(i),n,Data_Re)
!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
R_SN = 10.0*log(sum(Data_Error**2)/sum((Data_Error-Data_Re)**2))
if(R_SN > R_SN_Max) then
R_SN_Max = R_SN
Wavelets_best = Wavelets(i)
Plies_Bset(1) = Plies_Numbers(j)
Plies_Bset(2) = k
Wave_Bset = Data_Re
end if
end do
deallocate(l)
end do
end do
!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Data_Re = Wave_Bset
Error = Data_Error-Data_Re
end subroutine