Squashed commit of the following:

commit dbca224ee15f598ba86b860c19e902b594f6b888
Author: Jordan Sherer <jordan@widefido.com>
Date:   Wed Aug 14 21:10:17 2019 -0400

    Cleanup decoder with easy parameters

commit 427a6ac6bf02a7de80e76b921bbd48ec23dab0c4
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 22:56:32 2019 -0400

    Working on downsampling

commit ef5e1fb9cdafb6069b6f67377c3bc9e073d2785e
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 22:01:34 2019 -0400

    Fixed NN parameters

commit 216dbc83a931127540fb028d3365a205b4ef1d28
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 21:40:20 2019 -0400

    Fixed dupe during sync

commit 9505d50ba6c42b05e5fff1a059864a643d9e7558
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 16:54:37 2019 -0400

    Tweaking downsampling

commit 86cd07e1ac8ce8d64cdd2d4321cf295cd867f80e
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 10:11:07 2019 -0400

    Working with logging

commit 0de3849a442d20081f545c6fef5fadf2def6e0d2
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 03:46:51 2019 -0400

    250 millisecond startup delay

commit a35cc5302b6f8532a424d504a4e2feaacf74ef99
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 03:39:20 2019 -0400

    1200 sps, 10 seconds, 80Hz

commit 6f36db20f90c510336b497605d9d7667d6f0f44f
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 03:27:12 2019 -0400

    Working word count

commit 741c55ac0840512d68e1fbdb2f1fff6adfcd4612
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 02:40:40 2019 -0400

    Updated LDPC simulator

commit ce0992644315402503f44bdae4131bacf2cc3e21
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 02:34:01 2019 -0400

    Weird. Apparently symbol stop is the only way to get decodes to work in app...need to figure out why

commit 8b330fbff6574f2ee6d7a471dd93a2cb57b492dd
Author: Jordan Sherer <jordan@widefido.com>
Date:   Tue Aug 13 01:50:37 2019 -0400

    More parameter fixups (downsampling) and first decode

commit 37c780b45e6579294b5a4692b8e8d0602d9bd8b1
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 12 23:20:58 2019 -0400

    More params fixing

commit bc8547e1e8f55bfb4bce5f95890f3cf6798e36d7
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 12 22:48:00 2019 -0400

    Fixed params in fortran code

commit 10fbf9f4a78c6244e0082a31819ee26aeae39325
Author: Jordan Sherer <jordan@widefido.com>
Date:   Mon Aug 12 16:08:32 2019 -0400

    Using constants in place of literals in a few places to make it easier to change
This commit is contained in:
Jordan Sherer 2019-08-14 21:11:06 -04:00
parent 0647972591
commit 15bf364e5e
15 changed files with 132 additions and 192 deletions

View File

@ -71,7 +71,7 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
m_toneSpacing = toneSpacing;
m_bFastMode=fastMode;
m_TRperiod=TRperiod;
unsigned delay_ms = 1920 == m_nsps && 15 == m_period ? 500 : 1000;
unsigned delay_ms = 1920 == m_nsps && 15 == m_period ? 500 : 250; // 1000;
// noise generator parameters
if (m_addNoise) {

View File

@ -3,8 +3,24 @@
#define NSMAX 6827
#define NTMAX 300
#define RX_SAMPLE_RATE 12000
#define JS8_NUM_SYMBOLS 79
#ifndef JS8_80HZ
#define JS8_80HZ 0
#endif
#if JS8_80HZ
#define JS8_SYMBOL_SAMPLES 1200 // 480 // 600 // 1200 // 1920
#define JS8_TX_SECONDS 10 // 5 // 6 // 10 // 15
#define JS8_SYMBOL_STOP 32 // 12 // 16 // 32 // 50 // ??? no idea why this works...
#else
#define JS8_SYMBOL_SAMPLES 1920
#define JS8_TX_SECONDS 15
#define JS8_SYMBOL_STOP 50
#endif
#ifndef TEST_FOX_WAVE_GEN
#define TEST_FOX_WAVE_GEN 0

View File

@ -5,13 +5,16 @@ subroutine baseline(s,nfa,nfb,sbase)
! Output: sbase(npts) Baseline
implicit real*8 (a-h,o-z)
real*4 s(1920)
real*4 sbase(1920)
include 'ft8_params.f90'
real*4 s(NSPS)
real*4 sbase(NSPS)
real*4 base
real*8 x(1000),y(1000),a(5)
data nseg/10/,npct/10/
df=12000.0/3840.0 !3.125 Hz
df=12000.0/(NSPS*2.0d0) !3.125 Hz
ia=max(1,nint(nfa/df))
ib=nint(nfb/df)
do i=ia,ib

View File

@ -1,38 +1,40 @@
subroutine ft8_downsample(dd,newdat,f0,c1)
! Downconvert to complex data sampled at 200 Hz ==> 32 samples/symbol
! Downconvert to complex data sampled at 200 Hz ==> 32 samples/symbol
parameter (NMAX=15*12000,NSPS=1920)
parameter (NFFT1=192000,NFFT2=3200) !192000/60 = 3200
include 'ft8_params.f90'
parameter (NDFFT1=NSPS*NDD, NDFFT2=NDFFT1/NDOWN) ! Downconverted FFT Size - 192000/60 = 3200
logical newdat,first
complex c1(0:NFFT2-1)
complex cx(0:NFFT1/2)
real dd(NMAX),x(NFFT1),taper(0:100)
complex c1(0:NDFFT2-1)
complex cx(0:NDFFT1/2)
real dd(NMAX),x(NDFFT1),taper(0:NDD)
equivalence (x,cx)
data first/.true./
save cx,first,taper
if(first) then
pi=4.0*atan(1.0)
do i=0,100
taper(i)=0.5*(1.0+cos(i*pi/100))
do i=0,NDD
taper(i)=0.5*(1.0+cos(i*pi/NDD))
enddo
first=.false.
endif
if(newdat) then
! Data in dd have changed, recompute the long FFT
! Data in dd have changed, recompute the long FFT
x(1:NMAX)=dd
x(NMAX+1:NFFT1)=0. !Zero-pad the x array
call four2a(cx,NFFT1,1,-1,0) !r2c FFT to freq domain
x(NMAX+1:NDFFT1)=0. !Zero-pad the x array
call four2a(cx,NDFFT1,1,-1,0) !r2c FFT to freq domain
newdat=.false.
endif
df=12000.0/NFFT1
df=12000.0/NDFFT1
baud=12000.0/NSPS
i0=nint(f0/df)
ft=f0+8.5*baud
it=min(nint(ft/df),NFFT1/2)
it=min(nint(ft/df),NDFFT1/2)
fb=f0-1.5*baud
ib=max(1,nint(fb/df))
k=0
@ -41,11 +43,11 @@ subroutine ft8_downsample(dd,newdat,f0,c1)
c1(k)=cx(i)
k=k+1
enddo
c1(0:100)=c1(0:100)*taper(100:0:-1)
c1(k-1-100:k-1)=c1(k-1-100:k-1)*taper
c1(0:NDD)=c1(0:NDD)*taper(NDD:0:-1)
c1(k-1-NDD:k-1)=c1(k-1-NDD:k-1)*taper
c1=cshift(c1,i0-ib)
call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain
fac=1.0/sqrt(float(NFFT1)*NFFT2)
call four2a(c1,NDFFT2,1,1,1) !c2c FFT back to time domain
fac=1.0/sqrt(float(NDFFT1)*NDFFT2)
c1=fac*c1
return

View File

@ -1,12 +1,27 @@
! LDPC (174,87) code
!parameter (NSPS=480) !Samples per symbol at 12000 S/s
!parameter (NTXDUR=5) !TX Duration in Seconds
!parameter (NDOWNSPS=16) !Downsampled samples per symbol
!parameter (AZ=6.0) !Near dupe sync spacing
!parameter (NDD=136) !Downconverted FFT Bins - 100 Bins
! parameter (NSPS=480, NTXDUR=5, NDOWNSPS=16, NDD=136) ! 200 Hz
! parameter (NSPS=600, NTXDUR=6, NDOWNSPS=24, NDD=120) ! 160 Hz
! parameter (NSPS=1200, NTXDUR=10, NDOWNSPS=24, NDD=100) ! 80 Hz
parameter (NSPS=1920, NTXDUR=15, NDOWNSPS=32, NDD=100) ! 50 Hz
! parameter (NSPS=3840, NTXDUR=30, NDOWNSPS=32, NDD=100) ! 25 Hz
parameter (JZ=62) !Sync Search Space over +/- 2.5s relative to 0.5s TX start time.
parameter (AZ=12000.0/(1.0*NSPS)*0.64d0)
parameter (KK=87) !Information bits (75 + CRC12)
parameter (ND=58) !Data symbols
parameter (NS=21) !Sync symbols (3 @ Costas 7x7)
parameter (NN=NS+ND) !Total channel symbols (79)
parameter (NSPS=1920) !Samples per symbol at 12000 S/s
parameter (NZ=NSPS*NN) !Samples in full 15 s waveform (151,680)
parameter (NMAX=15*12000) !Samples in iwave (180,000)
parameter (NMAX=NTXDUR*12000) !Samples in iwave (180,000)
parameter (NFFT1=2*NSPS, NH1=NFFT1/2) !Length of FFTs for symbol spectra
parameter (NSTEP=NSPS/4) !Rough time-sync step size
parameter (NHSYM=NMAX/NSTEP-3) !Number of symbol spectra (1/4-sym steps)
parameter (NDOWN=60) !Downsample factor
parameter (NDOWN=NSPS/NDOWNSPS) !Downsample factor to 32 samples per symbol

View File

@ -17,7 +17,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
real ps(0:7),psl(0:7)
real bmeta(3*ND),bmetb(3*ND),bmetap(3*ND)
real llr(3*ND),llra(3*ND),llr0(3*ND),llr1(3*ND),llrap(3*ND) !Soft symbols
real dd0(15*12000)
real dd0(NMAX)
integer*1 decoded(KK),decoded0(KK),apmask(3*ND),cw(3*ND)
integer*1 msgbits(KK)
integer apsym(KK)
@ -29,8 +29,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now
integer*1, target:: i1hiscall(12)
complex cd0(0:3199)
complex ctwk(32)
complex csymb(32)
complex ctwk(NDOWNSPS)
complex csymb(NDOWNSPS)
logical first,newdat,lsubtract,lapon,lapcqonly,nagain
equivalence (s1,s1sort)
data icos7/4,2,5,6,1,3,0/
@ -104,7 +104,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
delf=ifr*0.5
dphi=twopi*delf*dt2
phi=0.0
do i=1,32
do i=1,NDOWNSPS
ctwk(i)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
enddo
@ -124,11 +124,11 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
j=0
do k=1,NN
i1=ibest+(k-1)*32
i1=ibest+(k-1)*NDOWNSPS
csymb=cmplx(0.0,0.0)
!if( i1.ge.1 .and. i1+31 .le. NP2 ) csymb=cd0(i1:i1+31)
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
call four2a(csymb,32,1,-1,1)
if( i1.ge.0 .and. i1+(NDOWNSPS-1) .le. NP2-1 ) csymb=cd0(i1:i1+(NDOWNSPS-1))
call four2a(csymb,NDOWNSPS,1,-1,1)
s2(0:7,k)=abs(csymb(1:8))/1e3
enddo
@ -146,6 +146,12 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
enddo
! hard sync sum - max is 21
nsync=is1+is2+is3
! debug
!open(99, file="./js8.log", status="old", position="append", action="write")
!write(99,*) ibest, nsync
!close(99)
if(nsync .le. 6) then ! bail out
call timer('badnsync', 0)
nbadcrc=1
@ -387,7 +393,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
if(lsubtract) call subtractft8(dd0,itone,f1,xdt2)
xsig=0.0
xnoi=0.0
do i=1,79
do i=1,NN
xsig=xsig+s2(itone(i),i)**2
ios=mod(itone(i)+4,7)
xnoi=xnoi+s2(ios,i)**2

View File

@ -1,18 +1,20 @@
subroutine genft8refsig(itone,cref,f0)
complex cref(79*1920)
integer itone(79)
include 'ft8_params.f90'
complex cref(NN*NSPS)
integer itone(NN)
real*8 twopi,phi,dphi,dt,xnsps
data twopi/0.d0/
save twopi
if( twopi .lt. 0.1 ) twopi=8.d0*atan(1.d0)
xnsps=1920.d0
xnsps=NSPS*1.0d0
dt=1.d0/12000.d0
phi=0.d0
k=1
do i=1,79
do i=1,NN
dphi=twopi*(f0*dt+itone(i)/xnsps)
do is=1,1920
do is=1,NSPS
cref(k)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
k=k+1

View File

@ -3,6 +3,8 @@ program ldpcsim174
use crc
use packjt
include 'ft8_params.f90'
character*22 msg,msgsent,msgreceived
character*8 arg
character*6 grid
@ -75,10 +77,10 @@ allocate ( rxdata(N), llr(N) )
ik=0
im=0
do i=1,12
nn=i4Msg6BitWords(i)
nna=i4Msg6BitWords(i)
do j=1, 6
ik=ik+1
i4=i4+i4+iand(1,ishft(nn,j-6))
i4=i4+i4+iand(1,ishft(nna,j-6))
i4=iand(i4,255)
if(ik.eq.8) then
im=im+1
@ -214,7 +216,7 @@ do idb = 20,-10,-1
endif
endif
enddo
baud=12000/1920
baud=12000.0/NSPS
snr2500=db+10.0*log10((baud/2500.0))
pberr=real(nberr)/(real(ntrials*N))
write(*,"(f4.1,4x,f5.1,1x,i8,1x,i8,1x,i8,8x,f5.2,8x,e10.3)") db,snr2500,ngood,nue,nbadcrc,ss,pberr

View File

@ -9,11 +9,13 @@ subroutine subtractft8(dd,itone,f0,dt)
use timer_module, only: timer
parameter (NMAX=15*12000,NFRAME=1920*79)
parameter (NFFT=NMAX,NFILT=1400)
include 'ft8_params.f90'
parameter (NFRAME=NSPS*NN)
parameter (NFFT=NMAX, NFILT=1400)
real*4 dd(NMAX), window(-NFILT/2:NFILT/2)
complex cref,camp,cfilt,cw
integer itone(79)
integer itone(NN)
logical first
data first/.true./
common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX)

