mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-25 10:00:23 -04:00 
			
		
		
		
	Clean up some timing issues with time-synchronized FT4.
This commit is contained in:
		
							parent
							
								
									888b5fee28
								
							
						
					
					
						commit
						fd239d9c07
					
				| @ -92,11 +92,9 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, | |||||||
|   if (synchronize && !m_tuning && !m_bFastMode)	{ |   if (synchronize && !m_tuning && !m_bFastMode)	{ | ||||||
|     m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000)); |     m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000)); | ||||||
|   } |   } | ||||||
|   if((symbolsLength==103 or symbolsLength==105) and framesPerSymbol==512 |   if(symbolsLength==105 and framesPerSymbol==512 | ||||||
|      and (toneSpacing==12000.0/512.0 or toneSpacing==-2.0)) { |      and (toneSpacing==12000.0/512.0 or toneSpacing==-2.0)) { | ||||||
| //### FT4 parameters
 | //### FT4 parameters
 | ||||||
|     delay_ms=100; |  | ||||||
|     mstr=5000; |  | ||||||
|     m_ic=0; |     m_ic=0; | ||||||
|     m_silentFrames=0; |     m_silentFrames=0; | ||||||
|   } |   } | ||||||
| @ -159,6 +157,8 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|   qint16 * end (samples + numFrames * (bytesPerFrame () / sizeof (qint16))); |   qint16 * end (samples + numFrames * (bytesPerFrame () / sizeof (qint16))); | ||||||
|   qint64 framesGenerated (0); |   qint64 framesGenerated (0); | ||||||
| 
 | 
 | ||||||
|  | //  if(m_ic==0) qDebug() << "Modulator::readData" << 0.001*(QDateTime::currentMSecsSinceEpoch() % (1000*m_TRperiod));
 | ||||||
|  | 
 | ||||||
