信号处理中数字增益的局限性

在信号处理领域,增益分为数字增益和模拟增益,数字增益用于操作离散的数字化的采样值,模拟增益直接操作连续的模拟的信号波形。对于目前大多数高端音响,都是采用模拟增益调整音量的,原因就在于数字增益有一些局限性。

数字30, 003在16bit DAC中是这么表达的:

0111010100110011 = 30,003

对数字增益来说,调低音量是直接减少这个数字:比如调低-10db,

而若20log(x)=-10,则x=0.3162,则降低10db就是把原音量值乘以0.3162。

于是,结果就是30003*0.3162=9488

0010010100010000 = 9,488

但是。。注意,其实不是应该是这样的吗?

30,003 * 0.3162 = 9487.7817

这个四舍五入造成的误差,虽然很小,但确实存在。

如果我们想更大幅度的降低音量,比如-35db,那么

-35db是0.0177828 ,最终得到结果:

0000001000010110 = 534

但实际上精确的结果是

30,003 * 0.3162 = 533.5372

这样的误差就是866PPM(parts per million),略有点大了。

所以,这样的误差,看上去不起眼,但是音量越低,就越难以忽视。

由此得到结论:数字增益无法处理分数会产生精度误差。

那么,怎么处理这个问题呢?

如果我们用32位定点小数表示一个16位的采样的话,30,003在32 bit DAC里是这么表示的:

0111010100110011.0000000000000000 = 30,003

当-35db音量时:

-35db is 0.0177828,因此结果是:

0000001000010110.1000100110000100 =533.5372

所以拓宽处理通路可以很有效得降低精度的丧失。

目前音频处理领域很多采用32位float采样来进行信号处理,其实原理是一样的。

时间: 2024-10-12 18:24:33

信号处理中数字增益的局限性的相关文章

信号处理中数字频率和模拟频率简明讲解

数字频率和模拟频率 在数字信号处理的学习中,很多刚入门朋友常常为模拟频率.数字频率及其相互之间的关系所迷惑,甚至是一些已经对数字信号处理有所了解的朋友也为这个问题所困惑. 我们通常所说的频率,在没有特别指明的情况下,指的是模拟频率,其单位为赫兹(Hz),或者为1/秒(1/s),数学符号用f来表示.这是因为现实世界中的信号大多为模拟信号,频率是其重要的物理特性.以赫兹表示的模拟频率表示的是每秒时间内信号变化的周期数.如果用单位圆表示的话,如图1所示,旋转一圈表示信号变化一个周期,则模拟频率则指的是

数字信号处理中为什么要加窗

对模拟信号进行数字处理时,首先要对模拟信号进行采样,采样频率由奈奎斯特采样定理决定.对采样而来的数字信号进行 DTFT处理得到其频谱.由 DTFT的计算公式可知, DTFT的计算需要用到信号的所有采样点,当信号为无限长或者是相当长时,这样的计算不可行也没有实际意义.因此会把信号分成许多一定长度的数据段,然后分段处理. 如果把数据进行分段,相当于对信号进行了加矩形窗的处理,对加窗后的信号做 DFT,将会出现由于加窗而引入的高频分量. 既然加窗不可避免,就选择一个合适的吧.窗的形状有许多种,选用合适

数位dp(求1-n中数字1出现的个数)

题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不可以随意取,true为没降,true为已降):常规的记忆化搜索 代码: /****************************************************** * author:xiefubao *******************************************************/ #p

24、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.  思路:新建一个数组先把原数组中的奇数push进去再把偶数push进去,然后用新数组数据覆盖原数组即可 复杂度O(n),用空间换时间 class Solution { public:     void reOrderArray(vector<int> &array) {         vector<int&

js面试题--------JS中数字和字符,布尔类型相加相减问题

JS中数字和字符相加相减问题 <html lang="en"> <head> <meta charset="utf-8" /> <title></title> </head> <body> </body> </html> <script type="text/javascript"> var a = 100; var b = &

不用遍历 递归算法 求数组中数字的最大值

#include "stdio.h"int ax[] ={1000,5,6,8,9,800,5,200,3,6,5,8,9};int paixu (int n, int ret){    if (n==0) return ret>ax[0]?ret:ax[0];    int ret1= ret>ax[n]? ret:ax[n];    return paixu(n-1,ret1);}int main(int argc, char* argv[]){    int numb

CONVERT(varchar(10), getdate(), 120 )中数字参数用法

这是一个mssql数据库的函数,Convert函数的作用,是进行数据类型的转换.而您所问的这个convert(char(20),openDate,120)则是对日期字段,进行格式化转换成字符格式的函数.接下来,对您函数中的三个参数,分别进行说明:1.char(20),是要转换成的目标数据类型及长度,这里您还可以使用varchar(20),也可以使用varchar(10),如果使用20,则转换后的字符串可以是20的长度,如果是10,则只取前10 位了.后面的省掉.2.openDate,是一个日期字

从SSMS中复制代码到Word中数字消失--没解决&amp;&amp;Excel连接SQL Server数据库

1.因工作需要需把SSMS中的代码复制到word中,可发现一个问题: 从SQL Server2008的SSMS中复制代码到Word 2013中,如果是中文汉字+阿拉伯数字,阿拉伯数字会消失.如果是英文+阿拉伯数字就没有问题.在网上也没找到方法,问一哥们,他说我们都是英文,没遇到过.记录下来吧 2.每次发的数据都在数据库中,之前都是select * from TableName,然后"连同标题一起复制",然后再粘贴到Excel中.但其实excel可以连接SQL Server的,其实操作很

调整数组中数字的顺序,使得所有奇数位于数组的前半部分

输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n),不要求保留数组元素的相对位置. 解析:可以维护两个指针:第一个指针初始化为数组的第一个数字,它只向后移动:第二个指针初始化为数组的最后一个数字,它只向前移动.在两个指针相遇之前,第一个指针总是位于第二个指针的前面.如果第一个指针指向的数字是偶数而第二个指针指向的数字是奇数,就交换这两个数字. 方法一: void patition(ref int[] arr, int n)