mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-05 16:32:25 -04:00
Tx ph.2: UpChannelizer: interpolator (1) draft
This commit is contained in:
parent
1f58b6ece7
commit
e9f0bb0d45
@ -327,7 +327,7 @@ void FileSinkGui::tick()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int FileSinkSampleRates::m_rates[] = {32, 36, 48, 64, 72};
|
unsigned int FileSinkSampleRates::m_rates[] = {32, 48, 64, 72, 128};
|
||||||
unsigned int FileSinkSampleRates::m_nb_rates = 5;
|
unsigned int FileSinkSampleRates::m_nb_rates = 5;
|
||||||
|
|
||||||
unsigned int FileSinkSampleRates::getRate(unsigned int rate_index)
|
unsigned int FileSinkSampleRates::getRate(unsigned int rate_index)
|
||||||
|
@ -376,7 +376,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// upsample by 2, from upper half of original spectrum
|
// upsample by 2, move original spectrum to upper half
|
||||||
bool workInterpolateUpperHalf(Sample* sampleIn, Sample *sampleOut)
|
bool workInterpolateUpperHalf(Sample* sampleIn, Sample *sampleOut)
|
||||||
{
|
{
|
||||||
switch(m_state)
|
switch(m_state)
|
||||||
@ -400,8 +400,8 @@ public:
|
|||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
// insert sample into ring-buffer
|
// insert sample into ring-buffer
|
||||||
m_samples[m_ptr][0] = -sampleIn->real();
|
m_samples[m_ptr][0] = sampleIn->imag();
|
||||||
m_samples[m_ptr][1] = -sampleIn->imag();
|
m_samples[m_ptr][1] = -sampleIn->real();
|
||||||
|
|
||||||
// save result
|
// save result
|
||||||
doFIR(sampleOut);
|
doFIR(sampleOut);
|
||||||
@ -432,10 +432,78 @@ public:
|
|||||||
// tell caller we didn't consume the sample
|
// tell caller we didn't consume the sample
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
// insert sample into ring-buffer
|
||||||
|
m_samples[m_ptr][0] = -sampleIn->real();
|
||||||
|
m_samples[m_ptr][1] = -sampleIn->imag();
|
||||||
|
|
||||||
|
// save result
|
||||||
|
doFIR(sampleOut);
|
||||||
|
|
||||||
|
// advance write-pointer
|
||||||
|
m_ptr = (m_ptr + HB_FILTERORDER) % (HB_FILTERORDER + 1);
|
||||||
|
|
||||||
|
// next state
|
||||||
|
m_state = 4;
|
||||||
|
|
||||||
|
// tell caller we consumed the sample
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
// insert sample into ring-buffer
|
||||||
|
m_samples[m_ptr][0] = 0;
|
||||||
|
m_samples[m_ptr][1] = 0;
|
||||||
|
|
||||||
|
// save result
|
||||||
|
doFIR(sampleOut);
|
||||||
|
|
||||||
|
// advance write-pointer
|
||||||
|
m_ptr = (m_ptr + HB_FILTERORDER) % (HB_FILTERORDER + 1);
|
||||||
|
|
||||||
|
// next state
|
||||||
|
m_state = 5;
|
||||||
|
|
||||||
|
// tell caller we didn't consume the sample
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
// insert sample into ring-buffer
|
||||||
|
m_samples[m_ptr][0] = -sampleIn->imag();
|
||||||
|
m_samples[m_ptr][1] = sampleIn->real();
|
||||||
|
|
||||||
|
// save result
|
||||||
|
doFIR(sampleOut);
|
||||||
|
|
||||||
|
// advance write-pointer
|
||||||
|
m_ptr = (m_ptr + HB_FILTERORDER) % (HB_FILTERORDER + 1);
|
||||||
|
|
||||||
|
// next state
|
||||||
|
m_state = 6;
|
||||||
|
|
||||||
|
// tell caller we consumed the sample
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
// insert sample into ring-buffer
|
||||||
|
m_samples[m_ptr][0] = 0;
|
||||||
|
m_samples[m_ptr][1] = 0;
|
||||||
|
|
||||||
|
// save result
|
||||||
|
doFIR(sampleOut);
|
||||||
|
|
||||||
|
// advance write-pointer
|
||||||
|
m_ptr = (m_ptr + HB_FILTERORDER) % (HB_FILTERORDER + 1);
|
||||||
|
|
||||||
|
// next state
|
||||||
|
m_state = 7;
|
||||||
|
|
||||||
|
// tell caller we didn't consume the sample
|
||||||
|
return false;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// insert sample into ring-buffer
|
// insert sample into ring-buffer
|
||||||
m_samples[m_ptr][0] = sampleIn->real();
|
m_samples[m_ptr][0] = sampleIn->real();
|
||||||
m_samples[m_ptr][1] = sampleIn->imag();
|
m_samples[m_ptr][1] = sampleIn->imag();
|
||||||
|
|
||||||
// save result
|
// save result
|
||||||
doFIR(sampleOut);
|
doFIR(sampleOut);
|
||||||
|
@ -63,14 +63,23 @@ void UpChannelizer::pull(Sample& sample)
|
|||||||
{
|
{
|
||||||
m_mutex.lock();
|
m_mutex.lock();
|
||||||
|
|
||||||
// TODO: handle multiple stages
|
|
||||||
|
|
||||||
FilterStages::iterator stage = m_filterStages.begin();
|
FilterStages::iterator stage = m_filterStages.begin();
|
||||||
|
FilterStages::iterator last = m_filterStages.end();
|
||||||
|
last--;
|
||||||
|
|
||||||
if ((*stage)->work(&m_sampleIn, &sample))
|
// m_sampleIn
|
||||||
{
|
|
||||||
m_sampleSource->pull(m_sampleIn);
|
for (; stage != m_filterStages.end(); ++stage)
|
||||||
}
|
{
|
||||||
|
// let's make it work for one stage only (96 kS/s < SR < 192 kS/s)
|
||||||
|
if(stage == last)
|
||||||
|
{
|
||||||
|
if ((*stage)->work(&m_sampleIn, &sample))
|
||||||
|
{
|
||||||
|
m_sampleSource->pull(m_sampleIn); // get new input sample
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_mutex.unlock();
|
m_mutex.unlock();
|
||||||
}
|
}
|
||||||
@ -162,9 +171,9 @@ void UpChannelizer::applyConfiguration()
|
|||||||
|
|
||||||
m_currentInputSampleRate = m_outputSampleRate / (1 << m_filterStages.size());
|
m_currentInputSampleRate = m_outputSampleRate / (1 << m_filterStages.size());
|
||||||
|
|
||||||
qDebug() << "UpChannelizer::applyConfiguration in=" << m_outputSampleRate
|
qDebug() << "UpChannelizer::applyConfiguration out=" << m_outputSampleRate
|
||||||
<< ", req=" << m_requestedInputSampleRate
|
<< ", req=" << m_requestedInputSampleRate
|
||||||
<< ", out=" << m_currentInputSampleRate
|
<< ", in=" << m_currentInputSampleRate
|
||||||
<< ", fc=" << m_currentCenterFrequency;
|
<< ", fc=" << m_currentCenterFrequency;
|
||||||
|
|
||||||
if (m_sampleSource != 0)
|
if (m_sampleSource != 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user