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

79 lines
3.1 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 **
** **
**--------------------------------------------------------------------------------**
** **
** Description: Code for fast convolution filtering **
** Licence: GNU GPLv3 **
************************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __AUDIO_CONVOLUTION_H
#define __AUDIO_CONVOLUTION_H
#include "arm_math.h"
//#include "softdds.h"
#include "uhsdr_hw_i2s.h"
#include "uhsdr_board.h"
#include "codec.h"
#include "audio_driver.h"
#include "radio_management.h"
#include "usbd_audio_if.h"
#define SAMPLE_BUFFER_SIZE 256
#define SAMPLE_BUFFER_NUM 4
#define SAMPLE_BUFFER_FIFO_SIZE (SAMPLE_BUFFER_NUM + 1)
extern arm_fir_decimate_instance_f32 DECIMATE_RX_I;
extern arm_fir_decimate_instance_f32 DECIMATE_RX_Q;
//extern AudioDriverBuffer adb;
#ifdef USE_CONVOLUTION
#define FFT_CONVOLUTION_SIZE 256
#define CONVOLUTION_MAX_NO_OF_BLOCKS 8
#define CONVOLUTION_MAX_NO_OF_COEFFS 2048
#endif
#ifdef USE_CONVOLUTION
typedef struct
{
// for convolution filtering
float32_t i_buffer_convolution[FFT_CONVOLUTION_SIZE / 2];
float32_t q_buffer_convolution[FFT_CONVOLUTION_SIZE / 2];
float32_t fmask[CONVOLUTION_MAX_NO_OF_BLOCKS][FFT_CONVOLUTION_SIZE * 2];
float32_t fftin[FFT_CONVOLUTION_SIZE * 2];
float32_t fftout[CONVOLUTION_MAX_NO_OF_BLOCKS][FFT_CONVOLUTION_SIZE * 2];
float32_t ifftout[FFT_CONVOLUTION_SIZE * 2];
float32_t accum[FFT_CONVOLUTION_SIZE * 2];
float32_t a_buffer[2][FFT_CONVOLUTION_SIZE / 2]; // for convolution, we need an output buffer of 128 samples
} ConvolutionBuffers;
typedef struct
{
// for convolution filtering
int nc; // no. of coefficients
int size; // no. of input samples
int nfor; // no. of blocks in the convolution
int buffidx; // buffer pointer
int DF; // decimation factor
float32_t impulse[CONVOLUTION_MAX_NO_OF_COEFFS * 2]; // impulse response has real and imaginary components
float32_t maskgen[FFT_CONVOLUTION_SIZE * 2];
} ConvolutionBuffersShared;
extern ConvolutionBuffersShared cbs;
void AudioDriver_CalcConvolutionFilterCoeffs (int N, float32_t f_low, float32_t f_high, float32_t samplerate, int wintype, int rtype, float32_t scale);
void AudioDriver_RxProcessorConvolution(AudioSample_t * const src, AudioSample_t * const dst, const uint16_t blockSize);
void convolution_handle(void);
#endif
#endif