mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-30 20:40:20 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			121 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////////
 | |
| // Copyright (C) 2016 F4EXB                                                      //
 | |
| // written by Edouard Griffiths                                                  //
 | |
| //                                                                               //
 | |
| // This program is free software; you can redistribute it and/or modify          //
 | |
| // it under the terms of the GNU General Public License as published by          //
 | |
| // the Free Software Foundation as version 3 of the License, or                  //
 | |
| //                                                                               //
 | |
| // This program is distributed in the hope that it will be useful,               //
 | |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | |
| // GNU General Public License V3 for more details.                               //
 | |
| //                                                                               //
 | |
| // You should have received a copy of the GNU General Public License             //
 | |
| // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | |
| ///////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef SDRBASE_DSP_UPCHANNELIZER_H_
 | |
| #define SDRBASE_DSP_UPCHANNELIZER_H_
 | |
| 
 | |
| #include <dsp/basebandsamplesource.h>
 | |
| #include <vector>
 | |
| #include <QMutex>
 | |
| #include "util/export.h"
 | |
| #include "util/message.h"
 | |
| #ifdef USE_SSE4_1
 | |
| #include "dsp/inthalfbandfiltereo1.h"
 | |
| #else
 | |
| #include "dsp/inthalfbandfilterdb.h"
 | |
| #endif
 | |
| 
 | |
| #define UPCHANNELIZER_HB_FILTER_ORDER 96
 | |
| 
 | |
| class MessageQueue;
 | |
| 
 | |
| class SDRANGEL_API UpChannelizer : public BasebandSampleSource {
 | |
|     Q_OBJECT
 | |
| public:
 | |
|     class SDRANGEL_API MsgChannelizerNotification : public Message {
 | |
|         MESSAGE_CLASS_DECLARATION
 | |
| 
 | |
|     public:
 | |
|         MsgChannelizerNotification(int basebandSampleRate, int samplerate, qint64 frequencyOffset) :
 | |
|             Message(),
 | |
|             m_basebandSampleRate(basebandSampleRate),
 | |
|             m_sampleRate(samplerate),
 | |
|             m_frequencyOffset(frequencyOffset)
 | |
|         { }
 | |
| 
 | |
|         int getBasebandSampleRate() const { return m_basebandSampleRate; }
 | |
|         int getSampleRate() const { return m_sampleRate; }
 | |
|         qint64 getFrequencyOffset() const { return m_frequencyOffset; }
 | |
| 
 | |
|     private:
 | |
|         int m_basebandSampleRate;
 | |
|         int m_sampleRate;
 | |
|         qint64 m_frequencyOffset;
 | |
|     };
 | |
| 
 | |
|     UpChannelizer(BasebandSampleSource* sampleSink);
 | |
|     virtual ~UpChannelizer();
 | |
| 
 | |
|     void configure(MessageQueue* messageQueue, int sampleRate, int centerFrequency);
 | |
|     int getOutputSampleRate() const { return m_outputSampleRate; }
 | |
| 
 | |
|     virtual void start();
 | |
|     virtual void stop();
 | |
|     virtual void pull(Sample& sample);
 | |
|     virtual void pullAudio(int nbSamples) { if (m_sampleSource) m_sampleSource->pullAudio(nbSamples); }
 | |
| 
 | |
|     virtual bool handleMessage(const Message& cmd);
 | |
| 
 | |
| protected:
 | |
|     struct FilterStage {
 | |
|         enum Mode {
 | |
|             ModeCenter,
 | |
|             ModeLowerHalf,
 | |
|             ModeUpperHalf
 | |
|         };
 | |
| 
 | |
| #ifdef USE_SSE4_1
 | |
|         typedef bool (IntHalfbandFilterEO1<UPCHANNELIZER_HB_FILTER_ORDER>::*WorkFunction)(Sample* sIn, Sample *sOut);
 | |
|         IntHalfbandFilterEO1<UPCHANNELIZER_HB_FILTER_ORDER>* m_filter;
 | |
| #else
 | |
|         typedef bool (IntHalfbandFilterDB<UPCHANNELIZER_HB_FILTER_ORDER>::*WorkFunction)(Sample* sIn, Sample *sOut);
 | |
|         IntHalfbandFilterDB<UPCHANNELIZER_HB_FILTER_ORDER>* m_filter;
 | |
| #endif
 | |
|         WorkFunction m_workFunction;
 | |
| 
 | |
|         FilterStage(Mode mode);
 | |
|         ~FilterStage();
 | |
| 
 | |
|         bool work(Sample* sampleIn, Sample *sampleOut)
 | |
|         {
 | |
|             return (m_filter->*m_workFunction)(sampleIn, sampleOut);
 | |
|         }
 | |
|     };
 | |
|     typedef std::vector<FilterStage*> FilterStages;
 | |
|     FilterStages m_filterStages;
 | |
|     std::vector<Sample> m_stageSamples;
 | |
|     BasebandSampleSource* m_sampleSource; //!< Modulator
 | |
|     int m_outputSampleRate;
 | |
|     int m_requestedInputSampleRate;
 | |
|     int m_requestedCenterFrequency;
 | |
|     int m_currentInputSampleRate;
 | |
|     int m_currentCenterFrequency;
 | |
|     SampleVector m_sampleBuffer;
 | |
|     Sample m_sampleIn;
 | |
|     QMutex m_mutex;
 | |
| 
 | |
|     void applyConfiguration();
 | |
|     bool signalContainsChannel(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd) const;
 | |
|     Real createFilterChain(Real sigStart, Real sigEnd, Real chanStart, Real chanEnd);
 | |
|     void freeFilterChain();
 | |
| 
 | |
| signals:
 | |
|     void outputSampleRateChanged();
 | |
| };
 | |
| 
 | |
| #endif /* SDRBASE_DSP_UPCHANNELIZER_H_ */
 |