mirror of
				https://github.com/AlexandreRouma/SDRPlusPlus.git
				synced 2025-11-04 02:39:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
#include <radio_demod.h>
 | 
						|
#include <dsp/demodulator.h>
 | 
						|
#include <dsp/resampling.h>
 | 
						|
#include <dsp/filter.h>
 | 
						|
#include <dsp/audio.h>
 | 
						|
#include <string>
 | 
						|
#include <config.h>
 | 
						|
#include <imgui.h>
 | 
						|
 | 
						|
class USBDemodulator : public Demodulator {
 | 
						|
public:
 | 
						|
    USBDemodulator() {}
 | 
						|
    USBDemodulator(std::string prefix, VFOManager::VFO* vfo, float audioSampleRate, float bandWidth, ConfigManager* config) {
 | 
						|
        init(prefix, vfo, audioSampleRate, bandWidth, config);
 | 
						|
    }
 | 
						|
 | 
						|
    void init(std::string prefix, VFOManager::VFO* vfo, float audioSampleRate, float bandWidth, ConfigManager* config) {
 | 
						|
        uiPrefix = prefix;
 | 
						|
        _vfo = vfo;
 | 
						|
        audioSampRate = audioSampleRate;
 | 
						|
        bw = bandWidth;
 | 
						|
        _config = config;
 | 
						|
 | 
						|
        _config->aquire();
 | 
						|
        if(_config->conf.contains(prefix)) {
 | 
						|
            if(!_config->conf[prefix].contains("USB")) {
 | 
						|
                _config->conf[prefix]["USB"]["bandwidth"] = bw;
 | 
						|
                _config->conf[prefix]["USB"]["snapInterval"] = snapInterval;
 | 
						|
            }
 | 
						|
            json conf = _config->conf[prefix]["USB"];
 | 
						|
            bw = conf["bandwidth"];
 | 
						|
            snapInterval = conf["snapInterval"];
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            _config->conf[prefix]["USB"]["bandwidth"] = bw;
 | 
						|
            _config->conf[prefix]["USB"]["snapInterval"] = snapInterval;
 | 
						|
        }
 | 
						|
        _config->release(true);
 | 
						|
        
 | 
						|
        demod.init(_vfo->output, bbSampRate, bandWidth, dsp::SSBDemod::MODE_USB);
 | 
						|
 | 
						|
        agc.init(&demod.out, 1.0f / 125.0f);
 | 
						|
 | 
						|
        float audioBW = std::min<float>(audioSampRate / 2.0f, bw);
 | 
						|
        win.init(audioBW, audioBW, bbSampRate);
 | 
						|
        resamp.init(&agc.out, &win, bbSampRate, audioSampRate);
 | 
						|
        win.setSampleRate(bbSampRate * resamp.getInterpolation());
 | 
						|
        resamp.updateWindow(&win);
 | 
						|
 | 
						|
        m2s.init(&resamp.out);
 | 
						|
    }
 | 
						|
 | 
						|
    void start() {
 | 
						|
        demod.start();
 | 
						|
        agc.start();
 | 
						|
        resamp.start();
 | 
						|
        m2s.start();
 | 
						|
        running = true;
 | 
						|
    }
 | 
						|
 | 
						|
    void stop() {
 | 
						|
        demod.stop();
 | 
						|
        agc.stop();
 | 
						|
        resamp.stop();
 | 
						|
        m2s.stop();
 | 
						|
        running = false;
 | 
						|
    }
 | 
						|
    
 | 
						|
    bool isRunning() {
 | 
						|
        return running;
 | 
						|
    }
 | 
						|
 | 
						|
    void select() {
 | 
						|
        _vfo->setSampleRate(bbSampRate, bw);
 | 
						|
        _vfo->setSnapInterval(snapInterval);
 | 
						|
        _vfo->setReference(ImGui::WaterfallVFO::REF_LOWER);
 | 
						|
    }
 | 
						|
 | 
						|
    void setVFO(VFOManager::VFO* vfo) {
 | 
						|
        _vfo = vfo;
 | 
						|
        demod.setInput(_vfo->output);
 | 
						|
    }
 | 
						|
 | 
						|
    VFOManager::VFO* getVFO() {
 | 
						|
        return _vfo;
 | 
						|
    }
 | 
						|
    
