python - PyQT Graph -- 图形显示巨大
问题描述
我在这里有一个代码,可以在 PyQT Graph 中显示音频文件的波形,不幸的是,该图看起来太大了。
我还不能附上图片,所以我将提供我制作的图表屏幕截图的链接。
这是我的代码:
self.waveFile = wave.open(audio,'rb')
self.format = pyaudio.paInt16
channel = self.waveFile.getnchannels()
self.rate = self.waveFile.getframerate()
self.frame = self.waveFile.getnframes()
self.stream = p.open(format=self.format,
channels=channel,
rate=self.rate,
output=True)
durationF = self.frame / float(self.rate)
self.data_int = self.waveFile.readframes(self.frame)
self.data_plot = np.fromstring(self.data_int, 'Int16')
self.data_plot.shape = -1, 2
self.data_plot = self.data_plot.T
self.time = np.arange(0, self.frame) * (1.0 / self.rate)
w = pg.plot()
w.plot(self.time, self.data_plot[0])
我是否需要调整 X 和 Y 范围限制?我应该调整 Y 峰值吗?如您所见,我使用的音频文件中的 X(time) 匹配持续时间为 8 秒。但 Y 不是(?)。我不知道如何调整波形数据以使其适合窗口。任何回应和建议都会有很大帮助!
解决方案
我认为有几个选项取决于您要显示的内容。
1:调整Y-limit
最简单的解决方案是缩放 Y 轴。
# See docs for function setYrange
# setYRange(min, max, padding=None, update=True)
w.setRange(YRange=[min,max])
您可以在此处查看文档。
也就是说,如果您想保持所有音频值与当前相同,尽管您真的需要这些值的音频数据吗?通常,至少出于科学目的,音频数据显示为介于 -1 和 +1 之间的浮点数。
2:调整你的数据
如前所述,音频数据在 -1 和 +1 之间缩放时往往最有用;我们更容易看一眼并立即了解幅度是否正确(例如,如果我们正在测试增益程序)。除了内置的wave模块之外,还有很多其他的 Python 库,它们会像PySoundFile或许多其他模块一样为您处理这件事要容易得多(有关在 Python 中读取 .wav 文件的其他方法,请参阅此其他SO 帖子)。
否则,您可以使用类似这样的方法将从 wave 模块接收到的数据转换为浮点数据(支持查看代码):
import wave
import struct
import sys
def wav_to_floats(wave_file):
w = wave.open(wave_file)
astr = w.readframes(w.getnframes())
# convert binary chunks to short
a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
a = [float(val) / pow(2, 15) for val in a]
return a
# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))
如果可能的话,在这种情况下使用库总是更好,因为现在的wave 模块不支持许多音频用例(据我所知,只有单声道 16 位音频)。
注意:如果您确实将其转换为 -1 到 +1 数据,可能仍然值得像第 1 部分中解释的那样调整 Y-Limit。只是为了避免在加载不同的 .wav 文件时出现奇怪的缩放。
推荐阅读
- html - 如何从图像中删除空白
- amazon-web-services - 如何实现基于 AWS 的微服务应用用户界面
- google-cloud-tasks - 无法控制 Google Cloud Tasks API 的速率限制
- imagenet - 如何让cleverhans 的 cw 在 Imagenet 数据集上运行良好?我找不到合适的参数
- php - 如何在 Laravel 5.8 上仍然使用“中间件:('已验证')”时允许访客访问页面?
- javascript - 如何从外部打开和关闭 Ember Power Select
- php - 尝试从查询响应中提取 email_address。出了什么问题?
- python - 规范化包含在列表中的多级 json 字符串
- c++ - 是否可以在 C 结构中定义范围回调函数?
- angular - 使用 ng serve 时在 Angular 类中编译出错