首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声波的最小表示?

声波的最小表示?
EN

Stack Overflow用户
提问于 2019-11-06 17:56:59
回答 1查看 151关注 0票数 0

我想从配乐中提取一个一维的单一向量,简单地表示它在给定时间的“音量”或“强度”(我不确定这个术语)。

以一个可用的样本为例:

wget https://freewavesamples.com/files/Ensoniq-ESQ-1-Sympy-C4.wav

并将其转换为mono

ffmpeg -i Ensoniq-ESQ-1-Sympy-C4.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav

我以这种方式从related Q&A thread收集来可视化声波:

代码语言:javascript
复制
from scipy.io.wavfile import read
import matplotlib.pyplot as plt

input_data = read("audio_test.wav")
audio = input_data[1]

plt.plot(audio)
plt.ylabel("Amplitude")
plt.xlabel("Time")  
plt.title("Sample Wav")
plt.show()

“正面”和“负面”是对称的,但不是完全对称的。有没有办法把它们合并成一个“正”行?如果是,我如何从audio变量中提取这样的数据点?

非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2019-11-06 19:52:42

根据@anerisgreat和一位同事的建议,我得出了这个解决方案(在更大的音频样本上更有意义):

代码语言:javascript
复制
wget https://file-examples.com/wp-content/uploads/2017/11/file_example_WAV_10MG.wav
ffmpeg -i file_example_WAV_10MG.wav -acodec pcm_s16le -ac 1 -ar 44100 audio_test.wav
代码语言:javascript
复制
from scipy.io.wavfile import read
import matplotlib.pyplot as plt

def positive_enveloppe(wav_dat):
    freq = wav_dat[0]
    pts = np.absolute(wav_dat[1])
    pos_env = np.zeros(len(pts) // freq + int(bool(len(pts) % freq)))

    env_idx, pts_idx = 0, 0
    while pts_idx < len(pts):
        sub_ar = pts[pts_idx:pts_idx+freq]
        mov_avg = np.mean(sub_ar)
        pos_env[env_idx] = mov_avg
        pts_idx += freq
        env_idx += 1

    return pos_env

input_data = read("audio_test.wav")
enveloppe_data = positive_enveloppe(input_data)
plt.plot(enveloppe_data)
plt.show()

让步:

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

https://stackoverflow.com/questions/58727410

复制
相关文章

相似问题

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