简介:
生活中电子设备基本会用到麦克风(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协议讲到这里,有疑问请留言