mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-22 01:20:56 -05:00
Demispectrum.
This commit is contained in:
parent
bbe6d4505d
commit
fa780d9134
@ -15,7 +15,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* messageQueue, int sampleRate, int centerFrequency);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -19,7 +19,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* msgQueue, TriggerChannel triggerChannel, Real triggerLevelHigh, Real triggerLevelLow);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* message);
|
||||
|
@ -16,7 +16,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, FFTWindow::Function window);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* message);
|
||||
|
@ -12,7 +12,7 @@ public:
|
||||
SampleSink();
|
||||
virtual ~SampleSink();
|
||||
|
||||
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst) = 0;
|
||||
virtual void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) = 0;
|
||||
virtual void start() = 0;
|
||||
virtual void stop() = 0;
|
||||
virtual bool handleMessage(Message* cmd) = 0;
|
||||
|
@ -19,7 +19,7 @@ public:
|
||||
|
||||
MessageQueue* getMessageQueue() { return &m_messageQueue; }
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -57,7 +57,7 @@ void NFMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBa
|
||||
}
|
||||
|
||||
int framedrop = 0;
|
||||
void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
Complex ci;
|
||||
bool consumed;
|
||||
@ -109,7 +109,7 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
|
||||
m_audioBufferFill = 0;
|
||||
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), true);
|
||||
m_sampleBuffer.clear();
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -53,7 +53,7 @@ void SSBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real volume
|
||||
}
|
||||
|
||||
int undersamplecount = 0;
|
||||
void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
Complex ci;
|
||||
bool consumed;
|
||||
@ -88,7 +88,7 @@ void SSBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
|
||||
m_audioBufferFill = 0;
|
||||
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), true);
|
||||
m_sampleBuffer.clear();
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* messageQueue, Real Bandwidth, Real volume);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -43,7 +43,7 @@ void TCPSrc::setSpectrum(MessageQueue* messageQueue, bool enabled)
|
||||
cmd->submit(messageQueue, this);
|
||||
}
|
||||
|
||||
void TCPSrc::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void TCPSrc::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
Complex ci;
|
||||
bool consumed;
|
||||
@ -60,7 +60,7 @@ void TCPSrc::feed(SampleVector::const_iterator begin, SampleVector::const_iterat
|
||||
}
|
||||
|
||||
if((m_spectrum != NULL) && (m_spectrumEnabled))
|
||||
m_spectrum->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||
m_spectrum->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), positiveOnly);
|
||||
|
||||
for(int i = 0; i < m_s16leSockets.count(); i++)
|
||||
m_s16leSockets[i].socket->write((const char*)&m_sampleBuffer[0], m_sampleBuffer.size() * 4);
|
||||
|
@ -26,7 +26,7 @@ public:
|
||||
void configure(MessageQueue* messageQueue, SampleFormat sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort);
|
||||
void setSpectrum(MessageQueue* messageQueue, bool enabled);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -44,7 +44,7 @@ void TetraDemod::configure(MessageQueue* messageQueue)
|
||||
cmd->submit(messageQueue, this);
|
||||
}
|
||||
|
||||
void TetraDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void TetraDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
size_t count = end - begin;
|
||||
|
||||
@ -68,7 +68,7 @@ void TetraDemod::feed(SampleVector::const_iterator begin, SampleVector::const_it
|
||||
}
|
||||
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), positiveOnly);
|
||||
m_sampleBuffer.clear();
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
|
||||
void configure(MessageQueue* messageQueue);
|
||||
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly);
|
||||
void start();
|
||||
void stop();
|
||||
bool handleMessage(Message* cmd);
|
||||
|
@ -23,8 +23,13 @@ void Channelizer::configure(MessageQueue* messageQueue, int sampleRate, int cent
|
||||
cmd->submit(messageQueue, this);
|
||||
}
|
||||
|
||||
void Channelizer::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void Channelizer::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
if(m_sampleSink == NULL) {
|
||||
m_sampleBuffer.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
for(SampleVector::const_iterator sample = begin; sample != end; ++sample) {
|
||||
Sample s(*sample);
|
||||
FilterStages::iterator stage = m_filterStages.begin();
|
||||
@ -37,9 +42,7 @@ void Channelizer::feed(SampleVector::const_iterator begin, SampleVector::const_i
|
||||
m_sampleBuffer.push_back(s);
|
||||
}
|
||||
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||
|
||||
m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), positiveOnly);
|
||||
m_sampleBuffer.clear();
|
||||
}
|
||||
|
||||
|
@ -200,7 +200,7 @@ void DSPEngine::work()
|
||||
{
|
||||
SampleFifo* sampleFifo = m_sampleSource->getSampleFifo();
|
||||
size_t samplesDone = 0;
|
||||
bool firstOfBurst = true;
|
||||
bool positiveOnly = false;
|
||||
|
||||
while((sampleFifo->fill() > 0) && (m_messageQueue.countPending() == 0) && (samplesDone < m_sampleRate)) {
|
||||
SampleVector::iterator part1begin;
|
||||
@ -219,7 +219,7 @@ void DSPEngine::work()
|
||||
imbalance(part1begin, part1end);
|
||||
// feed data to handlers
|
||||
for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++)
|
||||
(*it)->feed(part1begin, part1end, firstOfBurst);
|
||||
(*it)->feed(part1begin, part1end, positiveOnly);
|
||||
}
|
||||
// second part of FIFO data (used when block wraps around)
|
||||
if(part2begin != part2end) {
|
||||
@ -230,9 +230,8 @@ void DSPEngine::work()
|
||||
imbalance(part2begin, part2end);
|
||||
// feed data to handlers
|
||||
for(SampleSinks::const_iterator it = m_sampleSinks.begin(); it != m_sampleSinks.end(); it++)
|
||||
(*it)->feed(part2begin, part2end, firstOfBurst);
|
||||
(*it)->feed(part2begin, part2end, positiveOnly);
|
||||
}
|
||||
firstOfBurst = false;
|
||||
|
||||
// adjust FIFO pointers
|
||||
sampleFifo->readCommit(count);
|
||||
|
@ -21,7 +21,7 @@ void ScopeVis::configure(MessageQueue* msgQueue, TriggerChannel triggerChannel,
|
||||
cmd->submit(msgQueue, this);
|
||||
}
|
||||
|
||||
void ScopeVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void ScopeVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
while(begin < end) {
|
||||
if(m_triggerChannel == TriggerChannelI) {
|
||||
|
@ -34,7 +34,7 @@ void SpectrumVis::configure(MessageQueue* msgQueue, int fftSize, int overlapPerc
|
||||
cmd->submit(msgQueue, this);
|
||||
}
|
||||
|
||||
void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
// if no visualisation is set, send the samples to /dev/null
|
||||
if(m_glSpectrum == NULL)
|
||||
@ -60,7 +60,15 @@ void SpectrumVis::feed(SampleVector::const_iterator begin, SampleVector::const_i
|
||||
Real ofs = 20.0f * log10f(1.0f / m_fftSize);
|
||||
Real mult = (10.0f / log2f(10.0f));
|
||||
const Complex* fftOut = m_fft->out();
|
||||
for(size_t i = 0; i < m_fftSize; i++) {
|
||||
size_t spectrumStart = 0;
|
||||
|
||||
if ( positiveOnly ) {
|
||||
Real logZero = ofs + mult * log2f( 0 );
|
||||
for(size_t i = 0; i < m_fftSize / 2; i++)
|
||||
m_logPowerSpectrum[i] = logZero;
|
||||
spectrumStart = m_fftSize / 2;
|
||||
}
|
||||
for(size_t i = spectrumStart; i < m_fftSize; i++) {
|
||||
Complex c = fftOut[((i + (m_fftSize >> 1)) & (m_fftSize - 1))];
|
||||
Real v = c.real() * c.real() + c.imag() * c.imag();
|
||||
v = mult * log2f(v) + ofs;
|
||||
|
@ -27,9 +27,9 @@ ThreadedSampleSink::~ThreadedSampleSink()
|
||||
delete m_thread;
|
||||
}
|
||||
|
||||
void ThreadedSampleSink::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||
void ThreadedSampleSink::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly)
|
||||
{
|
||||
Q_UNUSED(firstOfBurst);
|
||||
Q_UNUSED(positiveOnly);
|
||||
m_sampleFifo.write(begin, end);
|
||||
}
|
||||
|
||||
@ -54,7 +54,7 @@ bool ThreadedSampleSink::handleMessage(Message* cmd)
|
||||
|
||||
void ThreadedSampleSink::handleData()
|
||||
{
|
||||
bool firstOfBurst = true;
|
||||
bool positiveOnly = false;
|
||||
|
||||
while((m_sampleFifo.fill() > 0) && (m_messageQueue.countPending() == 0)) {
|
||||
SampleVector::iterator part1begin;
|
||||
@ -68,15 +68,14 @@ void ThreadedSampleSink::handleData()
|
||||
if(part1begin != part1end) {
|
||||
// handle data
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(part1begin, part1end, firstOfBurst);
|
||||
m_sampleSink->feed(part1begin, part1end, positiveOnly);
|
||||
}
|
||||
// second part of FIFO data (used when block wraps around)
|
||||
if(part2begin != part2end) {
|
||||
// handle data
|
||||
if(m_sampleSink != NULL)
|
||||
m_sampleSink->feed(part2begin, part2end, firstOfBurst);
|
||||
m_sampleSink->feed(part2begin, part2end, positiveOnly);
|
||||
}
|
||||
firstOfBurst = false;
|
||||
|
||||
// adjust FIFO pointers
|
||||
m_sampleFifo.readCommit(count);
|
||||
|
Loading…
Reference in New Issue
Block a user