Skip to content

Instantly share code, notes, and snippets.

@unalfaruk
Last active April 29, 2022 19:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save unalfaruk/4419fa452e7a093376f8297d9a80e89a to your computer and use it in GitHub Desktop.
Save unalfaruk/4419fa452e7a093376f8297d9a80e89a to your computer and use it in GitHub Desktop.
Convolution on ARM Processor
#include "stm32wlxx_hal.h"
#include "arm_math.h" // ARM::CMSIS:DSP
#define SIG_LENGTH 250
#define IMP_RSP_LEN 29
#define NUM_TAPS 29
#define BLOCK_SIZE 32
uint32_t freq; //it is just for trace.. not related to DSP
extern void SystemClock_Config(void);
extern float32_t inputSignal_f32_1kHz_15kHz[SIG_LENGTH];
void plot_input_signal(void);
void plot_imp_response(void);
void convolution(float32_t * sig_in, uint32_t len_sig_in, float32_t * imp_response, uint32_t len_imp_response, float32_t * sig_out);
void plot_output_signal(void);
void plot_all(void);
float32_t outputSignal[IMP_RSP_LEN+SIG_LENGTH];
// Impulse reponse signal for low-pass filter
const float32_t impulseResponse[IMP_RSP_LEN] = {
-0.0018225230f, -0.0015879294f, +0.0000000000f, +0.0036977508f, +0.0080754303f, +0.0085302217f, -0.0000000000f, -0.0173976984f,
-0.0341458607f, -0.0333591565f, +0.0000000000f, +0.0676308395f, +0.1522061835f, +0.2229246956f, +0.2504960933f, +0.2229246956f,
+0.1522061835f, +0.0676308395f, +0.0000000000f, -0.0333591565f, -0.0341458607f, -0.0173976984f, -0.0000000000f, +0.0085302217f,
+0.0080754303f, +0.0036977508f, +0.0000000000f, -0.0015879294f, -0.0018225230f
};
float32_t inputSample, impResponseSample, outputSample;
int main(){
int i;
HAL_Init();
SystemClock_Config();
freq=HAL_RCC_GetHCLKFreq(); //it is just for trace.. not related to DSP
convolution((float32_t *)&inputSignal_f32_1kHz_15kHz[0], (uint32_t) SIG_LENGTH, (float32_t *)&impulseResponse[0], (uint32_t)IMP_RSP_LEN, (float32_t *)&outputSignal[0]);
HAL_Delay(1);
// plot_input_signal();
// HAL_Delay(1);
// plot_imp_response();
// HAL_Delay(1);
// plot_output_signal();
plot_all();
while(1)
{
}
}
// Plotting the input signal on the logic analyzer in Keil
void plot_input_signal(void)
{
int i, j;
for (i=0;i<SIG_LENGTH;i++){
inputSample=inputSignal_f32_1kHz_15kHz[i];
for(j=0;j<3000;j++){}
//if(i==SIG_LENGTH-1) i=0;
}
}
// Plotting the impulse response signal on the logic analyzer in Keil
void plot_imp_response(void)
{
int i, j;
for (i=0;i<IMP_RSP_LEN;i++){
impResponseSample=impulseResponse[i];
for(j=0;j<3000;j++){}
//if(i==SIG_LENGTH-1) i=0;
}
}
// Plotting only output signal on the logic analyzer in Keil
void plot_output_signal(void)
{
int i, j;
for (i=0;i<IMP_RSP_LEN+SIG_LENGTH;i++){
outputSample=outputSignal[i];
for(j=0;j<3000;j++){}
//if(i==IMP_RSP_LEN+SIG_LENGTH-1) i=0;
}
}
// Plotting all signals on the logic analyzer in Keil
void plot_all(void){
int i,j,g,k;
i=j=0;
for(k=0;k<(SIG_LENGTH+IMP_RSP_LEN);k++){
i++;
j++;
if(i<SIG_LENGTH) inputSample = inputSignal_f32_1kHz_15kHz[i];
if(j<IMP_RSP_LEN) impResponseSample = impulseResponse[j];
if(k<IMP_RSP_LEN+SIG_LENGTH-1) outputSample = outputSignal[k];
for(g=0;g<20000;g++){}
}
}
// Convolution function
void convolution(float32_t * sig_in, uint32_t len_sig_in, float32_t * imp_response, uint32_t len_imp_response, float32_t * sig_out){
uint16_t i,j;
for(i=0;i<(len_sig_in+len_imp_response);i++)
{
sig_out[i]=0;
}
for(i=0;i<len_sig_in;i++)
{
for(j=0;j<len_imp_response;j++)
{
sig_out[i+j] = sig_out[i+j]+sig_in[i]*imp_response[j];
}
}
}
void SysTick_Handler(void){
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
#include "arm_math.h" // ARM::CMSIS:DSP
float32_t inputSignal_f32_1kHz_15kHz[320] =
{
+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
-0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
-0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
+0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
-0.8660254038f, -0.4619397663f, -1.3194792169f, -1.1827865776f, -0.5000000000f, -1.1827865776f, -1.3194792169f, -0.4619397663f,
-0.8660254038f, -1.2552931065f, -0.3535533906f, -0.4174197128f, -1.0000000000f, -0.1913417162f, +0.0947343455f, -0.5924659585f,
-0.0000000000f, +0.5924659585f, -0.0947343455f, +0.1913417162f, +1.0000000000f, +0.4174197128f, +0.3535533906f, +1.2552931065f,
+0.8660254038f, +0.4619397663f, +1.3194792169f, +1.1827865776f, +0.5000000000f, +1.1827865776f, +1.3194792169f, +0.4619397663f,
+0.8660254038f, +1.2552931065f, +0.3535533906f, +0.4174197128f, +1.0000000000f, +0.1913417162f, -0.0947343455f, +0.5924659585f,
+0.0000000000f, -0.5924659585f, +0.0947343455f, -0.1913417162f, -1.0000000000f, -0.4174197128f, -0.3535533906f, -1.2552931065f,
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment