Python与Qt结合能否制作实时频谱分析工具?
我想开发一个工具,主要做以下几件事:
- 接收实时的语音录音
- 生成实时的频谱图
- 显示时间域信号
- 输出一些从频谱分析中提取的数值
这些内容都需要在录音的过程中实时更新在一个窗口里。
我之前用过numpy,但对Qt和其他图形界面构建工具完全是新手。在这种情况下,最好的做法是什么呢?我跟同事解释了我的任务,他们推荐我使用Qt。如果有人知道更适合用Python完成这个任务的工具,请告诉我。另外,请帮我提供一些技术细节,比如如何捕捉实时音频流并在Python中处理,然后在图形界面窗口中显示。让我有些希望的一个链接是http://www.swharden.com/blog/2010-03-05-realtime-fft-graph-of-audio-wav-file-or-microphone-input-with-python-scipy-and-wckgraph/,但我觉得有点难理解。也许一个简单一点的解决方案能帮助我入门。
3 个回答
在Linux上,这绝对是可行的。其他平台也可以,但我只能针对Linux来回答。虽然Python在实时数字信号处理(DSP)方面可能不是最强的工具,但在一台现代的机器上,目标适度的话,你会没问题的。
首先,你需要一个与Linux音频驱动程序的接口。ALSA是一个比较通用的选择。对于ALSA库,有几种不同的Python封装,可以查看Python In Music,里面有使用这些库的列表和应用。
接下来,你需要进行频谱分析。SciPy和NumPy都能提供这些功能。
然后,你可以在你的Qt窗口中绘图。我的专长是GTK,但你可能想要创建一个QtCanvas (教程),这是一个面向对象的绘图区域,专门为这种用途设计的。
或者你也可以直接使用SciPy,它可能能够完成所有这些工作!特别是AudioLab看起来会对你有很大帮助。
在这个链接中,你可以找到一个使用PyAudio、scipy和Chaco制作的实时音频频谱分析仪的示例,所有代码都在一个脚本里。这个示例在我的Precise系统上直接就能运行。
在Qt 4.6版本中,增加了QAudioInput这个API。这个API可以在不同的平台上获取音频输入信号,所以在实现第一个目标时会很有用。
至于第二个和第三个目标,Qt自带的频谱分析仪演示可能会引起你的兴趣。
这是在Symbian上运行的频谱分析仪演示的截图 http://labs.trolltech.com/blogs/wp-content/uploads/2010/05/spectrum.png这个演示是用C++实现的,而不是Python,不过你可以把它当作参考。基本上,对于第二个目标,你需要计算输入信号的快速傅里叶变换(FFT)。你可能会想用一个提供FFT实现的库,而不是自己写一个——这也是我在写演示时采取的方法 :)
至于第三个目标,概念上其实很简单,但为了让波形平滑滚动,需要一些思考。可以看看演示中Waveform类使用的平铺方法,获取一些技巧。
我想你提到的第四个目标是:将FFT输出中的大量点减少到少量值。这就是演示中为了绘制频谱的柱状图所做的。再次建议查看演示代码,看看频率幅度是如何分箱处理的。