lab 1 code

Dependencies:   CMSIS-DSP_for_STM32F746G BSP_DISCO_F746NG

Committer:
bmazzeo
Date:
Wed Jan 01 06:47:21 2020 +0000
Revision:
25:5412779376a7
Parent:
24:9ac1187f9012
Child:
27:0d65cfcc9001
Working example!!! - L channel has lowpass filter. Proper initialization of filters is performed. Output is clean.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bmazzeo 23:d938f87dd1ee 1 /**
bmazzeo 23:d938f87dd1ee 2 ******************************************************************************
bmazzeo 23:d938f87dd1ee 3 * @file signal_processing.c
bmazzeo 23:d938f87dd1ee 4 * @author Brian Mazzeo
bmazzeo 23:d938f87dd1ee 5 * @date 2020
bmazzeo 23:d938f87dd1ee 6 * @brief This file provides a set of code for signal processing in 487.
bmazzeo 23:d938f87dd1ee 7 * Parts are taken from example code from STMIcroelectronics
bmazzeo 23:d938f87dd1ee 8 ******************************************************************************
bmazzeo 23:d938f87dd1ee 9 * @attention
bmazzeo 23:d938f87dd1ee 10 * This code was specifically developed for BYU ECEn 487 course
bmazzeo 23:d938f87dd1ee 11 * Introduction to Digital Signal Processing.
bmazzeo 23:d938f87dd1ee 12 *
bmazzeo 23:d938f87dd1ee 13 *
bmazzeo 23:d938f87dd1ee 14 ******************************************************************************
bmazzeo 23:d938f87dd1ee 15 */
bmazzeo 23:d938f87dd1ee 16
bmazzeo 23:d938f87dd1ee 17 #include "mbed.h"
bmazzeo 23:d938f87dd1ee 18 #include "stm32746g_discovery_lcd.h"
bmazzeo 24:9ac1187f9012 19 #include "arm_math.h"
bmazzeo 24:9ac1187f9012 20
bmazzeo 24:9ac1187f9012 21
bmazzeo 24:9ac1187f9012 22 /* ----------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 23 ** Macro Defines
bmazzeo 24:9ac1187f9012 24 ** ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 25
bmazzeo 24:9ac1187f9012 26 #define AUDIO_BLOCK_SAMPLES ((uint32_t)128) // Number of samples (L and R) in audio block (each samples is 16 bits)
bmazzeo 24:9ac1187f9012 27 #define TEST_LENGTH_SAMPLES 320
bmazzeo 24:9ac1187f9012 28 #define SNR_THRESHOLD_F32 140.0f
bmazzeo 24:9ac1187f9012 29 #define BLOCK_SIZE 32
bmazzeo 24:9ac1187f9012 30 #define NUM_TAPS 29
bmazzeo 24:9ac1187f9012 31
bmazzeo 24:9ac1187f9012 32 /* ----------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 33 ** FIR Coefficients buffer generated using fir1() MATLAB function.
bmazzeo 24:9ac1187f9012 34 ** fir1(28, 6/24)
bmazzeo 24:9ac1187f9012 35 ** ------------------------------------------------------------------- */
bmazzeo 25:5412779376a7 36
bmazzeo 25:5412779376a7 37 /*
bmazzeo 24:9ac1187f9012 38 const float32_t firCoeffs32[NUM_TAPS] = {
bmazzeo 24:9ac1187f9012 39 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f,
bmazzeo 24:9ac1187f9012 40 -0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f,
bmazzeo 24:9ac1187f9012 41 +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f,
bmazzeo 24:9ac1187f9012 42 +0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
bmazzeo 24:9ac1187f9012 43 };
bmazzeo 25:5412779376a7 44 */
bmazzeo 25:5412779376a7 45
bmazzeo 25:5412779376a7 46 /* ----------------------------------------------------------------------
bmazzeo 25:5412779376a7 47 ** FIR Coefficients buffer generated using fdatool MATLAB function.
bmazzeo 25:5412779376a7 48 ** lowpass filter to passband 1 kHz, stopband 2 kHz
bmazzeo 25:5412779376a7 49 ** ------------------------------------------------------------------- */
bmazzeo 25:5412779376a7 50
bmazzeo 25:5412779376a7 51 const float32_t firCoeffs32[29] = {
bmazzeo 25:5412779376a7 52 0.0106548937, 0.00951616466, 0.008600869216, 0.002842310816,-0.007469337899,
bmazzeo 25:5412779376a7 53 -0.01967334561, -0.02897886001, -0.0296635218, -0.01692939363, 0.01112444047,
bmazzeo 25:5412779376a7 54 0.05218170211, 0.09966956824, 0.1441507041, 0.1758090258, 0.1872722059,
bmazzeo 25:5412779376a7 55 0.1758090258, 0.1441507041, 0.09966956824, 0.05218170211, 0.01112444047,
bmazzeo 25:5412779376a7 56 -0.01692939363, -0.0296635218, -0.02897886001, -0.01967334561,-0.007469337899,
bmazzeo 25:5412779376a7 57 0.002842310816, 0.008600869216, 0.00951616466, 0.0106548937
bmazzeo 25:5412779376a7 58 };
bmazzeo 25:5412779376a7 59
bmazzeo 24:9ac1187f9012 60
bmazzeo 24:9ac1187f9012 61 /* -------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 62 * Declare State buffer of size (numTaps + blockSize - 1)
bmazzeo 24:9ac1187f9012 63 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 64
bmazzeo 24:9ac1187f9012 65 static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];
bmazzeo 24:9ac1187f9012 66
bmazzeo 24:9ac1187f9012 67 /* -------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 68 * Declare Test output buffer
bmazzeo 24:9ac1187f9012 69 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 70
bmazzeo 24:9ac1187f9012 71 static float32_t testOutput[BLOCK_SIZE];
bmazzeo 24:9ac1187f9012 72 static float32_t output_array_F32[AUDIO_BLOCK_SAMPLES];
bmazzeo 24:9ac1187f9012 73
bmazzeo 24:9ac1187f9012 74 /* ------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 75 * Global variables for FIR LPF Example
bmazzeo 24:9ac1187f9012 76 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 77
bmazzeo 24:9ac1187f9012 78 uint32_t blockSize = BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 79 //uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 80 uint32_t numBlocks = AUDIO_BLOCK_SAMPLES/BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 81
bmazzeo 25:5412779376a7 82 /* Important to have the structure outside of the execution so it can be initialized */
bmazzeo 25:5412779376a7 83 arm_fir_instance_f32 S;
bmazzeo 23:d938f87dd1ee 84
bmazzeo 25:5412779376a7 85 /**
bmazzeo 25:5412779376a7 86 * @brief Initialize filter structures to be used in loops later
bmazzeo 25:5412779376a7 87 * @retval None
bmazzeo 25:5412779376a7 88 */
bmazzeo 25:5412779376a7 89 void initalize_signal_processing(void) {
bmazzeo 25:5412779376a7 90
bmazzeo 25:5412779376a7 91 /* Call FIR init function to initialize the instance structure. */
bmazzeo 25:5412779376a7 92 arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);
bmazzeo 25:5412779376a7 93
bmazzeo 25:5412779376a7 94 }
bmazzeo 23:d938f87dd1ee 95
bmazzeo 23:d938f87dd1ee 96 /**
bmazzeo 23:d938f87dd1ee 97 * @brief Process audio channel signals
bmazzeo 23:d938f87dd1ee 98 * @param L_channel: Pointer to Left channel data (float)
bmazzeo 23:d938f87dd1ee 99 * @param R_channel: Pointer to Right channel data (float)
bmazzeo 23:d938f87dd1ee 100 * @param Signal_Length: length of data to process
bmazzeo 23:d938f87dd1ee 101 * @retval None
bmazzeo 23:d938f87dd1ee 102 */
bmazzeo 23:d938f87dd1ee 103 void process_audio_channel_signals(float* L_channel, float* R_channel, uint16_t Signal_Length)
bmazzeo 23:d938f87dd1ee 104 {
bmazzeo 23:d938f87dd1ee 105 char buf[40];
bmazzeo 23:d938f87dd1ee 106
bmazzeo 23:d938f87dd1ee 107 BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
bmazzeo 23:d938f87dd1ee 108 sprintf(buf, "Processing Signals" );
bmazzeo 23:d938f87dd1ee 109 BSP_LCD_DisplayStringAt(0, 150, (uint8_t *) buf, LEFT_MODE);
bmazzeo 23:d938f87dd1ee 110
bmazzeo 24:9ac1187f9012 111
bmazzeo 24:9ac1187f9012 112 uint32_t i;
bmazzeo 24:9ac1187f9012 113 arm_status status;
bmazzeo 24:9ac1187f9012 114 float32_t *inputF32, *outputF32;
bmazzeo 24:9ac1187f9012 115
bmazzeo 24:9ac1187f9012 116 /* Initialize input and output buffer pointers */
bmazzeo 24:9ac1187f9012 117 //inputF32 = &testInput_f32_1kHz_15kHz[0];
bmazzeo 24:9ac1187f9012 118 //outputF32 = &testOutput[0];
bmazzeo 24:9ac1187f9012 119 inputF32 = L_channel;
bmazzeo 24:9ac1187f9012 120 outputF32 = &output_array_F32[0];
bmazzeo 24:9ac1187f9012 121
bmazzeo 24:9ac1187f9012 122
bmazzeo 24:9ac1187f9012 123 /* ----------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 124 ** Call the FIR process function for every blockSize samples
bmazzeo 24:9ac1187f9012 125 ** ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 126
bmazzeo 24:9ac1187f9012 127 for(i=0; i < numBlocks; i++)
bmazzeo 24:9ac1187f9012 128 {
bmazzeo 24:9ac1187f9012 129 arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
bmazzeo 24:9ac1187f9012 130 }
bmazzeo 24:9ac1187f9012 131
bmazzeo 24:9ac1187f9012 132 /* The following just passes things from the input to the output */
bmazzeo 24:9ac1187f9012 133 //uint16_t i;
bmazzeo 24:9ac1187f9012 134 float32_t* L_chan_mem_address;
bmazzeo 24:9ac1187f9012 135 float32_t* R_chan_mem_address;
bmazzeo 24:9ac1187f9012 136 float32_t L_audio_value;
bmazzeo 24:9ac1187f9012 137 float32_t R_audio_value;
bmazzeo 23:d938f87dd1ee 138
bmazzeo 23:d938f87dd1ee 139 L_chan_mem_address = L_channel;
bmazzeo 23:d938f87dd1ee 140 R_chan_mem_address = R_channel;
bmazzeo 23:d938f87dd1ee 141
bmazzeo 23:d938f87dd1ee 142 for (i=0; i<Signal_Length; i++)
bmazzeo 23:d938f87dd1ee 143 {
bmazzeo 24:9ac1187f9012 144 //L_audio_value = *L_chan_mem_address;
bmazzeo 24:9ac1187f9012 145 L_audio_value = output_array_F32[i];
bmazzeo 24:9ac1187f9012 146 *L_chan_mem_address = L_audio_value;
bmazzeo 23:d938f87dd1ee 147 L_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 148
bmazzeo 23:d938f87dd1ee 149 R_audio_value = *R_chan_mem_address;
bmazzeo 24:9ac1187f9012 150 *R_chan_mem_address = R_audio_value;
bmazzeo 23:d938f87dd1ee 151 R_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 152 }
bmazzeo 23:d938f87dd1ee 153
bmazzeo 23:d938f87dd1ee 154 }