ubitx-v5x/TeensyDSP/DSP.h

146 lines
3.2 KiB
C++

//======================================================================
// DSP.h
//======================================================================
#ifndef __DSP_h__
#define __DSP_h__
#include <Audio.h>
#include <dynamicFilters.h>
#include "Debug.h"
#define MIN_RX_FILTER_LO 0.0
#define MAX_RX_FILTER_HI 5000.0
#define MIN_RX_FILTER_WIDTH 0.0
#define MAX_RX_FILTER_WIDTH 5000.0
#define MIN_RX_FILTER_CENTER 0.0
#define MAX_RX_FILTER_CENTER 5000.0
#define DSP_MILLIS_PER_UPDATE 100
#define TX_MIC_IN_CH 0
#define TX_LINE_IN_CH 0
#define TX_USB_IN_CH 1
#define TX_NUM_CHANNELS 2
#define TX_LINE_IN_VOX 0
#define TX_USB_IN_L_VOX 1
#define TX_USB_IN_R_VOX 2
#define TX_NUM_VOX 3
#define TX_LINE_IN_VOX_THRESH 0.25
#define TX_USB_IN_L_VOX_THRESH 0.25
#define TX_USB_IN_R_VOX_THRESH 0.25
#define TX_LINE_IN_VOX_DELAY 500
#define TX_USB_IN_L_VOX_DELAY 500
#define TX_USB_IN_R_VOX_DELAY 500
struct DSPState {
// RX audio output settings
// RX filter settings
float rxFilterLo = 300.0;
float rxFilterHi = 3000.0;
// TX audio input settings
float txInLvl[4] = {0.5, 0.5, 0.0, 0.0};
int txInEnable[4] = {1, 1, 0, 0};
int txInTx[4] = {0, 0, 0, 0};
// VOX settings
bool voxActive[3];
float voxThresh[3];
unsigned voxDelay[3];
unsigned voxTimeout[3];
};
enum TRState {
TRANSMIT,
RECEIVE
};
enum RxAudioIn {
RIG_AUDIO
};
enum TxAudioIn {
MIC_IN,
LINE_IN,
USB_IN
};
class UBitxDSP {
public:
UBitxDSP();
void begin();
void update();
void end();
void rx();
void txMicIn();
void txLineIn();
void txUSBIn();
// RX audio output settings
// RX filter settings
void bypassRxFilter();
void setRxFilter(float lo, float hi);
void setRxFilterLo(float lo);
void setRxFilterHi(float hi);
void setRxFilterWidth(float width);
void setRxFilterCenter(float center);
/*!
* @brief Get the current low frequency bound of the RX band pass filter.
* @return The low frequency bound.
*/
inline int getRxFilterLo() { return state.rxFilterLo; }
/*!
* @brief Get the current high frequency bound of the RX band pass filter.
* @return The high frequency bound.
*/
inline int getRxFilterHi() { return state.rxFilterHi; }
/*!
* @brief Get the current width of the RX band pass filter.
* @return The filter width.
*/
inline int getRxFilterWidth() { return state.rxFilterHi - state.rxFilterLo; }
/*!
* @brief Get the current center frequency of the RX band pass filter.
* @return The center frequency.
*/
inline int getRxFilterCenter() { return (state.rxFilterHi + state.rxFilterLo) / 2; }
// TX audio input settings
void setTxInputLevel(int ch, float lvl);
void enableTxInput(int ch);
void disableTxInput(int ch);
void startTxInput(int ch);
void stopTxInput(int ch);
// VOX settings
bool isVoxActive(int vox);
private:
void updateRxFilter();
DSPState state;
short coefficients[NUM_COEFFICIENTS];
elapsedMillis sinceLastUpdate;
AudioAnalyzeRMS* voxRMS[3];
};
extern UBitxDSP DSP;
#endif
//======================================================================
// EOF
//======================================================================