STM32驱动INMP441麦克风实现左右通道声音采集

这篇具有很好参考价值的文章主要介绍了STM32驱动INMP441麦克风实现左右通道声音采集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、参考原理图

1、INMP441

stm32采集声音,stm32,单片机,嵌入式硬件

2、STM32

stm32采集声音,stm32,单片机,嵌入式硬件
注意INMP441的第4引脚,用来选择左声道还是右声道。
stm32采集声音,stm32,单片机,嵌入式硬件

二、代码生成

代码使用cubemx生成

1、iis设置

stm32采集声音,stm32,单片机,嵌入式硬件

2、DMA设置

stm32采集声音,stm32,单片机,嵌入式硬件

3、生成代码

stm32采集声音,stm32,单片机,嵌入式硬件

三、代码修改

1、首先定义一个数组

	#define BUFFER_SIZE (4)
	static uint32_t simpleBuf[BUFFER_SIZE];
	/* USER CODE BEGIN PV */
	uint32_t val24;
	int val32;
/* USER CODE END PV */

2、定义接收完成中断函数

/* USER CODE BEGIN 0 */
unsigned cb_cnt=0;
//I2S接收完成回调函数
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	if(hi2s==&hi2s2){
		cb_cnt++;//回调次数计数
		//将两个32整型合并为一个
		//dat32 example: 0000fffb 00004f00
		val24=(dma[0]<<8)+(dma[1]>>8);
		//将24位有符号整型扩展到32位
		if(val24 & 0x800000){//negative
			val32=0xff000000 | val24;
		}else{//positive
			val32=val24;
		}
		//以采样频率的十分之一,串口发送采样值
		if(cb_cnt%10==0)
			printf("%d\r\n",val32);
	}
}
/* USER CODE END 0 */

3、启动接收

HAL_I2S_Receive_DMA(&hi2s2,(uint16_t*)simpleBuf,BUFFER_SIZE);	

