赞
踩
简介:
生活中电子设备基本会用到麦克风(MIC),而MIC分为AMIC(模拟麦克风)和DMIC(数字麦克风),字面上理解就是AMIC接收音源后转化成模拟信号,DMIC接收音源转换成数字信号。本周着重讲解DMIC。
DMIC采用PDM协议传输数据,而该协议基本只用在DMIC芯片上,由两个信号线组成,分别为时钟线和数据线,如下图所示为DMIC硬件接线图:
图1 DMIC硬件接线图
DMIC左声道和右声道公用一条总线,在时钟的上升沿和下降沿分别输出左右声道数据,时序图如下图所示:
图2 DMIC左右声道时序图
如上图所示PDM协议在时钟上升沿输出左声道数据,时钟下降沿输出右声道数据,时钟信号由主控(FPGA/STM32等)提供。
如果硬件电路只接收一路DMIC,时序图将如下图所示:
图3 DMIC单声道时序图
硬件接一路DMIC,时序将变成单沿(上升沿)采样。
DMIC的采样时钟CLK是不固定的,可以支持不同采样率采样,例如3.072MHz,2.4MHz,768KHz,而标准音频一般是441.KHz、48KHz左右。这里就需要PDM数据采集后做滤波处理,滤波方式在后面章节会讲到。
如下图所示为PDM的波形图
图4 PDM波形图
PDM的数据是1bit的,从图中可以看出在1最密集的时候是波形的正峰值,0最密集的时候波形处于负峰值。
如下图所示为FPGA实现的PDM解析代码:
- `timescale 1ns / 1ps
- //
- // Company:
- // Engineer:
- //
- // Create Date: 2024/02/23 17:44:15
- // Design Name:
- // Module Name: DMIC_DECODE
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //
-
-
- module DMIC_DECODE(
- input sys_clk,
- input sys_rst_n,
- DAC IO
- (* MARK_DEBUG="true" *)output reg DMIC_CLK,
- (* MARK_DEBUG="true" *)input DMIC_DATA,
- output DMIC_SYS_CLK,
- output DMIC_SYS_RST_N,
- output reg[15:0] DATA_L,
- output reg[15:0] DATA_R,
- output reg DATA_EN
-
- );
-
-
- reg[7:0] DMIC_CLK_CNT;
-
-
-
- always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
- if(sys_rst_n == 'd0)begin
- DMIC_CLK <= 'd0;
- DMIC_CLK_CNT <= 'd0;
- end
- else if(DMIC_CLK_CNT == 'd15)begin
- DMIC_CLK_CNT <= 'd0;
- DMIC_CLK <= ~DMIC_CLK;
- end
- else begin
- DMIC_CLK_CNT <= DMIC_CLK_CNT + 'd1;
- end
- end
-
-
- always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
- if(sys_rst_n == 'd0)begin
- DATA_L <= 'd0;
- DATA_R <= 'd0;
- end
- else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd0)begin
- //DATA_L <= {2'd0,DATA_L[12:0],DMIC_DATA};
- DATA_L <= {1'd0,DATA_L[13:0],DMIC_DATA};
- end
- else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd1)begin
- //DATA_R <= {2'd0,DATA_R[12:0],DMIC_DATA};
- DATA_R <= {1'd0,DATA_R[13:0],DMIC_DATA};
- end
- end
- always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
- if(sys_rst_n == 'd0)begin
- DATA_EN <= 'd0;
- end
- else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd1)begin
- DATA_EN <= 'd1;
- end
- else begin
- DATA_EN <= 'd0;
- end
- end
-
-
-
- DMIC_CLK DMIC_CLK_inst(
- // Clock out ports
- .clk_out1(DMIC_SYS_CLK),
- // Clock in ports
- .clk_in1(sys_clk),
- .locked(DMIC_SYS_RST_N)
- );
-
-
-
-
-
- endmodule
解析后的数据需要经过滤波处理,即可生成音频信号。音频信号发送到DAC+音响可以做成一个话筒功能。
说到MIC,这里需要介绍以下灵敏度的计算,AMIC灵敏度计算公式如下:
其中V0=1V,V为一个标准大气压下94dB声音输出AMIC生成的电压,这里需要注意的是V代表的是AMIC有效电压,而不是峰值电压(Vmax),他们的关系如下:
例如AMIC在标准大气压下生成有效电压为20mv,计算后得出其灵敏度S= -33.98dB。
而DMIC(16为DMIC为例)的dBFS计算公式如下:
其中SAMPLE为采样得到的值,其中65535代表DMIC最大电压转换的值。
PDM协议讲到这里,有疑问请留言
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。