首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中将波转换为分贝

在Python中将波转换为分贝
EN

Stack Overflow用户
提问于 2021-02-10 22:14:09
回答 1查看 1K关注 0票数 1

我在将样本数组转换为分贝时遇到了问题。下面是我尝试过的代码。

代码语言:javascript
运行
复制
from pydub import AudioSegment
audio=AudioSegment.from_mp3('am_voice.mp3')
samples=audio.get_array_of_samples()
import math
def convert_to_decibel(arr):
    if arr!=0:
        return 10 * math.log10(abs(arr))    
    else:
        return -60
data=[convert_to_decibel(i) for i in samples]

这将返回所有正数据。然而,分贝值应该始终为负值。下面是我想要创建的数据:

代码语言:javascript
运行
复制
percentile=np.percentile(data,[25,50,75])
print(f"1st Quartile : {percentile[0]}")
print(f"2nd Quartile : {percentile[1]}")
print(f"3rd Quartile : {percentile[2]}")
print(f"Mean : {np.mean(data)}")
print(f"Median : {np.median(data)}")
print(f"Standard Deviation : {np.std(data)}")
print(f"Variance : {np.var(data)}")

任何帮助都将不胜感激。

PS:我也尝试过librosa和其他库。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-11 11:24:19

信号的大小,假设a,这样0<a<1,用y=log10(a)表示,就是-inf<y<0。负峰值可以替换为一些负数,就像您正在做的-60 dB一样。要获得负的dB值,样本的值应小于1。请注意,dB电平说明了与某些参考信号值的关系。音频(声学)信号由各种参考值组成,应指定为ref。在数字音频信号中,采样通常被指定为小于1。术语db Full Scale (dbFS)用于数字音频信号中的ref=1。下面是您的代码的修改,使用范围从-1到1的音频信号从soundfile,这与AudioSegment库形成对比。

代码语言:javascript
运行
复制
from pydub import AudioSegment
import numpy as np
import soundfile as sfile
import math
import matplotlib.pyplot as plt
filename = 'Alesis-Sanctuary-QCard-Crickets.wav'
# https://freewavesamples.com/files/Alesis-Sanctuary-QCard-Crickets.wav

audio=AudioSegment.from_mp3(filename)
signal, sr = sfile.read(filename)
samples=audio.get_array_of_samples()
samples_sf=0
try:
    samples_sf = signal[:, 0]  # use the first channel for dual
except:
    samples_sf=signal  # for mono


def convert_to_decibel(arr):
    ref = 1
    if arr!=0:
        return 20 * np.log10(abs(arr) / ref)
        
    else:
        return -60

data=[convert_to_decibel(i) for i in samples_sf]
percentile=np.percentile(data,[25,50,75])
print(f"1st Quartile : {percentile[0]}")
print(f"2nd Quartile : {percentile[1]}")
print(f"3rd Quartile : {percentile[2]}")
print(f"Mean : {np.mean(data)}")
print(f"Median : {np.median(data)}")
print(f"Standard Deviation : {np.std(data)}")
print(f"Variance : {np.var(data)}")


plt.figure()
plt.subplot(3, 1, 1)
plt.plot(samples)
plt.xlabel('Samples')
plt.ylabel('Data: AudioSegment')

plt.subplot(3, 1, 2)
plt.plot(samples_sf)
plt.xlabel('Samples')
plt.ylabel('Data: Soundfile')
plt.subplot(3, 1, 3)
plt.plot(data)
plt.xlabel('Samples')
plt.ylabel('dB Full Scale (dB)')
plt.tight_layout()
plt.show()

输出

代码语言:javascript
运行
复制
1st Quartile : -51.7206201849085
2nd Quartile : -35.31427238781313
3rd Quartile : -22.110336232568464
Mean : -37.76500744850379
Median : -35.31427238781313
Standard Deviation : 18.848883199155107
Variance : 355.2803978553917

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66138578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档