Aiden_S.K. 2019-04-28 09:17 采纳率: 0%
浏览 2983
已采纳

Python中声音信号导入后显示出问题(函数fromstring和frombuffer的使用区别)

  1. 关于Python中声音信号的导入及显示;
  2. 相关代码:
import wave     # 导入音频处理包
import matplotlib.pyplot as plt
import numpy as np


f = wave.open(r'D:\1.wav', 'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# nchannels:声道数;sampwidth:量化位数(byte);framerate:采样频率;nframes:采样点数
print('channel:', nchannels, 'sampwidth:', sampwidth, 'framerate:', framerate, 'numframes:', nframes)

strData = f.readframes(nframes)  # 读取音频,字符串格式
f.close()

# waveData = np.frombuffer(strData, dtype='S1', offset=0)  
waveData = np.fromstring(strData, dtype=np.short)  # 将字符串转化为int

waveData.shape = -1,2   # 将waveData数组改为2列,行数自动匹配。
waveData = waveData.T
time = np.arange(0, nframes) * (1.0 / framerate)

plt.figure(1)
plt.subplot(2,1,1)
plt.plot(time, waveData[0])
plt.subplot(2,1,2)
plt.plot(time, waveData[1], c='r')
plt.xlabel("Time(s)")
plt.show()

  1. 报错信息:
    DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
    waveData = np.fromstring(strData, dtype=np.short) # 将字符串转化为int

  2. 系统建议改用frombuffer,因为fromstring提示将会被弃用,但是使用frombuffer后得出的数组经过转换后不能和time的维度相匹配,而fromstring后的数据是左右声道的数据。想要知道如何使用frombuffer来代替fromstring!

  3. 图像可以正常显示,不会报错但是会报警告,多谢大神的帮忙

  4. 声音信号 1.wav

  5. 图片说明

  • 写回答

4条回答 默认 最新

  • Aiden_S.K. 2021-01-12 16:21
    关注
    waveData = np.frombuffer(strData, dtype='int16')
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已采纳回答 6月8日

悬赏问题

  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败