 | 
						|
    void setAudioSampleRate(float sampleRate) {
 | 
						|
        if (running) {
 | 
						|
            resamp.stop();
 | 
						|
        }
 | 
						|
        audioSampRate = sampleRate;
 | 
						|
        float audioBW = std::min<float>(audioSampRate / 2.0f, bw);
 | 
						|
        resamp.setOutSampleRate(audioSampRate);
 | 
						|
        win.setSampleRate(bbSampRate * resamp.getInterpolation());
 | 
						|
        win.setCutoff(audioBW);
 | 
						|
        win.setTransWidth(audioBW);
 | 
						|
        resamp.updateWindow(&win);
 | 
						|
        if (running) {
 | 
						|
            resamp.start();
 | 
						|
        }
 | 
						|
    }
 | 
						|
    
 | 
						|
    float getAudioSampleRate() {
 | 
						|
        return audioSampRate;
 | 
						|
    }
 | 
						|
 | 
						|
    dsp::stream<dsp::stereo_t>* getOutput() {
 | 
						|
        return &m2s.out;
 | 
						|
    }
 | 
						|
    
 | 
						|
    void showMenu() {
 | 
						|
        float menuWidth = ImGui::GetContentRegionAvailWidth();
 | 
						|
 | 
						|
        ImGui::SetNextItemWidth(menuWidth);
 | 
						|
        if (ImGui::InputFloat(("##_radio_usb_bw_" + uiPrefix).c_str(), &bw, 1, 100, 0)) {
 | 
						|
            bw = std::clamp<float>(bw, bwMin, bwMax);
 | 
						|
            setBandwidth(bw);
 | 
						|
            _config->aquire();
 | 
						|
            _config->conf[uiPrefix]["USB"]["bandwidth"] = bw;
 | 
						|
            _config->release(true);
 | 
						|
        }
 | 
						|
 | 
						|
        ImGui::Text("Snap Interval");
 | 
						|
        ImGui::SameLine();
 | 
						|
        ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX());
 | 
						|
        if (ImGui::InputFloat(("##_radio_usb_snap_" + uiPrefix).c_str(), &snapInterval, 1, 100, 0)) {
 | 
						|
            setSnapInterval(snapInterval);
 | 
						|
            _config->aquire();
 | 
						|
            _config->conf[uiPrefix]["USB"]["snapInterval"] = snapInterval;
 | 
						|
            _config->release(true);
 | 
						|
        }
 | 
						|
    } 
 | 
						|
 | 
						|
private:
 | 
						|
    void setBandwidth(float bandWidth) {
 | 
						|
        bw = bandWidth;
 | 
						|
        _vfo->setBandwidth(bw);
 | 
						|
    }
 | 
						|
 | 
						|
    void setSnapInterval(float snapInt) {
 | 
						|
        snapInterval = snapInt;
 | 
						|
        _vfo->setSnapInterval(snapInterval);
 | 
						|
    }
 | 
						|
 | 
						|
    const float bwMax = 3000;
 | 
						|
    const float bwMin = 500;
 | 
						|
    const float bbSampRate = 6000;
 | 
						|
 | 
						|
    std::string uiPrefix;
 | 
						|
    float snapInterval = 100;
 | 
						|
    float audioSampRate = 48000;
 | 
						|
    float bw = 3000;
 | 
						|
    bool running = false;
 | 
						|
 | 
						|
    VFOManager::VFO* _vfo;
 | 
						|
    dsp::SSBDemod demod;
 | 
						|
    dsp::AGC agc;
 | 
						|
    dsp::filter_window::BlackmanWindow win;
 | 
						|
    dsp::PolyphaseResampler<float> resamp;
 | 
						|
    dsp::MonoToStereo m2s;
 | 
						|
 | 
						|
    ConfigManager* _config;
 | 
						|
 | 
						|
}; |