mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-04-06 19:38:35 -04:00
Add initial version of program echosim.
This commit is contained in:
parent
7db3d80c90
commit
5e4bd8ac9f
@ -385,6 +385,7 @@ set (wsjt_FSRCS
|
||||
lib/demod64a.f90
|
||||
lib/determ.f90
|
||||
lib/downsam9.f90
|
||||
lib/echosim.f90
|
||||
lib/echo_snr.f90
|
||||
lib/encode232.f90
|
||||
lib/encode4.f90
|
||||
@ -1184,6 +1185,9 @@ target_link_libraries (ft8code wsjt_fort wsjt_cxx)
|
||||
add_executable (ft4code lib/ft4/ft4code.f90)
|
||||
target_link_libraries (ft4code wsjt_fort wsjt_cxx)
|
||||
|
||||
add_executable (echosim lib/echosim.f90)
|
||||
target_link_libraries (echosim wsjt_fort wsjt_cxx)
|
||||
|
||||
add_executable (ft8sim lib/ft8/ft8sim.f90)
|
||||
target_link_libraries (ft8sim wsjt_fort wsjt_cxx)
|
||||
|
||||
|
101
lib/echosim.f90
Normal file
101
lib/echosim.f90
Normal file
@ -0,0 +1,101 @@
|
||||
program echosim
|
||||
|
||||
! Generate simulated echo-mode files -- self-echo or "measure"
|
||||
|
||||
use wavhdr
|
||||
parameter (NWAVE=27648,NMAX=32768,NZ=36000)
|
||||
type(hdr) h !Header for .wav file
|
||||
character arg*12,fname*17
|
||||
complex c0(0:NMAX-1)
|
||||
complex c(0:NMAX-1)
|
||||
! complex cwave(0:NWAVE-1)
|
||||
real*8 f0,dt,twopi,phi,dphi
|
||||
real wave(NZ)
|
||||
integer*2 iwave(NZ) !Generated full-length waveform
|
||||
equivalence (nDop0,iwave(1))
|
||||
equivalence (nDopAudio0,iwave(3))
|
||||
equivalence (nfrit0,iwave(5))
|
||||
equivalence (f10,iwave(7))
|
||||
equivalence (fspread0,iwave(9))
|
||||
|
||||
! Get command-line argument(s)
|
||||
nargs=iargc()
|
||||
if(nargs.ne.6) then
|
||||
print*,'Usage: echosim f0 fdop fspread delay nfiles snr'
|
||||
print*,'Examples: echosim 1500 0.0 4.0 5.0 10 -22'
|
||||
go to 999
|
||||
endif
|
||||
|
||||
call getarg(1,arg)
|
||||
read(arg,*) f0 !Tone frequency
|
||||
call getarg(2,arg)
|
||||
read(arg,*) fdop !Doppler shift (Hz)
|
||||
call getarg(3,arg)
|
||||
read(arg,*) fspread !Watterson frequency spread (Hz)
|
||||
call getarg(4,arg)
|
||||
read(arg,*) delay !Watterson delay (ms)
|
||||
call getarg(5,arg)
|
||||
read(arg,*) nfiles !Number of files
|
||||
call getarg(6,arg)
|
||||
read(arg,*) snrdb !SNR_2500
|
||||
|
||||
twopi=8.d0*atan(1.d0)
|
||||
fs=12000.0 !Sample rate (Hz)
|
||||
dt=1.d0/fs !Sample interval (s)
|
||||
bandwidth_ratio=2500.0/(fs/2.0)
|
||||
sig=sqrt(2*bandwidth_ratio) * 10.0**(0.05*snrdb)
|
||||
if(snrdb.gt.90.0) sig=1.0
|
||||
dphi=twopi*(f0+fdop)*dt
|
||||
|
||||
do ifile=1,nfiles
|
||||
phi=0.d0
|
||||
do i=0,NWAVE-1
|
||||
phi=phi + dphi
|
||||
if(phi.gt.twopi) phi=phi-twopi
|
||||
xphi=phi
|
||||
c0(i)=cmplx(cos(xphi),sin(xphi))
|
||||
enddo
|
||||
c0(NWAVE:)=0.
|
||||
if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c0,NMAX,NWAVE,fs,delay,fspread)
|
||||
c=sig*c0
|
||||
wave(1:NWAVE)=imag(c(1:NWAVE))
|
||||
peak=maxval(abs(wave))
|
||||
if(snrdb.lt.90) then
|
||||
do i=1,NWAVE !Add gaussian noise at specified SNR
|
||||
xnoise=gran()
|
||||
wave(i)=wave(i) + xnoise
|
||||
enddo
|
||||
do i=NWAVE+1,NZ
|
||||
xnoise=gran()
|
||||
wave(i)=xnoise
|
||||
enddo
|
||||
endif
|
||||
|
||||
gain=100.0
|
||||
if(snrdb.lt.90.0) then
|
||||
wave=gain*wave
|
||||
else
|
||||
datpk=maxval(abs(wave))
|
||||
fac=32766.9/datpk
|
||||
wave=fac*wave
|
||||
endif
|
||||
if(any(abs(wave).gt.32767.0)) print*,"Warning - data will be clipped."
|
||||
iwave=nint(wave)
|
||||
|
||||
nDop0=nint(fdop)
|
||||
nDopAudio0=0
|
||||
nfrit0=0
|
||||
f10=f0 + fdop
|
||||
fspread0=fspread
|
||||
|
||||
h=default_header(12000,NMAX)
|
||||
write(fname,1102) 3*ifile
|
||||
1102 format('000000_',i6.6,'.wav')
|
||||
open(10,file=fname,status='unknown',access='stream')
|
||||
write(10) h,iwave !Save to *.wav file
|
||||
close(10)
|
||||
write(*,1110) ifile,xdt,f0,snrdb,fname
|
||||
1110 format(i4,f7.2,f8.2,f7.1,2x,a17)
|
||||
enddo
|
||||
|
||||
999 end program echosim
|
Loading…
Reference in New Issue
Block a user