140 lines
6.4 KiB
C
140 lines
6.4 KiB
C
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
|
|
/************************************************************************************
|
|
** **
|
|
** UHSDR **
|
|
** a powerful firmware for STM32 based SDR transceivers **
|
|
** **
|
|
**---------------------------------------------------------------------------------**
|
|
** **
|
|
** File name: **
|
|
** Description: **
|
|
** Last Modified: **
|
|
** Licence: GNU GPLv3 **
|
|
************************************************************************************/
|
|
|
|
#ifndef __AUDIO_NR_H
|
|
#define __AUDIO_NR_H
|
|
|
|
#include "uhsdr_board_config.h"
|
|
|
|
#ifdef USE_ALTERNATE_NR
|
|
// this contains our shared buffer structure, since FreeDV and NR are mutually exclusive
|
|
// they can use the same set of buffers for exchanging data between audio interrupt and
|
|
// user code
|
|
#include "freedv_uhsdr.h"
|
|
|
|
#define NR_FFT_SIZE 128
|
|
|
|
// for the mcHF, we would uncomment all those four // !
|
|
//#if defined(STM32F7) || defined(STM32H7)
|
|
#define NR_FFT_L_2 (NR_FFT_SIZE * 2) // for NR FFT size 256
|
|
//#else
|
|
//#define NR_FFT_L_2 (NR_FFT_SIZE) // for NR FFT size 128
|
|
//#endif
|
|
|
|
|
|
|
|
// we need another struct, because of the need for strict allocation of memory for users of the
|
|
// mcHF hardware with small RAM (192 kb)
|
|
typedef struct NoiseReduction2 // declaration
|
|
{
|
|
float32_t Hk[NR_FFT_L_2 / 2]; // gain factors
|
|
float32_t X[NR_FFT_L_2 / 2][2]; // magnitudes of the current and the last FFT bins
|
|
//float32_t X[NR_FFT_L/2]; // magnitudes of the current and the last FFT bins
|
|
// float32_t long_tone_gain[NR_FFT_L_2 / 2];
|
|
// float32_t long_tone[NR_FFT_L_2 / 2][2];
|
|
// int VAD_delay;
|
|
// int VAD_duration; //takes the duration of the last vowel
|
|
// uint32_t VAD_crash_detector; // this is counted upwards during speech detection, if noise is detected, it is reset to zero
|
|
// if it exceeds a certain limit, noise estimate is done irrespective of the VAD value
|
|
// this helps to get the noise estimate out of a very low position --> "VAD crash"
|
|
// uint8_t VAD_type; // 0 = Sohn et al. VAD, 1 = Esch & Vary 2009 VAD
|
|
bool notch_change; // indicates that notch filter has to be changed
|
|
// uint32_t long_tone_counter[NR_FFT_L_2 / 2]; // holds the notch index for every bin, the higher, the more notchworthy is a bin
|
|
uint8_t notch1_bin; // frequency bin where notch filter 1 has to work
|
|
uint8_t max_bin; // holds the bin number of the strongest persistent tone during tone detection
|
|
float32_t long_tone_max; // power value of the strongest persistent tone, used for max search
|
|
bool notch1_active; // is notch1 active?
|
|
bool notch2_active; // is notch21 active?
|
|
bool notch3_active; // is notch3 active?
|
|
bool notch4_active; // is notch4 active?
|
|
//float32_t tax; // for NR devel2: noise output smoothing time constant = -tinc/ln(0.8)
|
|
//int16_t tax_int;
|
|
//float32_t tap; // for NR devel2: speech prob smoothing time constant = -tinc/ln(0.9) tinc = frame time (5.33ms)
|
|
//int16_t tap_int;
|
|
int16_t asnr; // for NR devel2: active SNR in dB
|
|
float32_t ax;
|
|
float32_t ap;
|
|
float32_t xih1;
|
|
float32_t xih1r;
|
|
float32_t pfac;
|
|
int16_t snr_prio_min_int;
|
|
float32_t snr_prio_min;
|
|
int16_t NN;// for musical noise reduction
|
|
int16_t width;// for musical noise reduction
|
|
float32_t pre_power;// for musical noise reduction
|
|
float32_t post_power;// for musical noise reduction
|
|
float32_t power_ratio; // for musical noise reduction
|
|
float32_t power_threshold;
|
|
int16_t power_threshold_int;
|
|
} NoiseReduction2;
|
|
|
|
extern NoiseReduction2 NR2; // declaration, definition is in audio_nr.c
|
|
|
|
typedef struct
|
|
{
|
|
bool enable; // enable spectral noise reduction
|
|
uint8_t first_time; // set to 1 for initialization of the NR variables
|
|
|
|
float32_t alpha; // alpha smoothing constant for spectral noise reduction
|
|
float32_t beta; // beta smoothing constant for spectral noise reduction
|
|
|
|
// bool gain_smooth_enable; // enable gain smoothing
|
|
// float32_t gain_smooth_alpha; // smoothing constant for gain smoothing in the spectral noise reduction
|
|
// bool long_tone_enable; // enable elimination of long tones in the spectral NR algorithm
|
|
// float32_t long_tone_alpha; // time constant for long tone detection
|
|
// int16_t long_tone_thresh; // threshold for long tone detection
|
|
// bool long_tone_reset; // used to reset gains of the long tone detection to 1.0
|
|
// int16_t vad_delay; // how many frames to delay the noise estimate after VAD has detected NOISE
|
|
// int16_t mode;
|
|
// float32_t vad_thresh; // threshold for voice activity detector in spectral noise reduction
|
|
|
|
bool fft_256_enable; // debugging: enable FFT256 instead of FFT128 for spectral NR
|
|
|
|
uint16_t NR_FFT_L; // resulting FFT length: 128 or 256
|
|
uint8_t NR_FFT_LOOP_NO;
|
|
bool NR_decimation_enable; // set to true, if we want to use another decimation step for the spectral NR leading to 6ksps sample rate
|
|
bool NR_decimation_active; // set to true if the current buffer content is "double decimated" down to 6khz, set by the buffer producer
|
|
|
|
} audio_nr_params_t;
|
|
|
|
extern audio_nr_params_t nr_params;
|
|
|
|
|
|
void NR_Init(void);
|
|
|
|
void AudioNr_Prepare(void);
|
|
void AudioNr_HandleNoiseReduction(void);
|
|
void AudioNr_ActivateAutoNotch(uint8_t notch1_bin, bool notch1_active);
|
|
|
|
|
|
int NR_in_buffer_peek(NR_Buffer** c_ptr);
|
|
int NR_in_buffer_remove(NR_Buffer** c_ptr);
|
|
/* no room left in the buffer returns 0 */
|
|
int NR_in_buffer_add(NR_Buffer* c);
|
|
void NR_in_buffer_reset(void);
|
|
int8_t NR_in_has_data(void);
|
|
int32_t NR_in_has_room(void);
|
|
|
|
|
|
int NR_out_buffer_peek(NR_Buffer** c_ptr);
|
|
int NR_out_buffer_remove(NR_Buffer** c_ptr);
|
|
/* no room left in the buffer returns 0 */
|
|
int NR_out_buffer_add(NR_Buffer* c);
|
|
void NR_out_buffer_reset(void);
|
|
int8_t NR_out_has_data(void);
|
|
int32_t NR_out_has_room(void);
|
|
#endif
|
|
|
|
#endif
|