语音处理:Python实现dBFS刻度和采样值相互转换_dbfs 频域-程序员宅基地

技术标签: python  语音处理  人工智能  开发语言  

语音处理:Python实现dBFS刻度和采样值相互转换

问题背景


项目在处理不同位深的音频信号时,时常需要涉及到样点值和dB对数域切换,不想反复去分析公式和手动计算,所以偷个懒写个函数脚本放在这里,方便下次使用。

功能思路


下面以对数域常用的dBFS刻度为例,支持主流音频信号位深:整型16/24/32位和浮点32位,编写Python实现对数域和采样值单位互换功能。

实现过程本质就是模拟以下转换公式:

  • 幅值谱:dBFS = 20 * lg(sample / max_sample)

  • 功率谱(能量谱):dBFS = 10 * lg(sample / max_sample)

详细转换原理可参考博客:《语音处理:PCM文件中采样值到dB分贝的转换分析》。

具体过程

  • 输入待转换的样点值或对数域值,以及信号位深
  • 根据相应位深,得到对应位深的最大值ref_val
  • 根据公式进行样点值和对数域的转换,并输出结果

效果如下:

input:

bit_depth = 24
sp = 1024
db = -78.27

output:

sample: 1023.74, dBFS: -78.27

Python源码


# 仅支持整型16/24/32位和浮点32位位深
import math as mt

# 常量定义
BIT_DEPTH_I16 = 16
BIT_DEPTH_I24 = 24
BIT_DEPTH_I32 = 32
BIT_DEPTH_F32 = -32
VAL2LOG_COEF  = 20
LOG_POW_BASE  = 10


# 根据位深获取最大幅值
def GetSampleRefVal(bit_depth):
    ref_val = 0
    if bit_depth == BIT_DEPTH_F32:         # float32
        ref_val = 1.0
    elif ((bit_depth == BIT_DEPTH_I16) or   # int16
          (bit_depth == BIT_DEPTH_I24) or   # int24
          (bit_depth == BIT_DEPTH_I32)):    # int32
        ref_val = 2 ** (bit_depth - 1) - 1
    else:
        print('not supported bitdepth =', bit_depth)
        return -1
    return ref_val


# dBFS到采样值
def Db2Sample(db, bit_depth):
    # assumed that bit_depth is verfied
    ref_val = GetSampleRefVal(bit_depth)
    sample = pow(LOG_POW_BASE, db / VAL2LOG_COEF) * ref_val
    return sample


# 采样值到dBFS
def Sample2Db(sample, bit_depth):
    # assumed that bit_depth is verfied
    ref_val = GetSampleRefVal(bit_depth)
    sample_clip = min(abs(sample), ref_val)
    ratio = sample_clip / ref_val
    dBFS = VAL2LOG_COEF * mt.log(ratio, LOG_POW_BASE)
    return dBFS


# test demo
bit_depth = 24
sp = 1024
db = -78.27
dBFS = Sample2Db(sp, bit_depth)
sample = Db2Sample(db, bit_depth)
print('sample: {0:0.2f}, dBFS: {1:0.2f}'.format(sample, dBFS))

相关资料


  1. 语音处理:PCM文件中采样值到dB分贝的转换分析,link
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_17256689/article/details/128024891

智能推荐

Linux 驱动开发基础知识——编写LED驱动程序(三)_linux驱动怎么写-程序员宅基地

文章浏览阅读6.2k次,点赞43次,收藏29次。我们基于 Hello 驱动程序先写出最简单的 LED 驱动程序_linux驱动怎么写

RabbitMQ学习文档(环境安装篇)-程序员宅基地

文章浏览阅读270次。RabbitMQ学习文档_mq学习文档

希捷7200.11固件门完全DIY修正方法! 不用几块钱, DIYers请进!!!_希捷stcomtool转t失败-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏9次。分享给有需要的朋友, 数据无价... 以后注意备份重要资料... 1. 老外的方法[By Gradius]: The Solution for Seagate 7200.11 HDDs (final and revised version): http://www.msfn.org/board/index.php?showtopic=128807&hl=7200.112. (第_希捷stcomtool转t失败

数据库安全:Hadoop 未授权访问-命令执行漏洞._hadoop未授权访问-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏4次。Hadoop 未授权访问主要因HadoopYARN资源管理系统配置不当,导致可以未经授权进行访问,从而被攻击者恶意利用。攻击者无需认证即可通过RESTAPI部署任务来执行任意指令,最终完全控制服务器。_hadoop未授权访问

