协议篇-PDM协议 带你深入了解DMIC

简介:

        生活中电子设备基本会用到麦克风(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灵敏度计算公式如下:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        S=20LOG(\frac{V}{V0})

         其中V0=1V,V为一个标准大气压下94dB声音输出AMIC生成的电压,这里需要注意的是V代表的是AMIC有效电压,而不是峰值电压(Vmax),他们的关系如下:

                                                V=Vmax/1.414

        例如AMIC在标准大气压下生成有效电压为20mv,计算后得出其灵敏度S= -33.98dB。

        而DMIC(16为DMIC为例)的dBFS计算公式如下:

                                                dBFS=20LOG(\frac{SAMPLE}{65535})     

        其中SAMPLE为采样得到的值,其中65535代表DMIC最大电压转换的值。    

        PDM协议讲到这里,有疑问请留言 

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值