mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	NFM demod: added high pass audio filter control
This commit is contained in:
		
							parent
							
								
									2d44fa3b99
								
							
						
					
					
						commit
						5096816143
					
				@ -90,7 +90,7 @@ NFMDemod::NFMDemod(DeviceAPI *devieAPI) :
 | 
			
		||||
	m_ctcssDetector.setCoefficients(m_audioSampleRate/16, m_audioSampleRate/8.0f); // 0.5s / 2 Hz resolution
 | 
			
		||||
	m_afSquelch.setCoefficients(m_audioSampleRate/2000, 600, m_audioSampleRate, 200, 0, afSqTones); // 0.5ms test period, 300ms average span, audio SR, 100ms attack, no decay
 | 
			
		||||
 | 
			
		||||
    m_lowpass.create(301, m_audioSampleRate, 250.0);
 | 
			
		||||
    m_ctcssLowpass.create(301, m_audioSampleRate, 250.0);
 | 
			
		||||
 | 
			
		||||
    applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
 | 
			
		||||
	applySettings(m_settings, true);
 | 
			
		||||
@ -247,7 +247,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
 | 
			
		||||
                {
 | 
			
		||||
                    if (m_settings.m_ctcssOn)
 | 
			
		||||
                    {
 | 
			
		||||
                        Real ctcss_sample = m_lowpass.filter(demod * m_discriCompensation);
 | 
			
		||||
                        Real ctcss_sample = m_ctcssLowpass.filter(demod * m_discriCompensation);
 | 
			
		||||
 | 
			
		||||
                        if ((m_sampleCount & 7) == 7) // decimate 48k -> 6k
 | 
			
		||||
                        {
 | 
			
		||||
@ -287,7 +287,11 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        if (m_settings.m_highPass) {
 | 
			
		||||
                            sample = m_bandpass.filter(m_squelchDelayLine.readBack(m_squelchGate)) * m_settings.m_volume;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            sample = m_lowpass.filter(m_squelchDelayLine.readBack(m_squelchGate)) * m_settings.m_volume;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
@ -436,8 +440,9 @@ void NFMDemod::applyAudioSampleRate(int sampleRate)
 | 
			
		||||
    m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth / 2.2f);
 | 
			
		||||
    m_interpolatorDistanceRemain = 0;
 | 
			
		||||
    m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate;
 | 
			
		||||
    m_lowpass.create(301, sampleRate, 250.0);
 | 
			
		||||
    m_ctcssLowpass.create(301, sampleRate, 250.0);
 | 
			
		||||
    m_bandpass.create(301, sampleRate, 300.0, m_settings.m_afBandwidth);
 | 
			
		||||
    m_lowpass.create(301, sampleRate, m_settings.m_afBandwidth);
 | 
			
		||||
    m_squelchGate = (sampleRate / 100) * m_settings.m_squelchGate; // gate is given in 10s of ms at 48000 Hz audio sample rate
 | 
			
		||||
    m_squelchCount = 0; // reset squelch open counter
 | 
			
		||||
    m_ctcssDetector.setCoefficients(sampleRate/16, sampleRate/8.0f); // 0.5s / 2 Hz resolution
 | 
			
		||||
@ -499,6 +504,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force)
 | 
			
		||||
            << " m_squelch: " << settings.m_squelch
 | 
			
		||||
            << " m_ctcssIndex: " << settings.m_ctcssIndex
 | 
			
		||||
            << " m_ctcssOn: " << settings.m_ctcssOn
 | 
			
		||||
            << " m_highPass: " << m_settings.m_highPass
 | 
			
		||||
            << " m_audioMute: " << settings.m_audioMute
 | 
			
		||||
            << " m_audioDeviceName: " << settings.m_audioDeviceName
 | 
			
		||||
            << " m_useReverseAPI: " << settings.m_useReverseAPI
 | 
			
		||||
@ -550,6 +556,7 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force)
 | 
			
		||||
        reverseAPIKeys.append("afBandwidth");
 | 
			
		||||
        m_settingsMutex.lock();
 | 
			
		||||
        m_bandpass.create(301, m_audioSampleRate, 300.0, settings.m_afBandwidth);
 | 
			
		||||
        m_lowpass.create(301, m_audioSampleRate, settings.m_afBandwidth);
 | 
			
		||||
        m_settingsMutex.unlock();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -591,6 +598,10 @@ void NFMDemod::applySettings(const NFMDemodSettings& settings, bool force)
 | 
			
		||||
        setSelectedCtcssIndex(settings.m_ctcssIndex);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((settings.m_highPass != m_settings.m_highPass) || force) {
 | 
			
		||||
        reverseAPIKeys.append("highPass");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
 | 
			
		||||
    {
 | 
			
		||||
        reverseAPIKeys.append("audioDeviceName");
 | 
			
		||||
 | 
			
		||||
@ -220,8 +220,9 @@ private:
 | 
			
		||||
	Interpolator m_interpolator;
 | 
			
		||||
	Real m_interpolatorDistance;
 | 
			
		||||
	Real m_interpolatorDistanceRemain;
 | 
			
		||||
	Lowpass<Real> m_lowpass;
 | 
			
		||||
	Lowpass<Real> m_ctcssLowpass;
 | 
			
		||||
	Bandpass<Real> m_bandpass;
 | 
			
		||||
    Lowpass<Real> m_lowpass;
 | 
			
		||||
	CTCSSDetector m_ctcssDetector;
 | 
			
		||||
	int m_ctcssIndex; // 0 for nothing detected
 | 
			
		||||
	int m_ctcssIndexSelected;
 | 
			
		||||
 | 
			
		||||
@ -201,6 +201,12 @@ void NFMDemodGUI::on_ctcssOn_toggled(bool checked)
 | 
			
		||||
	applySettings();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void NFMDemodGUI::on_highPassFilter_toggled(bool checked)
 | 
			
		||||
{
 | 
			
		||||
    m_settings.m_highPass = checked;
 | 
			
		||||
    applySettings();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void NFMDemodGUI::on_audioMute_toggled(bool checked)
 | 
			
		||||
{
 | 
			
		||||
	m_settings.m_audioMute = checked;
 | 
			
		||||
@ -398,6 +404,7 @@ void NFMDemodGUI::displaySettings()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ui->ctcssOn->setChecked(m_settings.m_ctcssOn);
 | 
			
		||||
    ui->highPassFilter->setChecked(m_settings.m_highPass);
 | 
			
		||||
    ui->audioMute->setChecked(m_settings.m_audioMute);
 | 
			
		||||
 | 
			
		||||
    ui->ctcss->setCurrentIndex(m_settings.m_ctcssIndex);
 | 
			
		||||
 | 
			
		||||
@ -76,6 +76,7 @@ private slots:
 | 
			
		||||
	void on_squelch_valueChanged(int value);
 | 
			
		||||
	void on_ctcss_currentIndexChanged(int index);
 | 
			
		||||
	void on_ctcssOn_toggled(bool checked);
 | 
			
		||||
    void on_highPassFilter_toggled(bool checked);
 | 
			
		||||
	void on_audioMute_toggled(bool checked);
 | 
			
		||||
	void onWidgetRolled(QWidget* widget, bool rollDown);
 | 
			
		||||
	void onMenuDialogCalled(const QPoint& p);
 | 
			
		||||
 | 
			
		||||
@ -574,6 +574,20 @@
 | 
			
		||||
        </property>
 | 
			
		||||
       </spacer>
 | 
			
		||||
      </item>
 | 
			
		||||
      <item>
 | 
			
		||||
       <widget class="ButtonSwitch" name="highPassFilter">
 | 
			
		||||
        <property name="toolTip">
 | 
			
		||||
         <string>High pass audio filter</string>
 | 
			
		||||
        </property>
 | 
			
		||||
        <property name="text">
 | 
			
		||||
         <string/>
 | 
			
		||||
        </property>
 | 
			
		||||
        <property name="icon">
 | 
			
		||||
         <iconset resource="../../../sdrgui/resources/res.qrc">
 | 
			
		||||
          <normaloff>:/filter_highpass.png</normaloff>:/filter_highpass.png</iconset>
 | 
			
		||||
        </property>
 | 
			
		||||
       </widget>
 | 
			
		||||
      </item>
 | 
			
		||||
      <item>
 | 
			
		||||
       <widget class="QToolButton" name="audioMute">
 | 
			
		||||
        <property name="toolTip">
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,7 @@ void NFMDemodSettings::resetToDefaults()
 | 
			
		||||
    m_rgbColor = QColor(255, 0, 0).rgb();
 | 
			
		||||
    m_title = "NFM Demodulator";
 | 
			
		||||
    m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
 | 
			
		||||
    m_highPass = true;
 | 
			
		||||
    m_useReverseAPI = false;
 | 
			
		||||
    m_reverseAPIAddress = "127.0.0.1";
 | 
			
		||||
    m_reverseAPIPort = 8888;
 | 
			
		||||
@ -68,6 +69,7 @@ QByteArray NFMDemodSettings::serialize() const
 | 
			
		||||
    s.writeS32(3, m_afBandwidth/1000.0);
 | 
			
		||||
    s.writeS32(4, m_volume*10.0);
 | 
			
		||||
    s.writeS32(5, static_cast<int>(m_squelch));
 | 
			
		||||
    s.writeBool(6, m_highPass);
 | 
			
		||||
    s.writeU32(7, m_rgbColor);
 | 
			
		||||
    s.writeS32(8, m_ctcssIndex);
 | 
			
		||||
    s.writeBool(9, m_ctcssOn);
 | 
			
		||||
@ -123,6 +125,7 @@ bool NFMDemodSettings::deserialize(const QByteArray& data)
 | 
			
		||||
        m_volume = tmp / 10.0;
 | 
			
		||||
        d.readS32(5, &tmp, -30);
 | 
			
		||||
        m_squelch = (tmp < -100 ? tmp/10 : tmp) * 1.0;
 | 
			
		||||
        d.readBool(6, &m_highPass, true);
 | 
			
		||||
        d.readU32(7, &m_rgbColor, QColor(255, 0, 0).rgb());
 | 
			
		||||
        d.readS32(8, &m_ctcssIndex, 0);
 | 
			
		||||
        d.readBool(9, &m_ctcssOn, false);
 | 
			
		||||
 | 
			
		||||
@ -42,6 +42,7 @@ struct NFMDemodSettings
 | 
			
		||||
    quint32 m_rgbColor;
 | 
			
		||||
    QString m_title;
 | 
			
		||||
    QString m_audioDeviceName;
 | 
			
		||||
    bool m_highPass;
 | 
			
		||||
    bool m_useReverseAPI;
 | 
			
		||||
    QString m_reverseAPIAddress;
 | 
			
		||||
    uint16_t m_reverseAPIPort;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user