lab 1 code

Dependencies:   CMSIS-DSP_for_STM32F746G BSP_DISCO_F746NG

Committer:
bmazzeo
Date:
Wed Jan 01 06:30:01 2020 +0000
Revision:
24:9ac1187f9012
Parent:
23:d938f87dd1ee
Child:
25:5412779376a7
Functioning DSP block using arm_fir_f32 and the older dsp library to run it - but there may be some errors because some strange outputs were occurring in the output.

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 24:9ac1187f9012 36
bmazzeo 24:9ac1187f9012 37 const float32_t firCoeffs32[NUM_TAPS] = {
bmazzeo 24:9ac1187f9012 38 -0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f,
bmazzeo 24:9ac1187f9012 39 -0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f,
bmazzeo 24:9ac1187f9012 40 +0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f,
bmazzeo 24:9ac1187f9012 41 +0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
bmazzeo 24:9ac1187f9012 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 24:9ac1187f9012 48 static float32_t firStateF32[BLOCK_SIZE + NUM_TAPS - 1];
bmazzeo 24:9ac1187f9012 49
bmazzeo 24:9ac1187f9012 50 /* -------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 51 * Declare Test output buffer
bmazzeo 24:9ac1187f9012 52 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 53
bmazzeo 24:9ac1187f9012 54 static float32_t testOutput[BLOCK_SIZE];
bmazzeo 24:9ac1187f9012 55 static float32_t output_array_F32[AUDIO_BLOCK_SAMPLES];
bmazzeo 24:9ac1187f9012 56
bmazzeo 24:9ac1187f9012 57 /* ------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 58 * Global variables for FIR LPF Example
bmazzeo 24:9ac1187f9012 59 * ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 60
bmazzeo 24:9ac1187f9012 61 uint32_t blockSize = BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 62 //uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 63 uint32_t numBlocks = AUDIO_BLOCK_SAMPLES/BLOCK_SIZE;
bmazzeo 24:9ac1187f9012 64
bmazzeo 23:d938f87dd1ee 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_fir_instance_f32 S;
bmazzeo 24:9ac1187f9012 85 arm_status status;
bmazzeo 24:9ac1187f9012 86 float32_t *inputF32, *outputF32;
bmazzeo 24:9ac1187f9012 87
bmazzeo 24:9ac1187f9012 88 /* Initialize input and output buffer pointers */
bmazzeo 24:9ac1187f9012 89 //inputF32 = &testInput_f32_1kHz_15kHz[0];
bmazzeo 24:9ac1187f9012 90 //outputF32 = &testOutput[0];
bmazzeo 24:9ac1187f9012 91 inputF32 = L_channel;
bmazzeo 24:9ac1187f9012 92 outputF32 = &output_array_F32[0];
bmazzeo 24:9ac1187f9012 93
bmazzeo 24:9ac1187f9012 94 /* Call FIR init function to initialize the instance structure. */
bmazzeo 24:9ac1187f9012 95 arm_fir_init_f32(&S, NUM_TAPS, (float32_t *)&firCoeffs32[0], &firStateF32[0], blockSize);
bmazzeo 24:9ac1187f9012 96
bmazzeo 24:9ac1187f9012 97 /* ----------------------------------------------------------------------
bmazzeo 24:9ac1187f9012 98 ** Call the FIR process function for every blockSize samples
bmazzeo 24:9ac1187f9012 99 ** ------------------------------------------------------------------- */
bmazzeo 24:9ac1187f9012 100
bmazzeo 24:9ac1187f9012 101 for(i=0; i < numBlocks; i++)
bmazzeo 24:9ac1187f9012 102 {
bmazzeo 24:9ac1187f9012 103 arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize);
bmazzeo 24:9ac1187f9012 104 }
bmazzeo 24:9ac1187f9012 105
bmazzeo 24:9ac1187f9012 106 /* The following just passes things from the input to the output */
bmazzeo 24:9ac1187f9012 107 //uint16_t i;
bmazzeo 24:9ac1187f9012 108 float32_t* L_chan_mem_address;
bmazzeo 24:9ac1187f9012 109 float32_t* R_chan_mem_address;
bmazzeo 24:9ac1187f9012 110 float32_t L_audio_value;
bmazzeo 24:9ac1187f9012 111 float32_t R_audio_value;
bmazzeo 23:d938f87dd1ee 112
bmazzeo 23:d938f87dd1ee 113 L_chan_mem_address = L_channel;
bmazzeo 23:d938f87dd1ee 114 R_chan_mem_address = R_channel;
bmazzeo 23:d938f87dd1ee 115
bmazzeo 23:d938f87dd1ee 116 for (i=0; i<Signal_Length; i++)
bmazzeo 23:d938f87dd1ee 117 {
bmazzeo 24:9ac1187f9012 118 //L_audio_value = *L_chan_mem_address;
bmazzeo 24:9ac1187f9012 119 L_audio_value = output_array_F32[i];
bmazzeo 24:9ac1187f9012 120 *L_chan_mem_address = L_audio_value;
bmazzeo 23:d938f87dd1ee 121 L_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 122
bmazzeo 23:d938f87dd1ee 123 R_audio_value = *R_chan_mem_address;
bmazzeo 24:9ac1187f9012 124 *R_chan_mem_address = R_audio_value;
bmazzeo 23:d938f87dd1ee 125 R_chan_mem_address++;
bmazzeo 23:d938f87dd1ee 126 }
bmazzeo 23:d938f87dd1ee 127
bmazzeo 23:d938f87dd1ee 128 }