声压 声压级
基准声压为 0.00002Pa
基准声压的作用是,希望对数单位为0,因为lg1=0
分贝和贝尔的差别:
分贝 是 十分之一 贝尔
分贝又称作:功率增益
一切开始由ADC采集模拟信号的离散状态开始,用离散信号还原原本的信号
dB值一般以ADC采的最大值作为0dB,举例:
比如表示 -6dB(图中应该是 -3dB,dB的计算方式应该是 10 lg(V1/V2),比如 10 lg(2)= 3.01 ≈ 3)
PCM
抽样,量化,编码
抽样:涉及到采样率
量化:把无限多的值变成有限的值,
比如0到3之间有无限个数字,但我们人为把0到3分为,1,2,3
编码:
采样率
比如 44.1kHz,每秒采集数据 44.1k次
48kHz用在影碟
96或者192用在DVD的音频
采样位数(比特率)
量化失真:量化级差(间隔)越小,精度越高,量化噪声越小
12bit,16bit, 24bit
和动态范围有关,一般简单乘以 6.02。比如
声道
比特率
6 dB规则
动态范围(dB) = 6.02n + 1.76 ≈ 6n (dB)
n是数据的采样位数(16bit 24bit 32bit)
比如一个24bit的转换器,实际上的范围不是144dB,而是105dB
定点数,浮点数
DFT的原理
求卷积的过程是,把原信号和cosx相乘,比如原信号是一个sinx,那么当测试信号cosx移动90度时,两者相乘后的函数,
在周期内的积分不为0,且达到最大值,这个最大值就是测试信号对原信号的贡献,该角度就是测试信号的相位
同时,一个相位不为0的余弦信号,又等于两个不同幅度的相位为0的正弦和余弦信号相加
这个积分得到sin(2πft) 和 cos(2πft)和原信号相乘的卷积,从而可以得出测试信号cosx的相位和比例
相位:sin积分除以cos的积分
对原信号的贡献:两者的平方根
原式等于 a + ib,a为原信号和cos的积分,b为原信号和sin的积分
量化误差
滤波器
所有滤波器实现的原理,无非是延时加权求和
传输BUFFER
当收到DMA HALF TRANSMITTED COMPLETE INT时,就可以对 0,1,2,3,的数据进行处理
当收到DMA TRANSMITTED COMPLETE时,就可以对 4,5,6,7的数据进行处理,然后就可以发送 0,1,2,3的数据
biquad滤波
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
线性时不变
信号处理基础
浮点转定点
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
I2S 四条线
时钟线
BCLK: SCK频率=声道数×采样频率×采样位数
LRCK: 用来判断是什么声道,0是左声道,1是右声道
MCLK: 主时钟,MCLK频率 =(128、256、512)* 采样频率;
数据线
DATA: MSB形式