lab 1 code

Dependencies:   CMSIS-DSP_for_STM32F746G BSP_DISCO_F746NG

Committer:
bmazzeo
Date:
Wed Jan 01 17:31:05 2020 +0000
Revision:
27:0d65cfcc9001
Parent:
25:5412779376a7
Child:
28:fe7747b89fb3
Just cleaned up - changed the signal processing block size to be the same as the half block size - this cleans up the code considerably - but uses a bit more memory.

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 27:0d65cfcc9001 23 ** Defines for signal processing
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 NUM_TAPS 29
bmazzeo 24:9ac1187f9012 28
bmazzeo 24:9ac1187f9012 29 /* ----------------------------------------------------------------------
bmazzeo 25:5412779376a7 30 ** FIR Coefficients buffer generated using fdatool MATLAB function.
bmazzeo 25:5412779376a7 31 ** lowpass filter to passband 1 kHz, stopband 2 kHz
bmazzeo 25:5412779376a7 32 ** ------------------------------------------------------------------- */
bmazzeo 25:5412779376a7 33
bmazzeo 25:5412779376a7 34 const float32_t firCoeffs32[29] = {
bmazzeo 25:5412779376a7 35 0.0106548937, 0.00951616466, 0.008600869216, 0.002842310816,-0.007469337899,
bmazzeo 25:5412779376a7 36 -0.01967334561, -0.02897886001, -0.0296635218, -0.01692939363, 0.01112444047,
bmazzeo 25:5412779376a7 37 0.05218170211, 0.09966956824, 0.1441507041, 0.1758090258, 0.1872722059,
bmazzeo 25:5412779376a7 38 0.1758090258, 0.1441507041, 0.09966956824, 0.05218170211, 0.01112444047,
bmazzeo 25:5412779376a7 39 -0.01692939363, -0.0296635218, -0.02897886001, -0.01967334561,-0.007469337899,
bmazzeo 25:5412779376a7 40 0.002842310816, 0.008600869216, 0.00951616466, 0.0106548937
bmazzeo 25:5412779376a7 41 };
bmazzeo 25:5412779376a7 42
bmazzeo 24:9ac1187f9012 43
bmazzeo 24:9ac1187f9012 44 /* -------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 45 * Declare State buffer of size (numTaps + blockSize - 1)
bmazzeo 24:9ac1187f9012 46 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 47
bmazzeo 27:0d65cfcc9001 48 static float32_t firStateF32[AUDIO_BLOCK_SAMPLES + NUM_TAPS - 1];
bmazzeo 24:9ac1187f9012 49
bmazzeo 24:9ac1187f9012 50 static float32_t output_array_F32[AUDIO_BLOCK_SAMPLES];
bmazzeo 24:9ac1187f9012 51
bmazzeo 24:9ac1187f9012 52
bmazzeo 25:5412779376a7 53 /* Important to have the structure outside of the execution so it can be initialized */
bmazzeo 25:5412779376a7 54 arm_fir_instance_f32 S;
bmazzeo 23:d938f87dd1ee 55
bmazzeo 25:5412779376a7 56 /**
bmazzeo 25:5412779376a7 57 * @brief Initialize filter structures to be used in loops later
bmazzeo 25:5412779376a7 58 * @retval None
bmazzeo 25:5412779376a7 59 */
bmazzeo 25:5412779376a7 60 void initalize_signal_processing(void) {
bmazzeo 25:5412779376a7 61
bmazzeo 25:5412779376a7 62 /* Call FIR init function to initialize the instance structure. */
bmazzeo 27:0d65cfcc9001 63 arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], AUDIO_BLOCK_SAMPLES);
bmazzeo 25:5412779376a7 64
bmazzeo 25:5412779376a7 65 }
bmazzeo 23:d938f87dd1ee 66
bmazzeo 23:d938f87dd1ee 67 /**
bmazzeo 23:d938f87dd1ee 68 * @brief Process audio channel signals
bmazzeo 23:d938f87dd1ee 69 * @param L_channel: Pointer to Left channel data (float)
bmazzeo 23:d938f87dd1ee 70 * @param R_channel: Pointer to Right channel data (float)
bmazzeo 23:d938f87dd1ee 71 * @param Signal_Length: length of data to process
bmazzeo 23:d938f87dd1ee 72 * @retval None
bmazzeo 23:d938f87dd1ee 73 */
bmazzeo 23:d938f87dd1ee 74 void process_audio_channel_signals(float* L_channel, float* R_channel, uint16_t Signal_Length)
bmazzeo 23:d938f87dd1ee 75 {
bmazzeo 23:d938f87dd1ee 76 char buf[40];
bmazzeo 23:d938f87dd1ee 77
bmazzeo 23:d938f87dd1ee 78 BSP_LCD_SetTextColor(LCD_COLOR_CYAN);
bmazzeo 23:d938f87dd1ee 79 sprintf(buf, "Processing Signals" );
bmazzeo 23:d938f87dd1ee 80 BSP_LCD_DisplayStringAt(0, 150, (uint8_t *) buf, LEFT_MODE);
bmazzeo 23:d938f87dd1ee 81
bmazzeo 24:9ac1187f9012 82
bmazzeo 24:9ac1187f9012 83 uint32_t i;
bmazzeo 24:9ac1187f9012 84 arm_status status;
bmazzeo 24:9ac1187f9012 85 float32_t *inputF32, *outputF32;
bmazzeo 24:9ac1187f9012 86
bmazzeo 24:9ac1187f9012 87 inputF32 = L_channel;
bmazzeo 24:9ac1187f9012 88 outputF32 = &output_array_F32[0];
bmazzeo 24:9ac1187f9012 89
bmazzeo 24:9ac1187f9012 90 /* ----------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 91 ** Call the FIR process function for every blockSize samples
bmazzeo 24:9ac1187f9012 92 ** ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 93
bmazzeo 27:0d65cfcc9001 94 arm_fir_f32(&S, inputF32, outputF32, AUDIO_BLOCK_SAMPLES);
bmazzeo 24:9ac1187f9012 95
bmazzeo 24:9ac1187f9012 96 /* The following just passes things from the input to the output */
bmazzeo 24:9ac1187f9012 97 float32_t* L_chan_mem_address;
bmazzeo 24:9ac1187f9012 98 float32_t* R_chan_mem_address;
bmazzeo 24:9ac1187f9012 99 float32_t L_audio_value;
bmazzeo 24:9ac1187f9012 100 float32_t R_audio_value;
bmazzeo 23:d938f87dd1ee 101
bmazzeo 23:d938f87dd1ee 102 L_chan_mem_address = L_channel;
bmazzeo 23:d938f87dd1ee 103 R_chan_mem_address = R_channel;
bmazzeo 23:d938f87dd1ee 104
bmazzeo 23:d938f87dd1ee 105 for (i=0; i<Signal_Length; i++)
bmazzeo 23:d938f87dd1ee 106 {
bmazzeo 24:9ac1187f9012 107 //L_audio_value = *L_chan_mem_address;
bmazzeo 24:9ac1187f9012 108 L_audio_value = output_array_F32[i];
bmazzeo 24:9ac1187f9012 109 *L_chan_mem_address = L_audio_value;
bmazzeo 23:d938f87dd1ee 110 L_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 111
bmazzeo 23:d938f87dd1ee 112 R_audio_value = *R_chan_mem_address;
bmazzeo 24:9ac1187f9012 113 *R_chan_mem_address = R_audio_value;
bmazzeo 23:d938f87dd1ee 114 R_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 115 }
bmazzeo 23:d938f87dd1ee 116
bmazzeo 23:d938f87dd1ee 117 }