100个替代昂贵商业软件的开源应用_citadel开源中文版本-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏18次。100个替代昂贵商业软件的开源应用面对大,中,小企业和家庭用户,立竿见影显著降低成本的开源软件。某些商业软件素以昂贵著称。随着云计算的日益普及,很多常用软件包供应商将一次性收费改为月租模式。虽然月租费貌似便宜,但也经不起长时间的累积。100个替代昂贵商业软件的开源应用尽管有许多好理由,但避免或减少使用费,仍然是许多用户看中开源应用软件的主要因素。基于这一点,我们更新了可替代_citadel开源中文版本

竞选计算机协会网络部部长,2019年计算机协会部长竞选演讲稿-程序员宅基地

文章浏览阅读55次。2019年计算机协会部长竞选演讲稿篇一:计算机协会部长竞选演讲稿尊敬的领导,敬爱的老师,亲爱的同学们:大家晚上好!俗话说:马只有驰骋千里,方知其是否为良驹;人只有通过竞争,才能知其是否为栋梁。我是来自xxx班的伍朝海,今晚,我很荣幸能够站在这里参加这次学生会的竞选,职位是xx系的宣传窗口——新闻网络部的负责人。我知道,今晚竞选的不仅仅是个职位,也是在竞选一个为同学们服务的机会,更是在竞选一个为我们...

随便推点

stable diffusion(1): webui的本地部署(windows)_sd webui torch版本-程序员宅基地

文章浏览阅读2.1k次。有一个坑一直没过去,就是如果整体环境没完全装好,但是使用我自己提前创建的python虚拟环境来启动SD启动脚本stable-diffusion-webui/webui-user.bat,期间会因为某些原因(比如没梯子东西下载不下来)启动失败,但是第二次启动时就会报没有pip模块的错误,我就只能重新创建python虚拟环境,再装一遍包,这个过程很漫长很浪费时间,所以一定跟着我的脚步,一步不要落下的走,心急吃不了热豆腐。如果没有梯子,这里很慢或者根本过不去,所以参考。三、修改url地址(梯子强可不改)_sd webui torch版本

CTFSHOW做题记录_ctfshow 龙猫-程序员宅基地

文章浏览阅读491次。CTFSHOW做题记录**CTFSHOW做题记录1**(菜菜的我要写日记啦,欢迎大佬指导)**密码学签到1给出“}wohs.ftc{galf”并且提示倒叙。**解题思路:没看提示的时候乍一看以为是栅栏密码,还想着用在线解密去做,但是定睛一看不对劲,再看题目原来就是倒叙。只需要反着来就好啦。**答案:flag{ctf.show}**今天也是元气满满的一天,好好学习。..._ctfshow 龙猫

抓取动态网页的数据的具体操作方法_动态加载的网页怎么获取链接-程序员宅基地

文章浏览阅读1.9k次。不同的方法适用于不同的情况,例如如果目标网站使用的是JavaScript动态加载数据,那么使用Scrapy-Splash可能会更加适合。如果目标网站的数据比较简单,那么使用浏览器开发者工具可能会更加方便。如果需要模拟用户的操作,那么使用Selenium可能是更好的选择。总之,需要根据具体情况选择合适的方法,才能高效地获取动态网页的数据。综上所述,选择合适的方法取决于具体的需求。如果需要模拟用户的操作,可以使用Selenium。动态网页是指在用户交互过程中,网页内容不断更新和变化的网页。_动态加载的网页怎么获取链接

Ubuntu20.04安装向日葵_ubuntu20.04 安装向日库-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏6次。下载最新版本:https://sunlogin.oray.com/download/缺少部分依赖,手动下载:# 你知道最新的版本号了sudo wget http://download.oray.com/sunlogin/linux/SunloginClient-10.0.2.24779_amd64.debsudo wget http://mirrors.aliyun.com/ubuntu/pool/main/i/icu/libicu60_60.2-3ubuntu3_amd64.debsudo w_ubuntu20.04 安装向日库

JMeter之脚本录制_jmeter脚本录制,大厂软件测试高级多套面试专题整理集合-程序员宅基地

文章浏览阅读635次,点赞14次,收藏7次。打开IE浏览器,点击右上方工具按钮,依次选择“Internet选项” -> “连接” -> “局域网设置” -> “代理服务器”,勾选“为LAN使用代理服务器”,输入本地IP地址127.0.0.1及端口号8888,点击确定保存。若页面提示“此网站的安全证书存在问题”,点击“继续浏览此网站(不推荐) ”即可。4.选择“Requests Filtering”,在“包含模式”中填入“.+(baidu.com).+”用以过滤非。选中“工作台”,右键选择“添加” -> “非测试元件” -> “HTTP代理服务器”

20231114歌谣v3--学习篇-组件注册-props-程序员宅基地

文章浏览阅读326次,点赞8次,收藏10次。前端

推荐文章

热门文章

相关标签