ubitx-v5x/TeensyDSP/DSP.h

190 lines
3.9 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
#define MAX_RX_FILTER_HI 5000
#define MIN_RX_FILTER_WIDTH 0
#define MAX_RX_FILTER_WIDTH 5000
#define MIN_RX_FILTER_CENTER 0
#define MAX_RX_FILTER_CENTER 5000
#define DSP_MILLIS_PER_UPDATE 100
#define RX_RIG_IN_CH 0
#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_VOX_USB_THRESH 0.25
#define TX_VOX_LINE_THRESH 0.25
#define TX_VOX_DELAY 500
struct DSPState {
// RX audio output settings
// RX filter settings
int rxFilterLo = 300;
int rxFilterHi = 3000;
// 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};
struct {
bool mute = true;
float level = 0.1;
} tx[NUM_TX_AUDIO_CH];
struct {
bool mute = true;
float level = 1.0;
} rx[NUM_RX_AUDIO_CH];
// VOX settings
/* struct {
bool isActive = false;
bool isUSB = false;
float usbThresh = TX_VOX_USB_THRESH;
float lineLevel = TX_VOX_LINE_THRESH;
unsigned delay = TX_VOX_DELAY;*/
unsigned voxTimeout[3];
};
enum TRState {
TRANSMIT,
RECEIVE
};
enum RxAudioIn {
RIG_IN = 0,
NUM_RX_AUDIO_IN
};
enum RxAudioCh {
RX_AUDIO = 0,
RX_SPARE1,
RX_SPARE2,
RX_SPARE3,
NUM_RX_AUDIO_CH
};
enum TxAudioIn {
MIC_IN = 0,
LINE_IN,
USB_IN,
TUNE_IN,
TWO_TONE_IN,
NUM_TX_AUDIO_IN
};
enum TxAudioCh {
TX_LINE = 0,
TX_USB,
TX_TONE1,
TX_TONE2,
NUM_TX_AUDIO_CH
};
class UBitxDSP {
public:
UBitxDSP();
void begin();
void update();
void end();
void rx();
inline void tx() { tx(txSrc); }
void tx(TxAudioIn src);
inline void setTxAudioIn(TxAudioIn src) { txSrc = src; }
TxAudionIn getTxAudioIn() const { return txSrc; }
// RX audio output settings
// RX filter settings
void bypassRxFilter();
void setRxFilter(int lo, int hi);
void setRxFilterLo(int lo);
void setRxFilterHi(int hi);
void setRxFilterWidth(int width);
void setRxFilterCenter(int 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
inline void setDataVoxOn() { state.vox.isActive = true; }
inline void setDataVoxOff() { state.vox.isActive = false; }
inline void setDataVoxThreshold(float val) {
}
inline void setDataVoxThreshold(float val, bool isUSB) {
if (isUSB) {
state.vox.usbThresh = val;
} else {
state.vox.lineThresh = val;
}
}
private:
bool isTx = false;
void updateRxFilter();
DSPState state;
short coefficients[NUM_COEFFICIENTS];
elapsedMillis sinceLastUpdate;
TxAudioIn txSrc;
unsigned voxTimeout;
};
extern UBitxDSP DSP;
#endif
//======================================================================
// EOF
//======================================================================