2828const unsigned int ChannelAnalyzerSink::m_ssbFftLen = 1024 ;
2929const unsigned int ChannelAnalyzerSink::m_corrFFTLen = 4 *m_ssbFftLen;
3030
31+ ChannelAnalyzerSink::RRCHelper::RRCHelper (int flen) :
32+ m_useFFT(false ),
33+ m_filterFIR(new FIRFilterRRC()),
34+ m_filterFFT(new FFTFilterRRC(m_ssbFftLen)),
35+ m_buffer(new std::complex <float >[flen/2 ]),
36+ m_bufferPos(0 ),
37+ flen2(flen/2 )
38+ {
39+ }
40+
41+ ChannelAnalyzerSink::RRCHelper::~RRCHelper ()
42+ {
43+ delete m_filterFIR;
44+ delete[] m_buffer;
45+ }
46+
47+ void ChannelAnalyzerSink::RRCHelper::setUseFFT (bool useFFT)
48+ {
49+ m_useFFT = useFFT;
50+ m_bufferPos = 0 ;
51+ }
52+
53+ void ChannelAnalyzerSink::RRCHelper::create (float symbolRate, float rolloff, unsigned int samplesPerSymbol, FIRFilterRRC::Normalization normalization)
54+ {
55+ m_filterFIR->create (symbolRate, rolloff, samplesPerSymbol, normalization);
56+ m_filterFFT->create (symbolRate, rolloff);
57+ }
58+
59+ int ChannelAnalyzerSink::RRCHelper::runFilt (const std::complex <float > & in, std::complex <float > **out)
60+ {
61+ if (m_useFFT) {
62+ return m_filterFFT->process (in, out);
63+ } else {
64+ m_buffer[m_bufferPos++] = m_filterFIR->filter (in);
65+ }
66+
67+ if (m_bufferPos < flen2) {
68+ *out = nullptr ;
69+ return 0 ;
70+ }
71+
72+ m_bufferPos = 0 ;
73+ *out = m_buffer;
74+ return flen2;
75+ }
76+
3177ChannelAnalyzerSink::ChannelAnalyzerSink () :
3278 m_channelSampleRate(48000 ),
3379 m_channelFrequencyOffset(0 ),
@@ -39,7 +85,8 @@ ChannelAnalyzerSink::ChannelAnalyzerSink() :
3985 m_magsq = 0 ;
4086 SSBFilter = new fftfilt (m_settings.m_lowCutoff / m_channelSampleRate, m_settings.m_bandwidth / m_channelSampleRate, m_ssbFftLen);
4187 DSBFilter = new fftfilt (m_settings.m_bandwidth / m_channelSampleRate, 2 *m_ssbFftLen);
42- RRCFilter = new fftfilt (m_settings.m_bandwidth / m_channelSampleRate, 2 *m_ssbFftLen);
88+ m_rrcHelper = new RRCHelper (2 *m_ssbFftLen);
89+ // m_rrcHelper->setUseFFT(true);
4390 m_corr = new fftcorr (2 *m_corrFFTLen); // 8k for 4k effective samples
4491 m_pll.computeCoefficients (m_settings.m_pllBandwidth , m_settings.m_pllDampingFactor , m_settings.m_pllLoopGain );
4592 m_costasLoop.computeCoefficients (m_settings.m_pllBandwidth );
@@ -52,7 +99,7 @@ ChannelAnalyzerSink::~ChannelAnalyzerSink()
5299{
53100 delete SSBFilter;
54101 delete DSBFilter;
55- delete RRCFilter ;
102+ delete m_rrcHelper ;
56103 delete m_corr;
57104}
58105
@@ -126,7 +173,7 @@ void ChannelAnalyzerSink::processOneSample(Complex& c, fftfilt::cmplx *sideband)
126173 else
127174 {
128175 if (m_settings.m_rrc ) {
129- n_out = RRCFilter ->runFilt (c, &sideband);
176+ n_out = m_rrcHelper ->runFilt (c, &sideband);
130177 } else {
131178 n_out = DSBFilter->runDSB (c, &sideband);
132179 }
@@ -240,7 +287,7 @@ void ChannelAnalyzerSink::setFilters(int sampleRate, float bandwidth, float lowC
240287
241288 SSBFilter->create_filter (lowCutoff / sampleRate, bandwidth / sampleRate);
242289 DSBFilter->create_dsb_filter (bandwidth / sampleRate);
243- RRCFilter-> create_rrc_filter (bandwidth / sampleRate, m_settings.m_rrcRolloff / 100.0 );
290+ m_rrcHelper-> create (bandwidth / sampleRate, m_settings.m_rrcRolloff / 100.0 , m_settings. m_rrcSymbolSpan , (FIRFilterRRC::Normalization) m_settings. m_rrcNormalization );
244291}
245292
246293void ChannelAnalyzerSink::applySettings (const ChannelAnalyzerSettings& settings, const QStringList& settingsKeys, bool force)
@@ -314,6 +361,29 @@ void ChannelAnalyzerSink::applySettings(const ChannelAnalyzerSettings& settings,
314361 }
315362 }
316363
364+ if (settings.m_rrcType != m_settings.m_rrcType || force)
365+ {
366+ m_rrcHelper->setUseFFT (settings.m_rrcType == ChannelAnalyzerSettings::RRCFFT);
367+ }
368+
369+ if (settings.m_rrcSymbolSpan != m_settings.m_rrcSymbolSpan || force)
370+ {
371+ m_rrcHelper->create (m_settings.m_bandwidth / (float ) m_sinkSampleRate, m_settings.m_rrcRolloff / 100.0 , settings.m_rrcSymbolSpan , (FIRFilterRRC::Normalization) m_settings.m_rrcNormalization );
372+ }
373+
374+ if (settings.m_rrcNormalization != m_settings.m_rrcNormalization || force)
375+ {
376+ m_rrcHelper->create (m_settings.m_bandwidth / (float ) m_sinkSampleRate, m_settings.m_rrcRolloff / 100.0 , m_settings.m_rrcSymbolSpan , (FIRFilterRRC::Normalization) settings.m_rrcNormalization );
377+ }
378+
379+ if (settings.m_rrcFFTLog2Size != m_settings.m_rrcFFTLog2Size || force)
380+ {
381+ delete m_rrcHelper;
382+ m_rrcHelper = new RRCHelper (1 << settings.m_rrcFFTLog2Size );
383+ m_rrcHelper->create (settings.m_bandwidth / (float ) m_sinkSampleRate, settings.m_rrcRolloff / 100.0 , settings.m_rrcSymbolSpan , (FIRFilterRRC::Normalization) settings.m_rrcNormalization );
384+ m_rrcHelper->setUseFFT (settings.m_rrcType == ChannelAnalyzerSettings::RRCFFT);
385+ }
386+
317387 if (force) {
318388 m_settings = settings;
319389 } else {
@@ -383,5 +453,5 @@ void ChannelAnalyzerSink::applySampleRate()
383453 m_pll.setSampleRate (sampleRate);
384454 m_fll.setSampleRate (sampleRate);
385455 m_costasLoop.setSampleRate (sampleRate);
386- RRCFilter-> create_rrc_filter (m_settings.m_bandwidth / (float ) sampleRate, m_settings.m_rrcRolloff / 100.0 );
456+ m_rrcHelper-> create (m_settings.m_bandwidth / (float ) sampleRate, m_settings.m_rrcRolloff / 100.0 , m_settings. m_rrcSymbolSpan , (FIRFilterRRC::Normalization) m_settings. m_rrcNormalization );
387457}
0 commit comments