2022电赛声源定位(基础篇)

对于需要2022电赛题目的同学点击这个链接:https://pan.baidu.com/s/1zyC8MbgenAAQ_ZVmvFyZvg
提取码:g6kd

对于这个2022电赛E题声源定位的音频点击这个链接:https://pan.baidu.com/s/1fNRSU9LOXzB-ES2JFoFizg
提取码:lmy7

这个音频是一个扫频信号,是一个单通道采样率为10k的信号,频率范围是500-2000 hz,对于使用的主控芯片是stm32F407VET6,具有168MHZ的主频,512K的FLASH,192K的SRAM,当然假如开启了DMA的模式,然后有不修改相关配置,那么你的SRAM就是128K,只有原来的2/3.

2022电赛声源定位(基础篇)_第1张图片

 从这个图我们可以看到有64K的独立SRAM,他是不能被DMA访问的,当然一份STM32数据手册有1751页,没有几年经验是看不完的,只有不断接触到新的项目,才会不断接触这些小小的细节。

对于音频的处理,当然是越大越好,但考虑到STM32的性能以及博主的能力有限,没有压榨完全STM32的性能,采用了2048点的FFT,目前对于STM32自带的库只能运行4096的FFT,当然对于这个点数可能已经在压榨STM32的边缘,所以官方给的库也只能处理这么大,不过STM32自带的一个库感觉运算出的结果与MATLAB的结果相差无几,对于MATLAB我感觉还是有点点小小的狗,因为他通常会自己保留三位有效数字,自己四舍五入,STM32出来的结果都比MATLAB精确,博主使用计算机计算了一下,确实是这样的。然而STM32自己输出的结果总是有0.0000001的误差,可能本身是从零开始计数,导致总是少那么一点点。当然以上只是博主的猜测。对于STM32的库运行有硬件加持,速度会比自己写的要快,就算没有开启硬件加速,也会比自己的快,当然他的硬件加速可能不太好,就算开开了,也不知道是真的开了没有,而且感觉我好像不知道你有没有开启硬件加速功能。

 

对于假如感觉FFT的点数太小的话,建议使用自己写的FFT算法,有时使用STM32的自带算法踩堆栈,出来的结果有问题,花了博主好多时间去一个个去排查结果。

然后对于音频的采样可以借鉴博主以前的文章,有许多ADC和DMA的文章以及代码,已经经过博主的不断实践,当然可能会有小小的失误。

对于这个可能还有IIC屏幕的驱动,DHT11的驱动,二维舵机的驱动,后面博主会一一补齐的。

对于这个ADC的采样使用了三个ADC同步采样,使用定时器同步触发,进行10K的采样。

当然为什么不使用更高的采样速度,这样会导致音频数据的丢失,因为音频的采样率就是10K,然后一个周期就是2048个点,所以使用10K的采样率。

对于整体流程:将两组数据进行归一化,然后FFT,一组共轭,然后点乘,同理反转;然后两组数据进行IFFT,然后取其中(根据自己的情况)数据,进行相减,寻找最大值以及位置。

对于现在的情况还没有加滤波处理,会有噪声的干扰,预计后面会加一个均值滤波。

对于两点的采样距离不要超过半个波长,对于波长的计算,声速除以频率就能得到波长。

这里采用了三个MAX9814模块进行实验,当然后期会自己搭建硬件,这里只是进行算法的验证。

你可能感兴趣的:(单片机,stm32,嵌入式硬件)