UHSDR/UHSDR-active-devel/mchf-eclipse/drivers/audio/audio_nr.h
2022-11-08 16:13:55 +01:00

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