1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-05 00:11:16 -05:00
sdrangel/sdrbase/dsp/fftfilt.h

90 lines
1.9 KiB
C
Raw Normal View History

2014-06-27 12:36:13 -04:00
/*
* Filters from Fldigi.
2014-06-27 12:36:13 -04:00
*/
#ifndef _FFTFILT_H
#define _FFTFILT_H
#include <complex>
2014-06-27 12:36:13 -04:00
#include "gfft.h"
#include "export.h"
2014-06-27 12:36:13 -04:00
#undef M_PI
#define M_PI 3.14159265358979323846
2014-06-27 12:36:13 -04:00
//----------------------------------------------------------------------
2018-03-03 14:23:38 -05:00
class SDRBASE_API fftfilt {
2014-06-27 12:36:13 -04:00
enum {NONE, BLACKMAN, HAMMING, HANNING};
public:
typedef std::complex<float> cmplx;
fftfilt(float f1, float f2, int len);
fftfilt(float f2, int len);
~fftfilt();
// f1 < f2 ==> bandpass
// f1 > f2 ==> band reject
void create_filter(float f1, float f2);
void create_dsb_filter(float f2);
void create_asym_filter(float fopp, float fin); //!< two different filters for in band and opposite band
int noFilt(const cmplx& in, cmplx **out);
int runFilt(const cmplx& in, cmplx **out);
int runSSB(const cmplx& in, cmplx **out, bool usb, bool getDC = true);
int runDSB(const cmplx& in, cmplx **out);
int runAsym(const cmplx & in, cmplx **out, bool usb); //!< Asymmetrical fitering can be used for vestigial sideband
2014-06-27 12:36:13 -04:00
protected:
int flen;
int flen2;
g_fft<float> *fft;
cmplx *filter;
cmplx *filterOpp;
2014-12-25 16:24:03 -05:00
cmplx *data;
2014-06-27 12:36:13 -04:00
cmplx *ovlbuf;
cmplx *output;
int inptr;
int pass;
int window;
inline float fsinc(float fc, int i, int len) {
int len2 = len/2;
return (i == len2) ? 2.0 * fc:
sin(2 * M_PI * fc * (i - len2)) / (M_PI * (i - len2));
2014-06-27 12:36:13 -04:00
}
2014-06-27 12:36:13 -04:00
inline float _blackman(int i, int len) {
return (0.42 -
0.50 * cos(2.0 * M_PI * i / len) +
2014-06-27 12:36:13 -04:00
0.08 * cos(4.0 * M_PI * i / len));
}
2014-06-27 12:36:13 -04:00
void init_filter();
void init_dsb_filter();
2014-06-27 12:36:13 -04:00
};
2015-01-11 14:30:48 -05:00
/* Sliding FFT filter from Fldigi */
2018-03-03 14:23:38 -05:00
class SDRBASE_API sfft {
2015-01-11 14:30:48 -05:00
#define K1 0.99999
public:
typedef std::complex<float> cmplx;
sfft(int len);
~sfft();
void run(const cmplx& input);
void fetch(float *result);
2015-01-11 14:30:48 -05: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 12:36:13 -04:00
#endif