I am trying to perform simple audio denoising using an STM32F401RE Nucleo board.
I have .wav audio files that are:
mono
16-bit PCM
16 kHz
about 7–8 seconds long
Python reads the audio samples and sends them one by one over UART to the STM32.
The STM32 applies a simple moving-average filter and sends the processed samples back to Python.
Python then reconstructs the filtered samples into a new .wav file.
However the reconstructed audio file is incorrect:
it becomes only about 2–4 seconds long
the output audio contains mostly noise/glitches instead of speech
Example output from Python:
Total samples in file: 130672
Filtered samples received: 72021
So it seems that many samples are lost during UART transmission or processing.
I want to understand how to correctly stream audio samples over UART to STM32 without losing data.
STM32 Code (filter + UART processing)
uint8_t rx_char;
uint8_t buffer[50];
uint8_t index = 0;
int16_t x0 = 0;
int16_t x1 = 0;
int16_t x2 = 0;
int16_t x3 = 0;
HAL_UART_Receive(&huart2, &rx_char, 1, HAL_MAX_DELAY);
if(rx_char == '\r' || rx_char == '\n')
{
buffer[index] = '\0';
int16_t value = (int16_t)atoi((char*)buffer);
x3 = x2;
x2 = x1;
x1 = x0;
x0 = value;
int32_t sum = (2*(int32_t)x0 + (int32_t)x1 + (int32_t)x2);
int16_t result = sum / 4;
char msg[50];
sprintf(msg,"\r\nResult: %d\r\n\r\n",result);
HAL_UART_Transmit(&huart2,(uint8_t*)msg,strlen(msg),HAL_MAX_DELAY);
memset(buffer,0,sizeof(buffer));
index = 0;
}
else
{
if(index < 49)
buffer[index++] = rx_char;
}
Python Code
import wave
import numpy as np
import serial
import time
ser = serial.Serial('COM9',115200,timeout=1)
filtered_samples = []
file_path = r"recordings/raw_enrollment_16k/user_1/sample_1.wav"
with wave.open(file_path,'rb') as w:
frames = w.readframes(w.getnframes())
samples = np.frombuffer(frames,dtype=np.int16)
print("Total samples in file:", len(samples))
for s in samples:
ser.write((str(int(s)) + "\n").encode())
time.sleep(0.0005)
while ser.in_waiting:
response = ser.readline().decode(errors='ignore').strip()
if response:
try:
value = int(response.split()[-1])
filtered_samples.append(value)
except:
pass
print("Filtered samples received:", len(filtered_samples))