View File

@ -1,8 +1,6 @@
subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
include 'ft8_params.f90'
! Search over +/- 2.5s relative to 0.5s TX start time.
parameter (JZ=62)
complex cx(0:NH1)
real s(NH1,NHSYM)
real savg(NH1)
@ -114,7 +112,7 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
if(i.ge.2) then
do j=1,i-1
fdiff=abs(candidate0(1,i))-abs(candidate0(1,j))
if(abs(fdiff).lt.4.0) then
if(abs(fdiff).lt.AZ) then ! note: this dedupe difference is dependent on symbol spacing
if(candidate0(3,i).ge.candidate0(3,j)) candidate0(3,j)=0.
if(candidate0(3,i).lt.candidate0(3,j)) candidate0(3,i)=0.
endif

View File

@ -2,11 +2,13 @@ subroutine sync8d(cd0,i0,ctwk,itwk,sync)
! Compute sync power for a complex, downsampled FT8 signal.
parameter(NP2=2812,NDOWN=60)
include 'ft8_params.f90'
parameter(NP2=2812)
complex cd0(3125)
complex csync(0:6,32)
complex csync2(32)
complex ctwk(32)
complex csync(0:6,NDOWNSPS)
complex csync2(NDOWNSPS)
complex ctwk(NDOWNSPS)
complex z1,z2,z3
logical first
integer icos7(0:6)
@ -21,12 +23,12 @@ subroutine sync8d(cd0,i0,ctwk,itwk,sync)
twopi=8.0*atan(1.0)
fs2=12000.0/NDOWN !Sample rate after downsampling
dt2=1/fs2 !Corresponding sample interval
taus=32*dt2 !Symbol duration
taus=NDOWNSPS*dt2 !Symbol duration
baud=1.0/taus !Keying rate
do i=0,6
phi=0.0
dphi=twopi*icos7(i)*baud*dt2
do j=1,32
do j=1,NDOWNSPS
csync(i,j)=cmplx(cos(phi),sin(phi)) !Waveform for 7x7 Costas array
phi=mod(phi+dphi,twopi)
enddo
@ -35,18 +37,18 @@ subroutine sync8d(cd0,i0,ctwk,itwk,sync)
endif
sync=0
do i=0,6 !Sum over 7 Costas frequencies and
i1=i0+i*32 !three Costas arrays
i2=i1+36*32
i3=i1+72*32
csync2=csync(i,1:32)
do i=0,6 !Sum over 7 Costas frequencies and
i1=i0+i*NDOWNSPS !three Costas arrays
i2=i1+36*NDOWNSPS
i3=i1+72*NDOWNSPS
csync2=csync(i,1:NDOWNSPS)
if(itwk.eq.1) csync2=ctwk*csync2 !Tweak the frequency
z1=0.
z2=0.
z3=0.
if(i1.ge.1 .and. i1+31.le.NP2) z1=sum(cd0(i1:i1+31)*conjg(csync2))
if(i2.ge.1 .and. i2+31.le.NP2) z2=sum(cd0(i2:i2+31)*conjg(csync2))
if(i3.ge.1 .and. i3+31.le.NP2) z3=sum(cd0(i3:i3+31)*conjg(csync2))
if(i1.ge.1 .and. i1+(NDOWNSPS-1).le.NP2) z1=sum(cd0(i1:i1+(NDOWNSPS-1))*conjg(csync2))
if(i2.ge.1 .and. i2+(NDOWNSPS-1).le.NP2) z2=sum(cd0(i2:i2+(NDOWNSPS-1))*conjg(csync2))
if(i3.ge.1 .and. i3+(NDOWNSPS-1).le.NP2) z3=sum(cd0(i3:i3+(NDOWNSPS-1))*conjg(csync2))
sync = sync + p(z1) + p(z2) + p(z3)
enddo

