mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	UDPSink: fixed wrong sample sizes based on I/Q actual sample size that can now be 16 or 32 bits
This commit is contained in:
		
							parent
							
								
									5c51297717
								
							
						
					
					
						commit
						f8251ecb50
					
				@ -175,7 +175,7 @@ void UDPSink::modulateSample()
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (m_settings.m_sampleFormat == UDPSinkSettings::FormatNFM)
 | 
					    else if (m_settings.m_sampleFormat == UDPSinkSettings::FormatNFM)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        FixReal t;
 | 
					        qint16 t;
 | 
				
			||||||
        readMonoSample(t);
 | 
					        readMonoSample(t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        m_inMovingAverage.feed((t*t)/1073741824.0);
 | 
					        m_inMovingAverage.feed((t*t)/1073741824.0);
 | 
				
			||||||
@ -198,7 +198,7 @@ void UDPSink::modulateSample()
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (m_settings.m_sampleFormat == UDPSinkSettings::FormatAM)
 | 
					    else if (m_settings.m_sampleFormat == UDPSinkSettings::FormatAM)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        FixReal t;
 | 
					        qint16 t;
 | 
				
			||||||
        readMonoSample(t);
 | 
					        readMonoSample(t);
 | 
				
			||||||
        m_inMovingAverage.feed((t*t)/(SDR_TX_SCALED*SDR_TX_SCALED));
 | 
					        m_inMovingAverage.feed((t*t)/(SDR_TX_SCALED*SDR_TX_SCALED));
 | 
				
			||||||
        m_inMagsq = m_inMovingAverage.average();
 | 
					        m_inMagsq = m_inMovingAverage.average();
 | 
				
			||||||
@ -219,7 +219,7 @@ void UDPSink::modulateSample()
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else if ((m_settings.m_sampleFormat == UDPSinkSettings::FormatLSB) || (m_settings.m_sampleFormat == UDPSinkSettings::FormatUSB))
 | 
					    else if ((m_settings.m_sampleFormat == UDPSinkSettings::FormatLSB) || (m_settings.m_sampleFormat == UDPSinkSettings::FormatUSB))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        FixReal t;
 | 
					        qint16 t;
 | 
				
			||||||
        Complex c, ci;
 | 
					        Complex c, ci;
 | 
				
			||||||
        fftfilt::cmplx *filtered;
 | 
					        fftfilt::cmplx *filtered;
 | 
				
			||||||
        int n_out = 0;
 | 
					        int n_out = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -300,14 +300,14 @@ private:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    inline void readMonoSample(FixReal& t)
 | 
					    inline void readMonoSample(qint16& t)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Sample s;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_settings.m_stereoInput)
 | 
					        if (m_settings.m_stereoInput)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            m_udpHandler.readSample(s);
 | 
					            AudioSample a;
 | 
				
			||||||
            t = ((s.m_real + s.m_imag) * m_settings.m_gainIn) / 2;
 | 
					            m_udpHandler.readSample(a);
 | 
				
			||||||
 | 
					            t = ((a.l + a.r) * m_settings.m_gainIn) / 2;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ UDPSinkUDPHandler::UDPSinkUDPHandler() :
 | 
				
			|||||||
    m_udpDumpIndex(0),
 | 
					    m_udpDumpIndex(0),
 | 
				
			||||||
    m_nbUDPFrames(m_minNbUDPFrames),
 | 
					    m_nbUDPFrames(m_minNbUDPFrames),
 | 
				
			||||||
    m_nbAllocatedUDPFrames(m_minNbUDPFrames),
 | 
					    m_nbAllocatedUDPFrames(m_minNbUDPFrames),
 | 
				
			||||||
    m_writeIndex(0),
 | 
					    m_writeFrameIndex(0),
 | 
				
			||||||
    m_readFrameIndex(m_minNbUDPFrames/2),
 | 
					    m_readFrameIndex(m_minNbUDPFrames/2),
 | 
				
			||||||
    m_readIndex(0),
 | 
					    m_readIndex(0),
 | 
				
			||||||
    m_rwDelta(m_minNbUDPFrames/2),
 | 
					    m_rwDelta(m_minNbUDPFrames/2),
 | 
				
			||||||
