QT 音频数据采集并绘制波形图

Posted 小米的修行之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT 音频数据采集并绘制波形图相关的知识,希望对你有一定的参考价值。

1、界面:

2、使用到的QT相关类介绍:

(1)、QAudioRecorder:音频录制类 ,其父类为:QMediaRecorder。录制的音频数据可以直接写入到文件中,不需要操作QIODevice进行设备的读写。录制的音频数据除包含原始数据,还包含了数据头信息,这样录制的文件可以直接使用播放器进行播放。

(2)QAudioEncoderSettings:音频编码格式设置类,主要用于在录制之前设置音频的:采样率、编码格式、比特率、通道数、品质等等。

(3)QAudioBuffer:具有特定格式和采用率的音频样本集合,包含了音频的原始数据和缓冲区的信息,其中缓冲区信息:缓冲区字节数、缓冲区时长、缓冲区帧数、缓冲区采样数、音频格式(QAudioFormat)等。

(4)QAudioFormat:音频格式类:通道数、采样大小、采样率、每帧字节数、字节序、编码格式、采样点类型等等。

(5)QAudioProbe:监视正在播放和录制的视频类。

3、波形图绘制具体步骤:

(1)、通过QAudioBuffer获取音频的原始数据;

(2)、对原始数据进行归一化处理;

(3)绘制c

绘制音频波形和频谱图重叠

【中文标题】绘制音频波形和频谱图重叠【英文标题】:Plot audio waveform and spectrogram overlap 【发布时间】:2019-12-11 21:59:44 【问题描述】:

我正在使用 librosa 处理音频,我需要在同一个显示器中绘制频谱图和波形。

我的代码:

plt.figure(figsize=(14, 9))

plt.figure(1)

plt.subplot(211)
plt.title('Spectrogram')
librosa.display.specshow(stft_db, x_axis='time', y_axis='log')

plt.subplot(212)
plt.title('Audioform')
librosa.display.waveplot(y, sr=sr)

使用这段代码我得到了这个情节

但我需要这样的东西

【问题讨论】:

【参考方案1】:

根据 librosa,您可以为显示方法提供一个轴来绘制项目,specshow、waveplot。我建议直接定义你的 matplotlib 图形和子图,然后给 librosa 绘制它们的坐标轴。

fig = plt.figure(figsize=(14, 9)) #This setups the figure
ax1 = fig.subplots() #Creates the Axes object to display one of the plots
ax2 = ax1.twinx() #Creates a second Axes object that shares the x-axis

librosa.display.specshow(stft_db, x_axis='time', y_axis='log', ax=ax1)
librosa.display.waveplot(y, sr=sr, ax=ax2)
plt.show()

可能需要进行更多格式化以获得所需的外观,我建议查看 matplotlib 中的this example,以获得类似的共享轴图。

【讨论】:

感谢乔的快速回复!效果很好!【参考方案2】:

不使用子图,而是使用单个图的相同轴来显示两个图。

fig = plt.figure(figsize=(14, 9))
ax = librosa.display.specshow(stft_db, x_axis='time', y_axis='log')
librosa.display.waveplot(y, sr=sr, ax=ax)
plt.show()

【讨论】:

以上是关于QT 音频数据采集并绘制波形图的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中绘制录音音频波形图

Labview波形图 怎么做到不把绘制出来的图像删除 直接在上面绘制新的图形

Labview波形图 怎么做到不把绘制出来的图像删除 直接在上面绘制新的图形

使用QT绘图控件QCustomPlot绘制波形图

使用QT绘图控件QCustomPlot绘制波形图

Qt编写自定义控件57-直方波形图