View File

@ -45,12 +45,12 @@ contains
real s(NH1,NHSYM)
real sbase(NH1)
real candidate(3,200)
real dd(15*12000)
real dd(NMAX)
logical, intent(in) :: lft8apon,lapcqonly,nagain
logical newdat,lsubtract,ldupe,bcontest
character*12 mycall12, hiscall12
character*6 mygrid6,hisgrid6
integer*2 iwave(15*12000)
integer*2 iwave(NMAX)
integer apsym(KK)
character datetime*13,message*22,msg37*37
character*22 allmessages(100)
@ -99,11 +99,16 @@ contains
call timer('sync8 ',0)
call sync8(dd,ifa,ifb,syncmin,nfqso,s,candidate,ncand,sbase)
call timer('sync8 ',1)
!open(99, file="./js8.log", status="old", position="append", action="write")
!write(99,*) ncand, "candidates"
!close(99)
do icand=1,ncand
sync=candidate(3,icand)
f1=candidate(1,icand)
xdt=candidate(2,icand)
xbase=10.0**(0.1*(sbase(nint(f1/3.125))-40.0))
xbase=10.0**(0.1*(sbase(nint(f1/(12000.0/NFFT1)))-40.0)) ! 3.125Hz
nsnr0=min(99,nint(10.0*log10(sync) - 25.5)) !### empirical ###
call timer('ft8b ',0)
call ft8b(dd,newdat,nQSOProgress,nfqso,nftx,ndepth,lft8apon, &

View File

@ -2412,7 +2412,7 @@ void MainWindow::fixStop()
} else if (m_mode=="FreqCal"){
m_hsymStop=((int(m_TRperiod/0.288))/8)*8;
} else if (m_mode=="FT8") {
m_hsymStop=50;
m_hsymStop=JS8_SYMBOL_STOP;
}
}
@ -2497,6 +2497,7 @@ void MainWindow::dataSink(qint64 frames)
m_dialFreqRxWSPR=m_freqNominal;
}
//qDebug() << m_ihsym << m_hsymStop;
if(m_ihsym == m_hsymStop) {
if(m_mode=="Echo") {
float snr=0;
@ -4875,7 +4876,7 @@ void MainWindow::guiUpdate()
if(m_TRperiod==0) m_TRperiod=60;
txDuration=0.0;
if(m_modeTx=="FT8") txDuration=1.0 + NUM_FT8_SYMBOLS*1920/12000.0; // FT8
if(m_modeTx=="FT8") txDuration=1.0 + JS8_NUM_SYMBOLS * (double)JS8_SYMBOL_SAMPLES/(double)RX_SAMPLE_RATE; // FT8
double tx1=0.0;
double tx2=txDuration;
@ -6937,7 +6938,7 @@ void MainWindow::on_actionFT8_triggered()
m_nsps=6912;
m_FFTSize = m_nsps / 2;
Q_EMIT FFTSize (m_FFTSize);
m_hsymStop=50;
m_hsymStop=JS8_SYMBOL_STOP;
setup_status_bar (bVHF);
m_toneSpacing=0.0; //???
ui->actionFT8->setChecked(true); //???
@ -6945,7 +6946,7 @@ void MainWindow::on_actionFT8_triggered()
m_wideGraph->setModeTx(m_modeTx);
VHF_features_enabled(bVHF);
ui->cbAutoSeq->setChecked(true);
m_TRperiod=15;
m_TRperiod=JS8_TX_SECONDS;
m_fastGraph->hide();
m_wideGraph->show();
ui->decodedTextLabel2->setText(" UTC dB DT Freq Message");
@ -9045,130 +9046,17 @@ void MainWindow::transmit (double snr)
}
if (m_modeTx == "FT8") {
toneSpacing=12000.0/1920.0;
if(m_config.x2ToneSpacing()) toneSpacing=2*12000.0/1920.0;
if(m_config.x4ToneSpacing()) toneSpacing=4*12000.0/1920.0;
toneSpacing=(double)RX_SAMPLE_RATE/(double)JS8_SYMBOL_SAMPLES;
//if(m_config.x2ToneSpacing()) toneSpacing=2.0*(double)RX_SAMPLE_RATE/(double)JS8_SYMBOL_SAMPLES;
//if(m_config.x4ToneSpacing()) toneSpacing=4.0*(double)RX_SAMPLE_RATE/(double)JS8_SYMBOL_SAMPLES;
if(m_config.bFox() and !m_tune) toneSpacing=-1;
if(TEST_FOX_WAVE_GEN && ui->turboButton->isChecked() && !m_tune) toneSpacing=-1;
Q_EMIT sendMessage (NUM_FT8_SYMBOLS,
1920.0, ui->TxFreqSpinBox->value () - m_XIT,
Q_EMIT sendMessage (JS8_NUM_SYMBOLS,
(double)JS8_SYMBOL_SAMPLES, ui->TxFreqSpinBox->value () - m_XIT,
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
true, false, snr, m_TRperiod);
}
if (m_modeTx == "QRA64") {
if(m_nSubMode==0) toneSpacing=12000.0/6912.0;
if(m_nSubMode==1) toneSpacing=2*12000.0/6912.0;
if(m_nSubMode==2) toneSpacing=4*12000.0/6912.0;
if(m_nSubMode==3) toneSpacing=8*12000.0/6912.0;
if(m_nSubMode==4) toneSpacing=16*12000.0/6912.0;
Q_EMIT sendMessage (NUM_QRA64_SYMBOLS,
6912.0, ui->TxFreqSpinBox->value () - m_XIT,
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
true, false, snr, m_TRperiod);
}
if (m_modeTx == "JT9") {
int nsub=pow(2,m_nSubMode);
int nsps[]={480,240,120,60};
double sps=m_nsps;
m_toneSpacing=nsub*12000.0/6912.0;
if(m_config.x2ToneSpacing()) m_toneSpacing=2.0*m_toneSpacing;
if(m_config.x4ToneSpacing()) m_toneSpacing=4.0*m_toneSpacing;
bool fastmode=false;
if(m_bFast9 and (m_nSubMode>=4)) {
fastmode=true;
sps=nsps[m_nSubMode-4];
m_toneSpacing=12000.0/sps;
}
Q_EMIT sendMessage (NUM_JT9_SYMBOLS, sps,
ui->TxFreqSpinBox->value() - m_XIT, m_toneSpacing,
m_soundOutput, m_config.audio_output_channel (),
true, fastmode, snr, m_TRperiod);
}
if (m_modeTx == "MSK144") {
m_nsps=6;
double f0=1000.0;
if(!m_bFastMode) {
m_nsps=192;
f0=ui->TxFreqSpinBox->value () - m_XIT - 0.5*m_toneSpacing;
}
m_toneSpacing=6000.0/m_nsps;
m_FFTSize = 7 * 512;
Q_EMIT FFTSize (m_FFTSize);
int nsym;
nsym=NUM_MSK144_SYMBOLS;
if(itone[40] < 0) nsym=40;
Q_EMIT sendMessage (nsym, double(m_nsps), f0, m_toneSpacing,
m_soundOutput, m_config.audio_output_channel (),
true, true, snr, m_TRperiod);
}
if (m_modeTx == "JT4") {
if(m_nSubMode==0) toneSpacing=4.375;
if(m_nSubMode==1) toneSpacing=2*4.375;
if(m_nSubMode==2) toneSpacing=4*4.375;
if(m_nSubMode==3) toneSpacing=9*4.375;
if(m_nSubMode==4) toneSpacing=18*4.375;
if(m_nSubMode==5) toneSpacing=36*4.375;
if(m_nSubMode==6) toneSpacing=72*4.375;
Q_EMIT sendMessage (NUM_JT4_SYMBOLS,
2520.0*12000.0/11025.0, ui->TxFreqSpinBox->value () - m_XIT,
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
true, false, snr, m_TRperiod);
}
if (m_mode=="WSPR") {
int nToneSpacing=1;
if(m_config.x2ToneSpacing()) nToneSpacing=2;
if(m_config.x4ToneSpacing()) nToneSpacing=4;
Q_EMIT sendMessage (NUM_WSPR_SYMBOLS, 8192.0,
ui->TxFreqSpinBox->value() - 1.5 * 12000 / 8192,
m_toneSpacing*nToneSpacing, m_soundOutput,
m_config.audio_output_channel(),true, false, snr,
m_TRperiod);
}
if (m_mode=="WSPR-LF") {
Q_EMIT sendMessage (NUM_WSPR_LF_SYMBOLS, 24576.0,
ui->TxFreqSpinBox->value(),
m_toneSpacing, m_soundOutput,
m_config.audio_output_channel(),true, false, snr,
m_TRperiod);
}
if(m_mode=="Echo") {
//??? should use "fastMode = true" here ???
Q_EMIT sendMessage (27, 1024.0, 1500.0, 0.0, m_soundOutput,
m_config.audio_output_channel(),
false, false, snr, m_TRperiod);
}
if(m_mode=="ISCAT") {
double sps,f0;
if(m_nSubMode==0) {
sps=512.0*12000.0/11025.0;
toneSpacing=11025.0/512.0;
f0=47*toneSpacing;
} else {
sps=256.0*12000.0/11025.0;
toneSpacing=11025.0/256.0;
f0=13*toneSpacing;
}
Q_EMIT sendMessage (NUM_ISCAT_SYMBOLS, sps, f0, toneSpacing, m_soundOutput,
m_config.audio_output_channel(),
true, true, snr, m_TRperiod);
}
// In auto-sequencing mode, stop after 5 transmissions of "73" message.
if (m_bFastMode || m_bFast9) {
if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked ()) {
if(m_ntx==5) {
m_nTx73 += 1;
} else {
m_nTx73=0;
}
}
}
}
void MainWindow::on_outAttenuation_valueChanged (int a)
@ -9653,10 +9541,11 @@ void MainWindow::updateTextWordCheckerDisplay(){
}
void MainWindow::updateTextStatsDisplay(QString text, int count){
const double fpm = 60.0/JS8_TX_SECONDS;
if(count > 0){
auto words = text.split(" ", QString::SkipEmptyParts).length();
auto wpm = QString::number(words/(count/4.0), 'f', 1);
auto cpm = QString::number(text.length()/(count/4.0), 'f', 1);
auto wpm = QString::number(words/(count/fpm), 'f', 1);
auto cpm = QString::number(text.length()/(count/fpm), 'f', 1);
wpm_label.setText(QString("%1wpm / %2cpm").arg(wpm).arg(cpm));
wpm_label.setVisible(true);
} else {
@ -12014,7 +11903,7 @@ void MainWindow::emitTones(){
// emit tone numbers to network
QVariantList t;
for(int i = 0; i < NUM_FT8_SYMBOLS; i++){
for(int i = 0; i < JS8_NUM_SYMBOLS; i++){
t.append(QVariant((int)itone[i]));
}

View File

@ -57,7 +57,7 @@
#define NUM_ISCAT_SYMBOLS 1291 //30*11025/256
#define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80
#define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync
#define NUM_FT8_SYMBOLS 79 // 12.6 seconds, 15 seconds would be 93.75 symbols
#define NUM_CW_SYMBOLS 250
#define TX_SAMPLE_RATE 48000
#define N_WIDGETS 33

View File

@ -411,9 +411,7 @@ void CPlotter::DrawOverlay() //DrawOverlay()
}
}
float bw=9.0*12000.0/m_nsps; //JT9
if(m_mode=="FT8") bw=7*12000.0/1920.0; //FT8
float bw=7.0*(double)RX_SAMPLE_RATE/(double)JS8_SYMBOL_SAMPLES; //JS8
painter0.setPen(penGreen);