|   switch (m_state) |   switch (m_state) | ||||||
|     { |     { | ||||||
|     case Synchronizing: |     case Synchronizing: | ||||||
| @ -180,8 +180,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|     case Active: |     case Active: | ||||||
|       { |       { | ||||||
|         unsigned int isym=0; |         unsigned int isym=0; | ||||||
| //        qDebug() << "Mod A" << m_toneSpacing << m_frequency << m_nsps
 | 
 | ||||||
| //                 << m_ic << m_symbolsLength << icw[0];
 |  | ||||||
|         if(!m_tuning) isym=m_ic/(4.0*m_nsps);            // Actual fsample=48000
 |         if(!m_tuning) isym=m_ic/(4.0*m_nsps);            // Actual fsample=48000
 | ||||||
|         bool slowCwId=((isym >= m_symbolsLength) && (icw[0] > 0)) && (!m_bFastMode); |         bool slowCwId=((isym >= m_symbolsLength) && (icw[0] > 0)) && (!m_bFastMode); | ||||||
|         if(m_TRperiod==3) slowCwId=false; |         if(m_TRperiod==3) slowCwId=false; | ||||||
| @ -192,6 +191,8 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|         if(m_bFastMode and (icw[0]>0) and (tsec>(m_TRperiod-5.0))) fastCwId=true; |         if(m_bFastMode and (icw[0]>0) and (tsec>(m_TRperiod-5.0))) fastCwId=true; | ||||||
|         if(!m_bFastMode) m_nspd=2560;                 // 22.5 WPM
 |         if(!m_bFastMode) m_nspd=2560;                 // 22.5 WPM
 | ||||||
| 
 | 
 | ||||||
|  | //        qDebug() << "Mod A" << m_ic << isym << tsec;
 | ||||||
|  | 
 | ||||||
|         if(slowCwId or fastCwId) {     // Transmit CW ID?
 |         if(slowCwId or fastCwId) {     // Transmit CW ID?
 | ||||||
|           m_dphi = m_twoPi*m_frequency/m_frameRate; |           m_dphi = m_twoPi*m_frequency/m_frameRate; | ||||||
|           if(m_bFastMode and !bCwId) { |           if(m_bFastMode and !bCwId) { | ||||||
| @ -263,10 +264,10 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         qint16 sample; |         qint16 sample; | ||||||
|  | 
 | ||||||
|         for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) { |         for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) { | ||||||
|           isym=0; |           isym=0; | ||||||
|           if(!m_tuning and m_TRperiod!=3) isym=m_ic / (4.0 * m_nsps);         //Actual
 |           if(!m_tuning and m_TRperiod!=3) isym=m_ic/(4.0*m_nsps);   //Actual fsample=48000
 | ||||||
|                                                                               //fsample=48000
 |  | ||||||
|           if(m_bFastMode) isym=isym%m_symbolsLength; |           if(m_bFastMode) isym=isym%m_symbolsLength; | ||||||
|           if (isym != m_isym0 || m_frequency != m_frequency0) { |           if (isym != m_isym0 || m_frequency != m_frequency0) { | ||||||
|             if(itone[0]>=100) { |             if(itone[0]>=100) { | ||||||
| @ -278,8 +279,6 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|                 m_toneFrequency0=m_frequency + itone[isym]*m_toneSpacing; |                 m_toneFrequency0=m_frequency + itone[isym]*m_toneSpacing; | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
| //            qDebug() << "Mod B" << m_bFastMode << m_ic << numFrames << isym << itone[isym]
 |  | ||||||
| //                     << m_toneFrequency0 << m_nsps;
 |  | ||||||
|             m_dphi = m_twoPi * m_toneFrequency0 / m_frameRate; |             m_dphi = m_twoPi * m_toneFrequency0 / m_frameRate; | ||||||
|             m_isym0 = isym; |             m_isym0 = isym; | ||||||
|             m_frequency0 = m_frequency;         //???
 |             m_frequency0 = m_frequency;         //???
 | ||||||
| @ -302,10 +301,10 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|           sample=qRound(m_amp*qSin(m_phi)); |           sample=qRound(m_amp*qSin(m_phi)); | ||||||
| 
 | 
 | ||||||
| //Here's where we transmit from a precomputed wave[] array:
 | //Here's where we transmit from a precomputed wave[] array:
 | ||||||
|           if(!m_tuning and (m_toneSpacing < 0)) sample=qRound(m_amp*foxcom_.wave[m_ic]); |           if(!m_tuning and (m_toneSpacing < 0)) { | ||||||
| //          if(m_ic < 10) qDebug() << "Mod Tx" << m_ic << m_amp
 |             m_amp=32767.0; | ||||||
| //                                  << foxcom_.wave[m_ic] << sample
 |             sample=qRound(m_amp*foxcom_.wave[m_ic]); | ||||||
| //                                  << m_toneSpacing;
 |           } | ||||||
| 
 | 
 | ||||||
|           samples = load(postProcessSample(sample), samples); |           samples = load(postProcessSample(sample), samples); | ||||||
|           ++framesGenerated; |           ++framesGenerated; | ||||||
| @ -322,9 +321,9 @@ qint64 Modulator::readData (char * data, qint64 maxSize) | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         m_frequency0 = m_frequency; |         m_frequency0 = m_frequency; | ||||||
|         // done for this chunk - continue on next call
 | // done for this chunk - continue on next call
 | ||||||
| //        qint64 ms1=QDateTime::currentMSecsSinceEpoch() - m_ms0;
 | 
 | ||||||
| //        if(m_ic>=4*144*160) qDebug() << "Modulator finished" << m_ic << 0.001*ms1;
 | //        qDebug() << "Mod B" << m_ic << i1 << 0.001*(QDateTime::currentMSecsSinceEpoch() % (1000*m_TRperiod));
 | ||||||
| 
 | 
 | ||||||
|         while (samples != end)  // pad block with silence
 |         while (samples != end)  // pad block with silence
 | ||||||
|           { |           { | ||||||
|  | |||||||
| @ -1331,7 +1331,7 @@ void MainWindow::fixStop() | |||||||
|   } else if (m_mode=="FT8") { |   } else if (m_mode=="FT8") { | ||||||
|     m_hsymStop=50; |     m_hsymStop=50; | ||||||
|   } else if (m_mode=="FT4") { |   } else if (m_mode=="FT4") { | ||||||
|   m_hsymStop=17; |   m_hsymStop=18; | ||||||
| } | } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -1340,8 +1340,7 @@ void MainWindow::dataSink(qint64 frames) | |||||||
| { | { | ||||||
|   static float s[NSMAX]; |   static float s[NSMAX]; | ||||||
|   char line[80]; |   char line[80]; | ||||||
| 
 |   int k(frames); | ||||||
|   int k (frames); |  | ||||||
|   QString fname {QDir::toNativeSeparators(m_config.writeable_data_dir ().absoluteFilePath ("refspec.dat"))}; |   QString fname {QDir::toNativeSeparators(m_config.writeable_data_dir ().absoluteFilePath ("refspec.dat"))}; | ||||||
|   QByteArray bafname = fname.toLatin1(); |   QByteArray bafname = fname.toLatin1(); | ||||||
|   const char *c_fname = bafname.data(); |   const char *c_fname = bafname.data(); | ||||||
| @ -3396,7 +3395,7 @@ void MainWindow::guiUpdate() | |||||||
| 
 | 
 | ||||||
|   if(m_TRperiod==0) m_TRperiod=60; |   if(m_TRperiod==0) m_TRperiod=60; | ||||||
|   txDuration=0.0; |   txDuration=0.0; | ||||||
|   if(m_modeTx=="FT4")  txDuration=0.25 + 103*512/12000.0;      // FT4
 |   if(m_modeTx=="FT4")  txDuration=0.35 + 105*512/12000.0;     // FT4
 | ||||||
|   if(m_modeTx=="FT8")  txDuration=1.0 + 79*1920/12000.0;      // FT8
 |   if(m_modeTx=="FT8")  txDuration=1.0 + 79*1920/12000.0;      // FT8
 | ||||||
|   if(m_modeTx=="JT4")  txDuration=1.0 + 207.0*2520/11025.0;   // JT4
 |   if(m_modeTx=="JT4")  txDuration=1.0 + 207.0*2520/11025.0;   // JT4
 | ||||||
|   if(m_modeTx=="JT9")  txDuration=1.0 + 85.0*m_nsps/12000.0;  // JT9
 |   if(m_modeTx=="JT9")  txDuration=1.0 + 85.0*m_nsps/12000.0;  // JT9
 | ||||||
| @ -5650,7 +5649,7 @@ void MainWindow::on_actionFT4_triggered() | |||||||
|   m_nsps=6912; |   m_nsps=6912; | ||||||
|   m_FFTSize = m_nsps/2; |   m_FFTSize = m_nsps/2; | ||||||
|   Q_EMIT FFTSize (m_FFTSize); |   Q_EMIT FFTSize (m_FFTSize); | ||||||
|   m_hsymStop=17; |   m_hsymStop=18; | ||||||
|   setup_status_bar (bVHF); |   setup_status_bar (bVHF); | ||||||
|   m_toneSpacing=12000.0/512.0; |   m_toneSpacing=12000.0/512.0; | ||||||
|   ui->actionFT4->setChecked(true); |   ui->actionFT4->setChecked(true); | ||||||
| @ -6787,18 +6786,17 @@ void MainWindow::setFreq4(int rxFreq, int txFreq) | |||||||
| 
 | 
 | ||||||
| void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s) | void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s) | ||||||
| { | { | ||||||
|   // qDebug () << "MainWindow::handle_transceiver_update:" << s;
 |  | ||||||
|   Transceiver::TransceiverState old_state {m_rigState}; |   Transceiver::TransceiverState old_state {m_rigState}; | ||||||
|   //transmitDisplay (s.ptt ());
 |   //transmitDisplay (s.ptt ());
 | ||||||
|   if (s.ptt () && !m_rigState.ptt ()) // safe to start audio
 |   if (s.ptt () && !m_rigState.ptt ()) { // safe to start audio
 | ||||||
|                                       // (caveat - DX Lab Suite Commander)
 |                                         // (caveat - DX Lab Suite Commander)
 | ||||||
|     { |     if (m_tx_when_ready && g_iptt) {    // waiting to Tx and still needed
 | ||||||
|       if (m_tx_when_ready && g_iptt) // waiting to Tx and still needed
 |       int ms_delay=1000*m_config.txDelay(); | ||||||
|         { |       if(m_mode=="FT4") ms_delay=20; | ||||||
|           ptt1Timer.start(1000 * m_config.txDelay ()); //Start-of-transmission sequencer delay
 |       ptt1Timer.start(ms_delay); //Start-of-transmission sequencer delay
 | ||||||
|         } |  | ||||||
|       m_tx_when_ready = false; |  | ||||||
|     } |     } | ||||||
|  |     m_tx_when_ready = false; | ||||||
|  |   } | ||||||
|   m_rigState = s; |   m_rigState = s; | ||||||
|   auto old_freqNominal = m_freqNominal; |   auto old_freqNominal = m_freqNominal; | ||||||
|   if (!old_freqNominal) |   if (!old_freqNominal) | ||||||
|  | |||||||
| @ -46,7 +46,7 @@ | |||||||
| #define NUM_MSK144_SYMBOLS 144             //s8 + d48 + s8 + d80
 | #define NUM_MSK144_SYMBOLS 144             //s8 + d48 + s8 + d80
 | ||||||
| #define NUM_QRA64_SYMBOLS 84               //63 data + 21 sync
 | #define NUM_QRA64_SYMBOLS 84               //63 data + 21 sync
 | ||||||
| #define NUM_FT8_SYMBOLS 79 | #define NUM_FT8_SYMBOLS 79 | ||||||
| #define NUM_FT4_SYMBOLS 103 | #define NUM_FT4_SYMBOLS 105 | ||||||
| #define NUM_CW_SYMBOLS 250 | #define NUM_CW_SYMBOLS 250 | ||||||
| #define TX_SAMPLE_RATE 48000 | #define TX_SAMPLE_RATE 48000 | ||||||
| #define N_WIDGETS 33 | #define N_WIDGETS 33 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user