@ -129,31 +129,45 @@ void UDPSinkUDPHandler::dataReadyRead()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void UDPSinkUDPHandler::moveData(char *blk)
 | 
					void UDPSinkUDPHandler::moveData(char *blk)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    memcpy(m_udpBuf[m_writeIndex], blk, m_udpBlockSize);
 | 
					    memcpy(m_udpBuf[m_writeFrameIndex], blk, m_udpBlockSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_writeIndex < m_nbUDPFrames - 1) {
 | 
					    if (m_writeFrameIndex < m_nbUDPFrames - 1) {
 | 
				
			||||||
        m_writeIndex++;
 | 
					        m_writeFrameIndex++;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        m_writeIndex = 0;
 | 
					        m_writeFrameIndex = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void UDPSinkUDPHandler::readSample(FixReal &t)
 | 
					void UDPSinkUDPHandler::readSample(qint16 &t)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (m_readFrameIndex == m_writeIndex) // block until more writes
 | 
					    if (m_readFrameIndex == m_writeFrameIndex) // block until more writes
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        t = 0;
 | 
					        t = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        memcpy(&t, &m_udpBuf[m_readFrameIndex][m_readIndex], sizeof(FixReal));
 | 
					        memcpy(&t, &m_udpBuf[m_readFrameIndex][m_readIndex], sizeof(qint16));
 | 
				
			||||||
        advanceReadPointer((int) sizeof(FixReal));
 | 
					        advanceReadPointer((int) sizeof(qint16));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void UDPSinkUDPHandler::readSample(AudioSample &a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (m_readFrameIndex == m_writeFrameIndex) // block until more writes
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        a.l = 0;
 | 
				
			||||||
 | 
					        a.r = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        memcpy(&a, &m_udpBuf[m_readFrameIndex][m_readIndex], sizeof(AudioSample));
 | 
				
			||||||
 | 
					        advanceReadPointer((int) sizeof(AudioSample));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void UDPSinkUDPHandler::readSample(Sample &s)
 | 
					void UDPSinkUDPHandler::readSample(Sample &s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (m_readFrameIndex == m_writeIndex) // block until more writes
 | 
					    if (m_readFrameIndex == m_writeFrameIndex) // block until more writes
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        s.m_real = 0;
 | 
					        s.m_real = 0;
 | 
				
			||||||
        s.m_imag = 0;
 | 
					        s.m_imag = 0;
 | 
				
			||||||
@ -181,7 +195,7 @@ void UDPSinkUDPHandler::advanceReadPointer(int nbBytes)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            m_rwDelta = m_writeIndex; // raw R/W delta estimate
 | 
					            m_rwDelta = m_writeFrameIndex; // raw R/W delta estimate
 | 
				
			||||||
            int nbUDPFrames2 = m_nbUDPFrames/2;
 | 
					            int nbUDPFrames2 = m_nbUDPFrames/2;
 | 
				
			||||||
            float d = (m_rwDelta - nbUDPFrames2)/(float) m_nbUDPFrames;
 | 
					            float d = (m_rwDelta - nbUDPFrames2)/(float) m_nbUDPFrames;
 | 
				
			||||||
            //qDebug("UDPSinkUDPHandler::advanceReadPointer: w: %02d d: %f", m_writeIndex, d);
 | 
					            //qDebug("UDPSinkUDPHandler::advanceReadPointer: w: %02d d: %f", m_writeIndex, d);
 | 
				
			||||||
@ -233,7 +247,7 @@ void UDPSinkUDPHandler::applyUDPLink(const QString& address, quint16 port)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void UDPSinkUDPHandler::resetReadIndex()
 | 
					void UDPSinkUDPHandler::resetReadIndex()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    m_readFrameIndex = (m_writeIndex + (m_nbUDPFrames/2)) % m_nbUDPFrames;
 | 
					    m_readFrameIndex = (m_writeFrameIndex + (m_nbUDPFrames/2)) % m_nbUDPFrames;
 | 
				
			||||||
    m_rwDelta = m_nbUDPFrames/2;
 | 
					    m_rwDelta = m_nbUDPFrames/2;
 | 
				
			||||||
    m_readIndex = 0;
 | 
					    m_readIndex = 0;
 | 
				
			||||||
    m_d = 0.0f;
 | 
					    m_d = 0.0f;
 | 
				
			||||||
@ -252,7 +266,7 @@ void UDPSinkUDPHandler::resizeBuffer(float sampleRate)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    m_nbUDPFrames = 2*halfNbFrames;
 | 
					    m_nbUDPFrames = 2*halfNbFrames;
 | 
				
			||||||
    m_writeIndex = 0;
 | 
					    m_writeFrameIndex = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resetReadIndex();
 | 
					    resetReadIndex();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -40,8 +40,9 @@ public:
 | 
				
			|||||||
    void resetReadIndex();
 | 
					    void resetReadIndex();
 | 
				
			||||||
    void resizeBuffer(float sampleRate);
 | 
					    void resizeBuffer(float sampleRate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void readSample(FixReal &t);
 | 
					    void readSample(qint16 &t);      //!< audio mono
 | 
				
			||||||
    void readSample(Sample &s);
 | 
					    void readSample(AudioSample &a); //!< audio stereo
 | 
				
			||||||
 | 
					    void readSample(Sample &s);      //!< I/Q stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void setAutoRWBalance(bool autoRWBalance) { m_autoRWBalance = autoRWBalance; }
 | 
					    void setAutoRWBalance(bool autoRWBalance) { m_autoRWBalance = autoRWBalance; }
 | 
				
			||||||
    void setFeedbackMessageQueue(MessageQueue *messageQueue) { m_feedbackMessageQueue = messageQueue; }
 | 
					    void setFeedbackMessageQueue(MessageQueue *messageQueue) { m_feedbackMessageQueue = messageQueue; }
 | 
				
			||||||
@ -104,7 +105,7 @@ private:
 | 
				
			|||||||
    int m_udpDumpIndex;
 | 
					    int m_udpDumpIndex;
 | 
				
			||||||
    int m_nbUDPFrames;
 | 
					    int m_nbUDPFrames;
 | 
				
			||||||
    int m_nbAllocatedUDPFrames;
 | 
					    int m_nbAllocatedUDPFrames;
 | 
				
			||||||
    int m_writeIndex;
 | 
					    int m_writeFrameIndex;
 | 
				
			||||||
    int m_readFrameIndex;
 | 
					    int m_readFrameIndex;
 | 
				
			||||||
    int m_readIndex;
 | 
					    int m_readIndex;
 | 
				
			||||||
    int m_rwDelta;
 | 
					    int m_rwDelta;
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ def getInputOptions():
 | 
				
			|||||||
    parser.add_option("-f", "--channel-freq", dest="channel_freq", help="channel center frequency (Hz)", metavar="FREQ", type="int")
 | 
					    parser.add_option("-f", "--channel-freq", dest="channel_freq", help="channel center frequency (Hz)", metavar="FREQ", type="int")
 | 
				
			||||||
    parser.add_option("-s", "--sample-rate", dest="sample_rate", help="host to device sample rate (S/s)", metavar="RATE", type="int")
 | 
					    parser.add_option("-s", "--sample-rate", dest="sample_rate", help="host to device sample rate (S/s)", metavar="RATE", type="int")
 | 
				
			||||||
    parser.add_option("-l", "--log2-interp", dest="log2_interp", help="log2 of interpolation factor", metavar="RATE", type="int")
 | 
					    parser.add_option("-l", "--log2-interp", dest="log2_interp", help="log2 of interpolation factor", metavar="RATE", type="int")
 | 
				
			||||||
 | 
					    parser.add_option("-L", "--log2-interp-hard", dest="log2_interp_hard", help="log2 of hardware interpolation factor", metavar="RATE", type="int")
 | 
				
			||||||
    parser.add_option("-A", "--antenna-path", dest="antenna_path", help="antenna path number", metavar="NUMBER", type="int")
 | 
					    parser.add_option("-A", "--antenna-path", dest="antenna_path", help="antenna path number", metavar="NUMBER", type="int")
 | 
				
			||||||
    parser.add_option("-c", "--create", dest="create", help="create a new device set", metavar="CREATE", action="store_true", default=False)
 | 
					    parser.add_option("-c", "--create", dest="create", help="create a new device set", metavar="CREATE", action="store_true", default=False)
 | 
				
			||||||
    parser.add_option("--ppm", dest="lo_ppm", help="LO correction in ppm", metavar="FILENAME", type="float", default=0)
 | 
					    parser.add_option("--ppm", dest="lo_ppm", help="LO correction in ppm", metavar="FILENAME", type="float", default=0)
 | 
				
			||||||
@ -55,6 +56,9 @@ def getInputOptions():
 | 
				
			|||||||
    if options.log2_interp == None:
 | 
					    if options.log2_interp == None:
 | 
				
			||||||
        options.log2_interp = 4
 | 
					        options.log2_interp = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if options.log2_interp_hard == None:
 | 
				
			||||||
 | 
					        options.log2_interp = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if options.antenna_path == None:
 | 
					    if options.antenna_path == None:
 | 
				
			||||||
        options.antenna_path = 1
 | 
					        options.antenna_path = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -121,7 +125,7 @@ def setupDevice(options):
 | 
				
			|||||||
    elif options.device_hwid == "LimeSDR":
 | 
					    elif options.device_hwid == "LimeSDR":
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["antennaPath"] = options.antenna_path
 | 
					        settings["limeSdrOutputSettings"]["antennaPath"] = options.antenna_path
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["devSampleRate"] = options.sample_rate
 | 
					        settings["limeSdrOutputSettings"]["devSampleRate"] = options.sample_rate
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["log2HardInterp"] = 4
 | 
					        settings["limeSdrOutputSettings"]["log2HardInterp"] = options.log2_interp_hard
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["log2SoftInterp"] = options.log2_interp
 | 
					        settings["limeSdrOutputSettings"]["log2SoftInterp"] = options.log2_interp
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq*1000 + 500000
 | 
					        settings["limeSdrOutputSettings"]["centerFrequency"] = options.device_freq*1000 + 500000
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["ncoEnable"] = 1
 | 
					        settings["limeSdrOutputSettings"]["ncoEnable"] = 1
 | 
				
			||||||
@ -129,6 +133,7 @@ def setupDevice(options):
 | 
				
			|||||||
        settings["limeSdrOutputSettings"]["lpfBW"] = 4050000
 | 
					        settings["limeSdrOutputSettings"]["lpfBW"] = 4050000
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["lpfFIRBW"] = 100000
 | 
					        settings["limeSdrOutputSettings"]["lpfFIRBW"] = 100000
 | 
				
			||||||
        settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
 | 
					        settings["limeSdrOutputSettings"]["lpfFIREnable"] = 1
 | 
				
			||||||
 | 
					        settings["limeSdrOutputSettings"]["gain"] = 17
 | 
				
			||||||
    elif options.device_hwid == "HackRF":
 | 
					    elif options.device_hwid == "HackRF":
 | 
				
			||||||
        settings['hackRFOutputSettings']['LOppmTenths'] = round(options.lo_ppm*10)
 | 
					        settings['hackRFOutputSettings']['LOppmTenths'] = round(options.lo_ppm*10)
 | 
				
			||||||
        settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq*1000
 | 
					        settings['hackRFOutputSettings']['centerFrequency'] = options.device_freq*1000
 | 
				
			||||||
@ -208,13 +213,15 @@ def setupChannel(options):
 | 
				
			|||||||
        settings["UDPSinkSettings"]["title"] = "Test UDP Sink"
 | 
					        settings["UDPSinkSettings"]["title"] = "Test UDP Sink"
 | 
				
			||||||
        settings["UDPSinkSettings"]["inputFrequencyOffset"] = options.channel_freq
 | 
					        settings["UDPSinkSettings"]["inputFrequencyOffset"] = options.channel_freq
 | 
				
			||||||
        settings["UDPSinkSettings"]["rfBandwidth"] = 12500
 | 
					        settings["UDPSinkSettings"]["rfBandwidth"] = 12500
 | 
				
			||||||
        settings["UDPSinkSettings"]["fmDeviation"] = 5000
 | 
					        settings["UDPSinkSettings"]["fmDeviation"] = 6000
 | 
				
			||||||
        settings["UDPSinkSettings"]["autoRWBalance"] = 0
 | 
					        settings["UDPSinkSettings"]["autoRWBalance"] = 1
 | 
				
			||||||
        settings["UDPSinkSettings"]["stereoInput"] = 0
 | 
					        settings["UDPSinkSettings"]["stereoInput"] = 0
 | 
				
			||||||
        settings["UDPSinkSettings"]["udpAddress"] = "127.0.0.1"
 | 
					        settings["UDPSinkSettings"]["udpAddress"] = "127.0.0.1"
 | 
				
			||||||
        settings["UDPSinkSettings"]["udpPort"] = 9998
 | 
					        settings["UDPSinkSettings"]["udpPort"] = 9998
 | 
				
			||||||
        settings["UDPSinkSettings"]["inputSampleRate"] = 24000
 | 
					        settings["UDPSinkSettings"]["inputSampleRate"] = 48000
 | 
				
			||||||
        settings["UDPSinkSettings"]["sampleFormat"] = 1 # FormatNFM
 | 
					        settings["UDPSinkSettings"]["sampleFormat"] = 1 # FormatNFM
 | 
				
			||||||
 | 
					        settings["UDPSinkSettings"]["gainIn"] = 2.5
 | 
				
			||||||
 | 
					        settings["UDPSinkSettings"]["gainOut"] = 2.8
 | 
				
			||||||
    elif options.channel_id == "WFMMod":
 | 
					    elif options.channel_id == "WFMMod":
 | 
				
			||||||
        settings["WFMModSettings"]["title"] = "Test WFM"
 | 
					        settings["WFMModSettings"]["title"] = "Test WFM"
 | 
				
			||||||
        settings["WFMModSettings"]["inputFrequencyOffset"] = options.channel_freq
 | 
					        settings["WFMModSettings"]["inputFrequencyOffset"] = options.channel_freq
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user