当前位置:   article > 正文

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

pdm协议

简介:

        生活中电子设备基本会用到麦克风(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解析代码:

  1. `timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2024/02/23 17:44:15
  7. // Design Name:
  8. // Module Name: DMIC_DECODE
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module DMIC_DECODE(
  22. input sys_clk,
  23. input sys_rst_n,
  24. DAC IO
  25. (* MARK_DEBUG="true" *)output reg DMIC_CLK,
  26. (* MARK_DEBUG="true" *)input DMIC_DATA,
  27. output DMIC_SYS_CLK,
  28. output DMIC_SYS_RST_N,
  29. output reg[15:0] DATA_L,
  30. output reg[15:0] DATA_R,
  31. output reg DATA_EN
  32. );
  33. reg[7:0] DMIC_CLK_CNT;
  34. always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
  35. if(sys_rst_n == 'd0)begin
  36. DMIC_CLK <= 'd0;
  37. DMIC_CLK_CNT <= 'd0;
  38. end
  39. else if(DMIC_CLK_CNT == 'd15)begin
  40. DMIC_CLK_CNT <= 'd0;
  41. DMIC_CLK <= ~DMIC_CLK;
  42. end
  43. else begin
  44. DMIC_CLK_CNT <= DMIC_CLK_CNT + 'd1;
  45. end
  46. end
  47. always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
  48. if(sys_rst_n == 'd0)begin
  49. DATA_L <= 'd0;
  50. DATA_R <= 'd0;
  51. end
  52. else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd0)begin
  53. //DATA_L <= {2'd0,DATA_L[12:0],DMIC_DATA};
  54. DATA_L <= {1'd0,DATA_L[13:0],DMIC_DATA};
  55. end
  56. else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd1)begin
  57. //DATA_R <= {2'd0,DATA_R[12:0],DMIC_DATA};
  58. DATA_R <= {1'd0,DATA_R[13:0],DMIC_DATA};
  59. end
  60. end
  61. always @(posedge DMIC_SYS_CLK or negedge sys_rst_n)begin
  62. if(sys_rst_n == 'd0)begin
  63. DATA_EN <= 'd0;
  64. end
  65. else if(DMIC_CLK_CNT == 'd7 && DMIC_CLK == 'd1)begin
  66. DATA_EN <= 'd1;
  67. end
  68. else begin
  69. DATA_EN <= 'd0;
  70. end
  71. end
  72. DMIC_CLK DMIC_CLK_inst(
  73. // Clock out ports
  74. .clk_out1(DMIC_SYS_CLK),
  75. // Clock in ports
  76. .clk_in1(sys_clk),
  77. .locked(DMIC_SYS_RST_N)
  78. );
  79. 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协议讲到这里,有疑问请留言 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/1009929
推荐阅读
相关标签
  

闽ICP备14008679号