mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-02-03 09:44:01 -05:00
FreeDV modulator: implemented all modes
This commit is contained in:
parent
9cc8c836ef
commit
6b34a913fd
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user