diff --git a/commons.h b/commons.h index 24441ea06..f53bfff99 100644 --- a/commons.h +++ b/commons.h @@ -85,7 +85,7 @@ extern struct { } echocom_; extern struct { - float wave[606720]; + float wave[14278656]; int nslots; int nfreq; int i3bit[5]; diff --git a/lib/fst280/gen_fst280wave.f90 b/lib/fst280/gen_fst280wave.f90 index 7905544ef..944e06a36 100644 --- a/lib/fst280/gen_fst280wave.f90 +++ b/lib/fst280/gen_fst280wave.f90 @@ -1,4 +1,5 @@ -subroutine gen_fst280wave(itone,nsym,nsps,nwave,fsample,hmod,f0,icmplx,cwave,wave) +subroutine gen_fst280wave(itone,nsym,nsps,nwave,fsample,hmod,f0, & + icmplx,cwave,wave) real wave(nwave) complex cwave(nwave) @@ -11,7 +12,7 @@ subroutine gen_fst280wave(itone,nsym,nsps,nwave,fsample,hmod,f0,icmplx,cwave,wav save first,twopi,dt,tsym if(first) then - allocate( pulse(3*nsps*fsample) ) + allocate(pulse(3*nsps*int(fsample))) twopi=8.0*atan(1.0) dt=1.0/fsample tsym=nsps/fsample diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f6dce34af..cf5f39494 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -105,12 +105,18 @@ extern "C" { void genft4_(char* msg, int* ichk, char* msgsent, char ft4msgbits[], int itone[], fortran_charlen_t, fortran_charlen_t); + void genfst280_(char* msg, int* ichk, char* msgsent, char fst280msgbits[], + int itone[], int* iwspr, fortran_charlen_t, fortran_charlen_t); + void gen_ft8wave_(int itone[], int* nsym, int* nsps, float* bt, float* fsample, float* f0, float xjunk[], float wave[], int* icmplx, int* nwave); void gen_ft4wave_(int itone[], int* nsym, int* nsps, float* fsample, float* f0, float xjunk[], float wave[], int* icmplx, int* nwave); + void gen_fst280wave_(int itone[], int* nsym, int* nsps, int* nwave, float* fsample, + int* hmod, float* f0, int* icmplx, float xjunk[], float wave[]); + void gen4_(char* msg, int* ichk, char* msgsent, int itone[], int* itext, fortran_charlen_t, fortran_charlen_t); @@ -3801,7 +3807,8 @@ void MainWindow::guiUpdate() &m_currentMessageType, 22, 22); if(m_modeTx=="WSPR") genwspr_(message, msgsent, const_cast (itone), 22, 22); - if(m_modeTx=="MSK144" or m_modeTx=="FT8" or m_modeTx=="FT4") { + if(m_modeTx=="MSK144" or m_modeTx=="FT8" or m_modeTx=="FT4" + or m_modeTx=="FST280" or m_modeTx=="FST280W") { char MyCall[6]; char MyGrid[6]; ::memcpy(MyCall, (m_config.my_callsign()+" ").toLatin1(), sizeof MyCall); @@ -3862,8 +3869,26 @@ void MainWindow::guiUpdate() foxcom_.wave,&icmplx,&nwave); } if(m_modeTx=="FST280" or m_modeTx=="FST280W") { - // call genfst280() - // call gen_fst280wave() + int ichk=0; + int iwspr=0; + char fst280msgbits[101]; + genfst280_(message,&ichk,msgsent,const_cast (fst280msgbits), + const_cast(itone), &iwspr, 37, 37); + int hmod=int(pow(2.0,double(m_nSubMode))); + int nsps=800; + if(m_TRperiod==30) nsps=1680; + if(m_TRperiod==60) nsps=4000; + if(m_TRperiod==120) nsps=8400; + if(m_TRperiod==300) nsps=21504; + nsps=4*nsps; //48000 Hz sampling + int nsym=164; + float fsample=48000.0; + float dfreq=hmod*fsample/nsps; + float f0=ui->TxFreqSpinBox->value() - m_XIT + 1.5*dfreq; + int nwave=(nsym+2)*nsps; + int icmplx=0; + gen_fst280wave_(const_cast(itone),&nsym,&nsps,&nwave, + &fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave); } if(SpecOp::EU_VHF==m_config.special_op_id()) { @@ -7140,6 +7165,22 @@ void MainWindow::transmit (double snr) true, false, snr, m_TRperiod); } + if (m_modeTx == "FST280" or m_modeTx == "FST280W") { + m_dateTimeSentTx3=QDateTime::currentDateTimeUtc(); + toneSpacing=-2.0; //Transmit a pre-computed, filtered waveform. + int nsps=800; + if(m_TRperiod==30) nsps=1680; + if(m_TRperiod==60) nsps=4000; + if(m_TRperiod==120) nsps=8400; + if(m_TRperiod==300) nsps=21504; + int hmod=int(pow(2.0,double(m_nSubMode))); + double dfreq=hmod*12000.0/nsps; + double f0=ui->TxFreqSpinBox->value() - m_XIT + 1.5*dfreq; + Q_EMIT sendMessage (NUM_FST280_SYMBOLS,double(nsps),f0,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; diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 779d76da4..ac8c22d15 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -49,6 +49,7 @@ #define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync #define NUM_FT8_SYMBOLS 79 #define NUM_FT4_SYMBOLS 105 +#define NUM_FST280_SYMBOLS 164 //280/2 data + 6*4 sync #define NUM_CW_SYMBOLS 250 #define TX_SAMPLE_RATE 48000 #define N_WIDGETS 33 diff --git a/wsjtx.pro b/wsjtx.pro index 02a69d33c..d8d2b0949 100644 --- a/wsjtx.pro +++ b/wsjtx.pro @@ -54,6 +54,7 @@ include(logbook/logbook.pri) include(widgets/widgets.pri) include(Decoder/decodedtext.pri) include(Detector/Detector.pri) +include(Modulator/Modulator.pri) SOURCES += \ Radio.cpp NetworkServerLookup.cpp revision_utils.cpp \