4、完整代码

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2022 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "i2s.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
//#include "stm32f1xx_hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t dma[4];
uint32_t val24;
int val32;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
unsigned cb_cnt=0;
//I2S接收完成回调函数
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	if(hi2s==&hi2s2){
		cb_cnt++;//回调次数计数
		//将两个32整型合并为一个
		//dat32 example: 0000fffb 00004f00
		val24=(simpleBuf[0]<<8)+(simpleBuf[1]>>8);
		//将24位有符号整型扩展到32位
		if(val24 & 0x800000){//negative
			val32=0xff000000 | val24;
		}else{//positive
			val32=val24;
		}
		//以采样频率的十分之一,串口发送采样值
		if(cb_cnt%10==0)
			printf("%d\r\n",val32);
	}
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_DMA_Init();
  MX_I2S2_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  //开启DMA传输
  HAL_I2S_Receive_DMA(&hi2s2,(uint16_t*)simpleBuf,BUFFER_SIZE);		
  while (1)
  {
  	HAL_Delay(10);
	
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
//后面都是Cube自动生成的代码,省略

5、代码解析

根据以上说明,最后一个参数size的单位是由数据帧的长度决定的。前面在Cube中设置的数据格式为24 Bits Data on 32 Bits Frame,因此DMA读取数据的总长度为size×4字节。前面定义的DMA缓冲区是一个长度为4的uint32_t型数组,缓冲区中的数据格式为:前2个元素表示左声道数据后2个表示右声道数据
单通道数据格式为:第一个字节:0x00000004 第一个字节:0x00004500。通过val24=(dma[0]<<8)+(dma[1]>>8);合成0x00fffb4f ,然后区分正负极:文章来源地址https://www.toymoban.com/news/detail-631898.html

if(val24 & 0x800000){
			val32=0xff000000 | val24;
		}else{
			val32=val24;
		}

到了这里,关于STM32驱动INMP441麦克风实现左右通道声音采集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 会议音响系统麦克风阵列波束形成算法C语言实现

    一 应用麦克风阵列波束成形算法做的项目产品 二 麦克风波束形成技术应用领域? 麦克风波束形成技术是一种利用多个麦克风阵列来实现声音定向捕捉和增强的技术。通过对多个麦克风信号进行处理和合成,可以使麦克风系统在特定方向上具有更高的灵敏度和抑制非期望方向

    2024年02月16日
    浏览(42)
  • 阵列麦克风声音定位-代码python实现-二维与三维声音定位

    FT - 傅立叶变换FT(Fourier Transform) 时域频域转换, 此链接讲的很清晰。 FFT - 快速傅里叶变换 (fast Fourier transform): 计算机计算DFT DTFT - 离散时间傅立叶变换 :时域离散,频域连续 DFT-离散傅立叶变换 :时域离散,频域也离散时域离散,频域连续 相当于对时域的连续信号进行抽

    2023年04月12日
    浏览(50)
  • Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

    【写在前面】          之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs 。         结果后来因为没有相关项目,便停止开发维护了。         不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。         因此,本篇就简单讲

    2024年04月27日
    浏览(37)
  • web端调用本地摄像头麦克风+WebRTC腾讯云,实现直播功能

    视频直播技术大全、直播架构、技术原理和实现思路方案整理 视频采集端: 1、视频采集:使用摄像头设备获取实时视频流。 2、视频处理: 对采集到的视频进行处理,可以包括美颜、滤镜、水印等效果的添加。 3、音视频编码压缩: 将处理后的音视频数据进行编码压缩,常

    2024年02月10日
    浏览(50)
  • 音频——数字麦克风和模拟麦克风(DMIC/AMIC)

    麦克风 (microphone):是将声音信号转换为电信号的能量转换器件,也就是用来采集你说话的声音 扬声器 (speaker):是一种把电信号转变为声信号的换能器件,就是把对方说话产生的电信号转换成声音播放出来。 简单来说,麦克风的功能是采集声音,扬声器的功能是播放声音。

    2024年02月10日
    浏览(77)
  • 【ESP32音视频传输】②通过I2S采集SPH0645麦克风音频数据并上传到服务端实时播放

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文章基于Arduino ESP32 2.07版本,因为2.04版本开始I2S驱动被更改了,所以相同代码可能效果不太同 本文主要参考了:https://atomic14.com/2020/09/12/esp32-audio-input.html ESP32有多种方式从外置麦克风中读取数据:

    2024年02月11日
    浏览(49)
  • 电脑麦克风没声音?

    这3招就可以解决! 在我们使用电脑录制视频时,有时会遇到一个令人头疼的问题:麦克风没有声音。那么,为什么会出现这种情况呢?更重要的是,我们应该如何解决这个问题呢?本文将介绍3种方法,帮助您解决麦克风没有声音的难题! 方法一:通过声音设置来调整麦克风

    2024年02月13日
    浏览(52)
  • 麦克风分类汇总

    1)按声电转换原理分为:电动式(动圈式、铝带式),电容式(直流极化式)、压电式(晶体式、陶瓷式)、以及电磁式、碳粒式、半导体式等。 2)按声场作用力分为:压强式、压差式、组合式、线列式等。 3)按电信号的传输方式分为:有线、无线(无线麦克风分为三个频段,

    2024年02月09日
    浏览(50)
  • 成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入

    成功解决电脑麦克风不管用、电脑无法录制声音之出现的麦克风Realtek(R) Audio未插入 目录 1.解决问题 2.解决方法 电脑无法录制声音,经过查看发现问题,麦克风Realtek(R) Audio未插入 搜索框输入Realtek Audio Console→麦克风阵列→点击取消静音,即可! 哈哈,大功告成! 完工了!!

    2024年02月11日
    浏览(67)
  • 麦克风阵列波束基本概念理解

    本质上是设计合适的滤波器,对于一类固定滤波器系数的阵列来说,无论输入信号或者噪声信号的统计特征如何,其滤波器系数固定不变,此类波束形成叫Fixed Beamforming,固定波束形成好比传统数字信号处理里面的经典滤波器;与此相对的一类就是自适应滤波器,阵列里就有

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包