音频——性能指标


衡量音频的性能时,其实很大程度上就是在衡量 ADC/DAC 的性能指标,下面来看下几个衡量 ADC 动态性能的指标

用于定量表示 ADC 动态性能的常用指标有六个

  • SINAD(Signal to Noise and Distortion Ratio) - 信纳比
  • ENOB(Effective Number of Bits) - 有效位数
  • SNR(Signal to Noise Ratio) - 信噪比
  • THD(Total Harmonic Distortion) - 总谐波失真
  • THD+N(Total Harmonic Distortion Plus Noise) - 总谐波失真加噪声
  • SFDR(Spurious Free Dynamic Range) - 无杂散动态范围

SINAD

信纳比指的是:(信号 + 噪声 + 谐波) 的功率与 (谐波 + 噪声) 的功率比值 。

S I N A D = S + N + D D + N SINAD=\frac{S+N+D}{D+N} SINAD=D+NS+N+D

即输出信号功率与其余所有非输出信号功率之比。SINAD 很好地反映了 ADC 的整体动态性能,因为它包括所有构成噪声和失真的成分。

ENOB

有效位数 ENOB,单位为 bit,用于描述 ADC/DAC 系统的有效分辨率。对于理想的 N 位 ADC 系统,其 ENOB 应当无限接近 N,但真实电路会不可避免的引入噪声,从而降低 ADC 的实际分辨率。

一般会利用 SNR 理想值的计算公式,将公式中 SNR 替换成 SINAD,来计算 ENOB

E N O B = S I N A D − 1.76 d B 6.02 d B ENOB = \frac {SINAD - 1.76dB} {6.02dB} ENOB=6.02dBSINAD1.76dB

SNR

信号与噪声的比值

计算公式

S N R = 20 lg ⁡ ( S N ) SNR = 20\lg(\frac {S} {N} ) SNR=20lg(NS)

理想状态下只考虑 ADC 的量化噪声,可以推导出 SNR 理想值,公式如下,借此来评估测试系统 SNR 值的好坏。其中 N 为分辨率,1.76 为理想 ADC 的量化噪声,6.02 为将 log2 转化为 log10 的系数比

S N R = 6.02 N + 1.76 d B SNR = 6.02N + 1.76dB SNR=6.02N+1.76dB

THD

总谐波失真

是指信号总谐波的能量占基波能量的百分比。谐波频率就是频率为基波整数倍的频点频率,谐波及基波的频谱图如下
请添加图片描述

THD 产生的原因

以功放为例,它在工作时由于电路不可避免的振荡或其他谐振产生的二次谐波(V2),三次谐波 (V3),四次谐波 (V4)……,输出的信号就不单纯是与输入完全相同的成分(V1),而是包括了谐波成分的信号(V2,V3,V4……),这些多余出来的谐波成分与实际输入信号的比值就是总谐波失真。

THD 计算公式

THD 是用电压幅值比例关系表示,谐波能量幅值 TD 为:

T D = V 2 2 + V 3 2 + V 4 2 + V 5 2 + … + V n 2 TD = \sqrt{V^2_2 + V^2_3 + V^2_4 + V^2_5 + \ldots + V^2_n} TD=V22+V32+V42+V52++Vn2

国际上,有 2 种 THD 计算标准,IEC 和 IEEE 的标准,其实差别就只是分母不同,IEC 把基波能量和谐波能量都当成分母,而 IEEE 则只把基波能量当分母。

IEC 标准,各次谐波幅值与基波加谐波幅值之比

T H D = T D V 1 2 + T D 2 ( I E C ) THD = \frac{TD}{\sqrt{V^2_1 + TD^2}}(IEC) THD=V12+TD2 TD(IEC)

IEEE 标准,各次谐波幅值与基波幅值之比

T H D = T D V 1 ( I E E E ) THD = \frac{TD} {V_1}(IEEE) THD=V1TD(IEEE)

所以,在谐波能量很小的场合,IEC 和 IEEE 结果差不多,但谐波能量很大时,IEC 会明显小于 IEEE 的计算值。

除此以外,失真的阶次也很重要,很多时侯大于 6 阶的失真就几乎可以忽略

THD+N

总谐波失真加噪声,在音频设备中,除了电子元器件的非线性导致的谐波失真, 还有器件的噪声造成的影响,通常用 THD+N 表示。 THD+N 是英文 Total Hormonic Distorion + Noise 的缩写,及总谐波失真加噪声。它是音频设备的一个重要性能指标。

THD+N 产生的原因

  • THD:总谐波失真
  • Noise:噪音,来自于设备噪声或干扰噪声
    • 设备噪声:由设备元器件,电路等工作引起
    • 干扰噪声:环境或者设备中其他信号干扰引起
      THD+N 测量包含了上述所有不需要的声音。如果这两项任何一项过大,都会反映在 THD+N 里。

THD+N 的计算

T H D + N = V 2 t o t a l − V 1 2 V t o t a l X 100 % THD+N=\frac{\sqrt{V^2total - V^2_1}}{Vtotal}X100\% THD+N=VtotalV2totalV12 X100%
其中,Vtotal 为信号(包括基波、各次谐波和噪声)的总 RMS 幅度,V1 为基波的 RMS 幅度。

影响 DAC THD+N 的因素

  • 负载电阻大小
  • 输入幅值

SFDR

无寄生动态范围 SFDR 定义为第一个谱峰与第二个谱峰的功率比的开方,用 dB 表示。注意:第二谱峰不一定与基波构成谐波关系。

参考链接:
THD 与 THD+N 关系

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的STM32F1 THD计算程序: ```c #include "stm32f10x.h" #define SAMPLES 256 #define PI 3.14159265359 uint16_t adc_buffer[SAMPLES]; float thd; void GPIO_Configuration(void); void ADC_Configuration(void); void TIM_Configuration(void); int main(void) { GPIO_Configuration(); ADC_Configuration(); TIM_Configuration(); while (1) { } } void GPIO_Configuration(void) { // Configure PC0 as analog input GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOC, &GPIO_InitStructure); } void ADC_Configuration(void) { // Configure ADC1 ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // Configure ADC1 channel 10 (PC0) ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5); // Enable ADC1 ADC_Cmd(ADC1, ENABLE); // Start ADC1 ADC_SoftwareStartConvCmd(ADC1, ENABLE); } void TIM_Configuration(void) { // Configure TIM2 for 1ms timer interrupt TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 7199; TIM_TimeBaseStructure.TIM_Prescaler = 999; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Enable TIM2 interrupt NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); } void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // Read ADC buffer for (int i = 0; i < SAMPLES; i++) { adc_buffer[i] = ADC_GetConversionValue(ADC1); } // Calculate THD float sum = 0; float fundamental = 0; for (int i = 0; i < SAMPLES; i++) { float value = (float)adc_buffer[i] / 4096.0 * 3.3; sum += value * value; if (i == 0) { fundamental = value; } } sum -= fundamental * fundamental; thd = sqrtf(sum) / fundamental; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } ``` 该程序配置了STM32F1的ADC和定时器,通过读取ADC缓冲区中的采样数据来计算THD。计算THD的过程是使用RMS计算基波和总谐波的平方和,然后除以基波的幅度,最后开平方根。在本例中,使用的是256个采样点,采样时间为55个时钟周期,采样频率为1.1kHz。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值