HARDT - The Ham Radio DSP Toolkit
hfftoutput.h
1 #ifndef __HFFTOUTPUT_H
2 #define __HFFTOUTPUT_H
3 
4 #include <complex>
5 
6 #include "hfft.h"
7 #include "hmultiplier.h"
8 #include "hfirfilter.h"
9 #include "hdecimator.h"
10 #include "hmemorywriter.h"
11 #include "houtput.h"
12 #include "hbaseband.h"
13 
18 {
22  double* Spectrum;
23 
27  std::complex<double>* Result;
28 
32  int Size;
33 };
34 
40 template <class T>
41 class HFftOutput : public HOutput<T, HFftResults>
42 {
43  private:
44 
45  int _size;
46  int _average;
47  bool _isIq;
48  int _skip;
49  int _skipped;
50 
51  double* _spectrum;
52  std::complex<double>* _fftResult;
53  std::complex<double>* _result;
54 
55  int _count;
56  HWindow<T>* _window;
57 
58  T* _buffer;
59  std::complex<T>* _cxInput;
60 
61  HFft<T>* _fft;
62 
63  void Init();
64 
65  int _zoomFactor;
66  int _zoomCenter;
67  H_SAMPLE_RATE _zoomRate;
68  T* _zoomOutput;
69  HInputWriter<T>* _zoomInputWriter;
70  HBaseband<T>* _zoomBaseband;
71  HDecimator<T>* _zoomDecimator;
72  HMemoryWriter<T>* _zoomMemoryWriter;
73  T* Zoom(T* src, size_t size);
74  bool _zoomEnabled;
75 
76  public:
77 
103  HFftOutput(int size, int average, int skip, HWriter<HFftResults>* writer, HWindow<T>* window, H_SAMPLE_RATE zoomRate = 0, int zoomFactor = 1, int zoomCenter = 0);
104 
131  HFftOutput(int size, int average, int skip, HWriterConsumer<T>* consumer, HWindow<T>* window, H_SAMPLE_RATE zoomRate = 0, int zoomFactor = 1, int zoomCenter = 0);
132 
148  HFftOutput(int size, int average, int skip, HWriter<HFftResults>* writer, HWindow<T>* window, bool isIq);
149 
165  HFftOutput(int size, int average, int skip, HWriterConsumer<T>* consumer, HWindow<T>* window, bool isIq);
166 
171  {
172  delete _spectrum;
173  delete _fftResult;
174  delete _buffer;
175  delete _cxInput;
176  delete _fft;
177 
178  if( _zoomEnabled ) {
179  delete _zoomInputWriter;
180  delete _zoomBaseband;
181  delete _zoomDecimator;
182  delete _zoomOutput;
183  }
184  }
185 
189  int Output(T* src, size_t size);
190 
194  bool Command(HCommand* command) {
195  // No Further propagation of commands
196  return true;
197  }
198 
202  int Width() {
203  if( !_zoomEnabled ) {
204  HError("HFftOutput with zoom disabled cannot report FFT frequency span");
205  return 0;
206  }
207 
208  return (_zoomRate / 2) / _zoomFactor;
209  }
210 
214  int Left() {
215  if( !_zoomEnabled ) {
216  HError("HFftOutput with zoom disabled cannot report left FFT frequency");
217  return 0;
218  }
219 
220  return Center() - (Width() / 2);
221  }
222 
226  int Right() {
227  if( !_zoomEnabled ) {
228  HError("HFftOutput with zoom disabled cannot report right FFT frequency");
229  return 0;
230  }
231 
232  return Center() + (Width() / 2);
233  }
234 
238  int Center() {
239  if( !_zoomEnabled ) {
240  HError("HFftOutput with zoom disabled cannot report center FFT frequency");
241  return 0;
242  }
243 
244  return _zoomCenter == 0
245  ? _zoomRate / 4
246  : _zoomCenter;
247  }
248 
252  float BinSize() {
253  if( !_zoomEnabled ) {
254  HError("HFftOutput with zoom disabled cannot report FFT bin size");
255  return 0;
256  }
257 
258  return (((float) _zoomRate / 2) / ((float) _size / 2)) / (float) _zoomFactor;
259  }
260 
264  float BinSize(H_SAMPLE_RATE rate) {
265  return ((float) rate / 2) / ((float) _size / 2);
266  }
267 
271  H_SAMPLE_RATE Rate() {
272  if( !_zoomEnabled ) {
273  HError("HFftOutput with zoom disabled cannot report FFT rate");
274  return 0;
275  }
276 
277  return _zoomRate / _zoomFactor;
278  }
279 
283  void SetZoom(int zoomFactor, int zoomCenter);
284 
286  bool Start() {
287 
288  // Report first (empty) result
289  HLog("Initialize spectrum");
290  memset((void*) _spectrum, 0, (_size / 2) * sizeof(double));
291  memset((void*) _result, 0, (_size / 2) * sizeof(std::complex<double>));
292  HFftResults results;
293  results.Spectrum = &_spectrum[0];
294  results.Result = &_result[0];
295  results.Size = _size / 2;
296  HOutput<T, HFftResults>::Ready(&results, 1);
297 
298  return true;
299  }
300 
302  bool Stop() {
303 
304  // Report one last (empty) result
305  HLog("Clear spectrum");
306  memset((void*) _spectrum, 0, (_size / 2) * sizeof(double));
307  memset((void*) _result, 0, (_size / 2) * sizeof(std::complex<double>));
308  HFftResults results;
309  results.Spectrum = &_spectrum[0];
310  results.Result = &_result[0];
311  results.Size = _size / 2;
312  HOutput<T, HFftResults>::Ready(&results, 1);
313 
314  return true;
315  }
316 };
317 
318 #endif
HWindow
Definition: hwindow.h:8
HMemoryWriter
Definition: hmemorywriter.h:15
HFftOutput::BinSize
float BinSize(H_SAMPLE_RATE rate)
Definition: hfftoutput.h:264
HWriter< HFftResults >
HFftOutput::Output
int Output(T *src, size_t size)
Definition: hfftoutput.cpp:167
HFftOutput::Stop
bool Stop()
Definition: hfftoutput.h:302
HOutput::Ready
void Ready()
Definition: houtput.h:61
HInputWriter
Definition: hinputwriter.h:12
HFftOutput::SetZoom
void SetZoom(int zoomFactor, int zoomCenter)
Definition: hfftoutput.cpp:130
HOutput
Definition: houtput.h:27
HFftOutput::Left
int Left()
Definition: hfftoutput.h:214
HBaseband
Definition: hbaseband.h:19
HFftResults
Definition: hfftoutput.h:17
HFftOutput::BinSize
float BinSize()
Definition: hfftoutput.h:252
HFftResults::Size
int Size
Definition: hfftoutput.h:32
HFftOutput::Width
int Width()
Definition: hfftoutput.h:202
HFftOutput::HFftOutput
HFftOutput(int size, int average, int skip, HWriter< HFftResults > *writer, HWindow< T > *window, H_SAMPLE_RATE zoomRate=0, int zoomFactor=1, int zoomCenter=0)
Definition: hfftoutput.cpp:11
HFftResults::Spectrum
double * Spectrum
Definition: hfftoutput.h:22
HFftOutput::Center
int Center()
Definition: hfftoutput.h:238
HFftOutput::Right
int Right()
Definition: hfftoutput.h:226
HCommand
Definition: hcommand.h:81
HFftOutput
Definition: hfftoutput.h:41
HFftOutput::~HFftOutput
~HFftOutput()
Definition: hfftoutput.h:170
HFftOutput::Rate
H_SAMPLE_RATE Rate()
Definition: hfftoutput.h:271
HFft
Definition: hfft.h:12
HFftResults::Result
std::complex< double > * Result
Definition: hfftoutput.h:27
HFftOutput::Start
bool Start()
Definition: hfftoutput.h:286
HFftOutput::Command
bool Command(HCommand *command)
Definition: hfftoutput.h:194
HDecimator
Definition: hdecimator.h:13
HWriterConsumer
Definition: hwriterconsumer.h:8