FreeDV modulator: implemented all modes

pull/304/head
f4exb 2019-02-24 05:08:41 +01:00
rodzic 9cc8c836ef
commit 6b34a913fd
3 zmienionych plików z 32 dodań i 39 usunięć

Wyświetl plik

@ -57,7 +57,8 @@ FreeDVMod::FreeDVMod(DeviceSinkAPI *deviceAPI) :
ChannelSourceAPI(m_channelIdURI),
m_deviceAPI(deviceAPI),
m_basebandSampleRate(48000),
m_outputSampleRate(48000), // default 2400A mode
m_outputSampleRate(48000),
m_modemSampleRate(48000), // // default 2400A mode
m_inputFrequencyOffset(0),
m_lowCutoff(0.0),
m_hiCutoff(6000.0),
@ -107,14 +108,14 @@ FreeDVMod::FreeDVMod(DeviceSinkAPI *deviceAPI) :
m_cwKeyer.setWPM(13);
m_cwKeyer.setMode(CWKeyerSettings::CWNone);
applyChannelSettings(m_basebandSampleRate, m_outputSampleRate, m_inputFrequencyOffset, true);
applySettings(m_settings, true);
m_channelizer = new UpChannelizer(this);
m_threadedChannelizer = new ThreadedBasebandSampleSource(m_channelizer, this);
m_deviceAPI->addThreadedSource(m_threadedChannelizer);
m_deviceAPI->addChannelAPI(this);
applySettings(m_settings, true);
applyChannelSettings(m_basebandSampleRate, m_outputSampleRate, m_inputFrequencyOffset, true);
m_networkManager = new QNetworkAccessManager();
connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
}
@ -519,33 +520,8 @@ void FreeDVMod::seekFileStream(int seekPercentage)
void FreeDVMod::applyAudioSampleRate(int sampleRate)
{
qDebug("FreeDVMod::applyAudioSampleRate: %d", sampleRate);
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
sampleRate, m_settings.m_inputFrequencyOffset);
m_inputMessageQueue.push(channelConfigMsg);
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) sampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, sampleRate, m_hiCutoff, 3.0);
m_SSBFilter->create_filter(m_lowCutoff / sampleRate, m_hiCutoff / sampleRate);
m_toneNco.setFreq(m_settings.m_toneFrequency, sampleRate);
m_cwKeyer.setSampleRate(sampleRate);
m_settingsMutex.unlock();
// TODO: put up simple IIR interpolator when sampleRate < m_modemSampleRate
m_audioSampleRate = sampleRate;
if (getMessageQueueToGUI())
{
DSPConfigureAudio *cfg = new DSPConfigureAudio(m_audioSampleRate);
getMessageQueueToGUI()->push(cfg);
}
}
void FreeDVMod::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset, bool force)
@ -568,8 +544,8 @@ void FreeDVMod::applyChannelSettings(int basebandSampleRate, int outputSampleRat
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) m_audioSampleRate / (Real) outputSampleRate;
m_interpolator.create(48, m_audioSampleRate, m_hiCutoff, 3.0);
m_interpolatorDistance = (Real) m_modemSampleRate / (Real) outputSampleRate;
m_interpolator.create(48, m_modemSampleRate, m_hiCutoff, 3.0);
m_settingsMutex.unlock();
}
@ -582,16 +558,30 @@ void FreeDVMod::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode)
{
m_hiCutoff = FreeDVModSettings::getHiCutoff(mode);
m_lowCutoff = FreeDVModSettings::getLowCutoff(mode);
int modemSampleRate = FreeDVModSettings::getModSampleRate(mode);
m_settingsMutex.lock();
// baseband interpolator and filter
if (modemSampleRate != m_modemSampleRate)
{
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
modemSampleRate, m_settings.m_inputFrequencyOffset);
m_inputMessageQueue.push(channelConfigMsg);
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) m_audioSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, m_audioSampleRate, m_hiCutoff, 3.0);
m_SSBFilter->create_filter(m_lowCutoff / m_audioSampleRate, m_hiCutoff / m_audioSampleRate);
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) modemSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, modemSampleRate, m_hiCutoff, 3.0);
m_SSBFilter->create_filter(m_lowCutoff / modemSampleRate, m_hiCutoff / modemSampleRate);
m_modemSampleRate = modemSampleRate;
if (getMessageQueueToGUI())
{
DSPConfigureAudio *cfg = new DSPConfigureAudio(m_modemSampleRate);
getMessageQueueToGUI()->push(cfg);
}
}
// FreeDV object
@ -659,6 +649,7 @@ void FreeDVMod::applyFreeDVMode(FreeDVModSettings::FreeDVMode mode)
qDebug() << "FreeDVMod::applyFreeDVMode:"
<< " fdv_mode: " << fdv_mode
<< " m_modemSampleRate: " << m_modemSampleRate
<< " Fs: " << Fs
<< " Rs: " << Rs
<< " m_nSpeechSamples: " << m_nSpeechSamples

Wyświetl plik

@ -236,6 +236,7 @@ public:
QString& errorMessage);
uint32_t getAudioSampleRate() const { return m_audioSampleRate; }
uint32_t getModemSampleRate() const { return m_modemSampleRate; }
double getMagSq() const { return m_magsq; }
Real getLowCutoff() const { return m_lowCutoff; }
Real getHiCutoff() const { return m_hiCutoff; }
@ -267,6 +268,7 @@ private:
int m_basebandSampleRate;
int m_outputSampleRate;
int m_modemSampleRate;
int m_inputFrequencyOffset;
Real m_lowCutoff;
Real m_hiCutoff;

Wyświetl plik

@ -416,8 +416,8 @@ void FreeDVModGUI::applySettings(bool force)
void FreeDVModGUI::applyBandwidths(int spanLog2, bool force)
{
m_spectrumRate = m_freeDVMod->getAudioSampleRate() / (1<<spanLog2);
int bwMax = m_freeDVMod->getAudioSampleRate() / (100*(1<<spanLog2));
m_spectrumRate = m_freeDVMod->getModemSampleRate() / (1<<spanLog2);
int bwMax = m_freeDVMod->getModemSampleRate() / (100*(1<<spanLog2));
int tickInterval = m_spectrumRate / 1200;
tickInterval = tickInterval == 0 ? 1 : tickInterval;