声压 声压级

android 录音分贝动画简书_数据


基准声压为 0.00002Pa

基准声压的作用是,希望对数单位为0,因为lg1=0

android 录音分贝动画简书_采样率_02


分贝和贝尔的差别:

分贝 是 十分之一 贝尔

android 录音分贝动画简书_采样率_03


分贝又称作:功率增益

一切开始由ADC采集模拟信号的离散状态开始,用离散信号还原原本的信号

dB值一般以ADC采的最大值作为0dB,举例:

比如表示 -6dB(图中应该是 -3dB,dB的计算方式应该是 10 lg(V1/V2),比如 10 lg(2)= 3.01 ≈ 3)

android 录音分贝动画简书_数据_04

PCM

抽样,量化,编码

抽样:涉及到采样率

量化:把无限多的值变成有限的值,

比如0到3之间有无限个数字,但我们人为把0到3分为,1,2,3

编码

android 录音分贝动画简书_github_05

采样率

比如 44.1kHz,每秒采集数据 44.1k次

android 录音分贝动画简书_android 录音分贝动画简书_06

48kHz用在影碟
96或者192用在DVD的音频

采样位数(比特率)

android 录音分贝动画简书_android 录音分贝动画简书_07


量化失真:量化级差(间隔)越小,精度越高,量化噪声越小

12bit,16bit, 24bit

和动态范围有关,一般简单乘以 6.02。比如

声道

比特率

android 录音分贝动画简书_单片机_08

6 dB规则

android 录音分贝动画简书_github_09

动态范围(dB) = 6.02n + 1.76 ≈ 6n (dB)

n是数据的采样位数(16bit 24bit 32bit)

android 录音分贝动画简书_数据_10


比如一个24bit的转换器,实际上的范围不是144dB,而是105dB

定点数,浮点数

android 录音分贝动画简书_数据_11

DFT的原理

求卷积的过程是,把原信号和cosx相乘,比如原信号是一个sinx,那么当测试信号cosx移动90度时,两者相乘后的函数,
在周期内的积分不为0,且达到最大值,这个最大值就是测试信号对原信号的贡献,该角度就是测试信号的相位

同时,一个相位不为0的余弦信号,又等于两个不同幅度的相位为0的正弦和余弦信号相加

android 录音分贝动画简书_单片机_12


这个积分得到sin(2πft) 和 cos(2πft)和原信号相乘的卷积,从而可以得出测试信号cosx的相位和比例

相位:sin积分除以cos的积分

对原信号的贡献:两者的平方根

原式等于 a + ib,a为原信号和cos的积分,b为原信号和sin的积分

量化误差

滤波器

所有滤波器实现的原理,无非是延时加权求和

传输BUFFER

android 录音分贝动画简书_github_13


当收到DMA HALF TRANSMITTED COMPLETE INT时,就可以对 0,1,2,3,的数据进行处理

当收到DMA TRANSMITTED COMPLETE时,就可以对 4,5,6,7的数据进行处理,然后就可以发送 0,1,2,3的数据

biquad滤波

android 录音分贝动画简书_数据_14

Q值是 resonance,FS是截止频率,(又称作 Fc 中心频率)比如Fc为1000,
Fc为系统最大响度-3dB处,所以中心频率的信号,幅度会稍微缩小

阶数决定滤波器的性能 12dB/24dB,双二阶就能满足12dB的性能,如果要24dB,就串联两个双二阶 ( biquad)
这样a,b的系数会增加,
同时定点的计算要考虑相乘溢出的问题

https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html 原理: https://www.earlevel.com/main/2003/02/28/biquads/
具体代码:https://github.com/dmgleichman/biquad_design_tool
具体代码:https://github.com/dmgleichman/biquad_design_tool/blob/master/Labwindows_Project/formula.c
JS代码:https://arachnoid.com/BiQuadDesigner/javascript/BiQuadFilter.js
网页图示:https://www.earlevel.com/main/2021/09/02/biquad-calculator-v3/
网页图示:https://arachnoid.com/BiQuadDesigner/index.html

线性时不变

信号处理基础

android 录音分贝动画简书_android 录音分贝动画简书_15


android 录音分贝动画简书_采样率_16

浮点转定点

https://medium.com/incredible-coder/converting-fixed-point-to-floating-point-format-and-vice-versa-6cbc0e32544e https://www.jianshu.com/p/825880324089

float int_to_float(x)//2^15
{
		int8_t sign;
		int16_t c;
		float f;
		c = abs(x);
		sign = 1 ;
    if (x < 0)
		{
			c = x - 1;
			c = ~c;
			sign = -1;
		}              
    f = (1.0 * c) / (32768);
    f = f * sign;
    return f;
}

int16_t float_to_fixed(float f)
{
		int16_t a;
	  a = f* (32768)+0.5;;
    if(a < 0)
		{
			a =  abs(a);
			a = ~a;
			a += 1;
		}
    return a;
}

频谱

https://zhuanlan.zhihu.com/p/54645971 波形的振幅决定了声音的响度大小,基频频率决定了音高,谐波(泛音列)和共振峰决定了音色。

音频播放机制

一般使用PingPong模式,就好比图片数据一样
数据一般按 512,1024帧的方式发送
有一个FIFO收集按键的数据,有一个量统计播放的进度
如果碰到音频停止的情况,数据填充0即可

底层硬件基础

SAI

android 录音分贝动画简书_android 录音分贝动画简书_17

I2S 四条线
时钟线
BCLK: SCK频率=声道数×采样频率×采样位数
LRCK: 用来判断是什么声道,0是左声道,1是右声道
MCLK: 主时钟,MCLK频率 =(128、256、512)* 采样频率;
数据线
DATA: MSB形式