2014-06-27 16:36:13 +00:00
|
|
|
/*
|
2017-03-16 01:45:51 +00:00
|
|
|
* Filters from Fldigi.
|
2014-06-27 16:36:13 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _FFTFILT_H
|
|
|
|
#define _FFTFILT_H
|
|
|
|
|
2015-05-15 09:29:41 +00:00
|
|
|
#include <complex>
|
2014-06-27 16:36:13 +00:00
|
|
|
#include "gfft.h"
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
|
|
|
|
class fftfilt {
|
|
|
|
enum {NONE, BLACKMAN, HAMMING, HANNING};
|
|
|
|
|
2015-05-15 09:29:41 +00:00
|
|
|
public:
|
|
|
|
typedef std::complex<float> cmplx;
|
|
|
|
|
|
|
|
fftfilt(float f1, float f2, int len);
|
2015-06-21 10:46:47 +00:00
|
|
|
fftfilt(float f2, int len);
|
2015-05-15 09:29:41 +00:00
|
|
|
~fftfilt();
|
|
|
|
// f1 < f2 ==> bandpass
|
|
|
|
// f1 > f2 ==> band reject
|
|
|
|
void create_filter(float f1, float f2);
|
2015-06-21 10:46:47 +00:00
|
|
|
void create_dsb_filter(float f2);
|
2017-03-16 09:11:03 +00:00
|
|
|
void create_asym_filter(float fopp, float fin); //!< two different filters for in band and opposite band
|
2015-05-15 09:29:41 +00:00
|
|
|
|
2015-06-21 10:46:47 +00:00
|
|
|
int noFilt(const cmplx& in, cmplx **out);
|
2015-05-15 09:29:41 +00:00
|
|
|
int runFilt(const cmplx& in, cmplx **out);
|
2017-03-15 14:37:51 +00:00
|
|
|
int runSSB(const cmplx& in, cmplx **out, bool usb, bool getDC = true);
|
2015-06-21 10:46:47 +00:00
|
|
|
int runDSB(const cmplx& in, cmplx **out);
|
2017-03-16 09:11:03 +00:00
|
|
|
int runAsym(const cmplx & in, cmplx **out, bool usb); //!< Asymmetrical fitering can be used for vestigial sideband
|
2015-05-15 09:29:41 +00:00
|
|
|
|
2014-06-27 16:36:13 +00:00
|
|
|
protected:
|
|
|
|
int flen;
|
|
|
|
int flen2;
|
|
|
|
g_fft<float> *fft;
|
|
|
|
g_fft<float> *ift;
|
|
|
|
cmplx *filter;
|
2017-03-16 09:11:03 +00:00
|
|
|
cmplx *filterOpp;
|
2014-12-25 21:24:03 +00:00
|
|
|
cmplx *data;
|
2014-06-27 16:36:13 +00:00
|
|
|
cmplx *ovlbuf;
|
|
|
|
cmplx *output;
|
|
|
|
int inptr;
|
|
|
|
int pass;
|
|
|
|
int window;
|
|
|
|
|
|
|
|
inline float fsinc(float fc, int i, int len) {
|
2017-03-16 01:45:51 +00:00
|
|
|
return (i == len/2) ? 2.0 * fc:
|
2014-06-27 16:36:13 +00:00
|
|
|
sin(2 * M_PI * fc * (i - len/2)) / (M_PI * (i - len/2));
|
|
|
|
}
|
2015-06-21 10:46:47 +00:00
|
|
|
|
2014-06-27 16:36:13 +00:00
|
|
|
inline float _blackman(int i, int len) {
|
2017-03-16 01:45:51 +00:00
|
|
|
return (0.42 -
|
|
|
|
0.50 * cos(2.0 * M_PI * i / len) +
|
2014-06-27 16:36:13 +00:00
|
|
|
0.08 * cos(4.0 * M_PI * i / len));
|
|
|
|
}
|
2015-06-21 10:46:47 +00:00
|
|
|
|
2014-06-27 16:36:13 +00:00
|
|
|
void init_filter();
|
2015-06-21 10:46:47 +00:00
|
|
|
void init_dsb_filter();
|
2014-06-27 16:36:13 +00:00
|
|
|
};
|
|
|
|
|
2015-01-11 19:30:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Sliding FFT filter from Fldigi */
|
|
|
|
class sfft {
|
|
|
|
#define K1 0.99999
|
2015-05-15 09:29:41 +00:00
|
|
|
public:
|
|
|
|
typedef std::complex<float> cmplx;
|
|
|
|
sfft(int len);
|
|
|
|
~sfft();
|
|
|
|
void run(const cmplx& input);
|
|
|
|
void fetch(float *result);
|
2015-01-11 19:30:48 +00:00
|
|
|
private:
|
|
|
|
int fftlen;
|
|
|
|
int first;
|
|
|
|
int last;
|
|
|
|
int ptr;
|
|
|
|
struct vrot_bins_pair;
|
|
|
|
vrot_bins_pair *vrot_bins;
|
|
|
|
cmplx *delay;
|
|
|
|
float k2;
|
|
|
|
};
|
|
|
|
|
2014-06-27 16:36:13 +00:00
|
|
|
#endif
|