简 介: 利用Python中的soundcard软件包可以对声卡的MIC,SPEAKER进行操作。基于此,配合可编程信号源DG1062可以获得声卡的详细的幅频特性。
关键词 : 声卡,soundcard,dg1062,幅频特性
?
§01 操作声卡
??在之前通过实验( 测试计算机声卡双通道录音的频率特性 )初步测试了计算机声卡录制声音所对应的频率范围,并在 双声道录制的混动波形信号 记录了 混沌电路产生的混沌物理信号 。实验中使用了录音软件Audacity进行录制。为了方便后期实验,需要测试直接在Python语言中操作声卡。
一、soundcard 软件包
??在python中提供对于声卡操作的软件包包括:
??上面两个软件都可以正常安装。由于只在 SoundCard 0.4.1 中给出了示例程序,所以下面仅对SoundCard软件包进行测试。
1、读取音频设备信息
(1) 测试程序
from headm import *
import soundcard as sc
speakers = sc.all_speakers()
printf(speakers)
default_speaker = sc.default_speaker()
printf(default_speaker)
mics = sc.all_microphones()
printf(mics)
default_mic = sc.default_microphone()
printf(default_mic)
(2) 读取结果
[<Speaker 扬声器 (VIA High Definition Audio) (2 channels)>, <Speaker DELL U2410-1 (NVIDIA High Definition Audio) (2 channels)>, <Speaker SPDIF Interface (TX0) (VIA High Definition Audio) (2 channels)>, <Speaker SPDIF Interface (TX1) (VIA High Definition Audio) (2 channels)>]
<Speaker 扬声器 (VIA High Definition Audio) (2 channels)>
[<Microphone Analog (USB Capture AIO Analog) (2 channels)>, <Microphone 立体声混音 (VIA High Definition Audio) (2 channels)>, <Microphone Digital (USB Capture AIO) (2 channels)>, <Microphone 麦克风 (3- USB Audio Device) (1 channels)>, <Microphone 数字音频接口 (USB3. 0 capture) (1 channels)>, <Microphone 线路输入 (VIA High Definition Audio) (2 channels)>]
<Microphone 麦克风 (3- USB Audio Device) (1 channels)>
2、获取特定输入
??利用 get_microphone() 获得对应的mic 输入。
one_mic = sc.get_microphone('线路输入')
printf(one_mic)
??上述代码输出:
<Microphone 线路输入 (VIA High Definition Audio) (2 channels)>
二、录音与回复
1、录音
??下面给出了录音的函数:
data = default_mic.record(samplerate=48000, numframes=48000)
2、回放函数
??下面给出了回放函数:
default_speaker.play(data/numpy.max(data), samplerate=48000)
3、录音和回复
??下面的代码测试了利用 “线路输入”进行录音,然后通过缺省喇叭进行回放。
with one_mic.recorder(samplerate=48000) as mic,\
default_speaker.player(samplerate=48000) as sp:
for _ in range(10):
data = mic.record(numframes=10240)
sp.play(data)
??修改回复的samplerate参数,可以改变回复是声音的频率。
三、显示录制信号波形
1、采集正弦波
from headm import *
import soundcard as sc
default_mic = sc.default_microphone()
one_mic = sc.get_microphone('线路输入')
data = one_mic.record(samplerate=48000, numframes=1024)
plt.plot(data)
plt.xlabel("Samples")
plt.ylabel("Values")
plt.grid(True)
plt.tight_layout()
plt.show()
▲ 图1.3.1 显示采集到的正弦波波形
▲ 图1.3.2 显示采集到的正弦波波形
??从上面可以看到在数据的起始部分显示了一些数据为0的采集数据。这可能是声卡在被初始化的时候对应的起始数据为0。下面通过对声卡先进行初始化,采集 一段之后,再采集,就可以避免这种情况。
from headm import *
import soundcard as sc
default_mic = sc.default_microphone()
one_mic = sc.get_microphone('线路输入')
with one_mic.recorder(samplerate=48000) as mic:
mic.record(numframes=1000)
data = mic.record(numframes=1024)
plt.plot(data)
plt.xlabel("Samples")
plt.ylabel("Values")
plt.grid(True)
plt.tight_layout()
plt.show()
▲ 图1.3.3 显示采集到的1kHz的声音波形
?
§02 声卡带宽
??在 测试计算机声卡双通道录音的频率特性 对于声卡的带宽进行了初步测试。下面通过Python来对声卡采集到的数据进行处理,便可以获得多点不同频率下的声卡采集到的信号的幅度,进而可以更加精确获得声卡的带宽。
一、测量方法
??利用 DG1062可编程信号源 产生不同频率下的信号,送到声卡进行采集。通过读取声卡采集到的信号,计算出它对应的幅值(通过对最大值,最小值进行检测)进而计算采集到的信号的幅值。
??通过测量一组不同频率下的声卡获得信号的幅值,绘制出声卡的幅频特性。
二、测量结果
1、测量低频截止频率
(1) 测量代码
from headm import *
import soundcard as sc
from tsmodule.tsvisa import *
dg1062open(103)
dg1062freq(1,2000)
one_mic = sc.get_microphone('线路输入')
pltgif = PlotGIF()
with one_mic.recorder(samplerate=48000) as mic:
mic.record(numframes=100000)
fdim = linspace(1, 10, 50)
ddim = []
for f in fdim:
dg1062freq(1,f)
data = mic.record(numframes=48000)
damp = max(list(data[:,0])) - min(list(data[:,0]))
ddim.append(damp)
printff(f, damp)
plt.clf()
plt.plot(data[:,0])
plt.xlabel("Sample")
plt.ylabel("Values")
plt.grid(True)
plt.tight_layout()
plt.draw()
plt.pause(.1)
pltgif.append(plt)
plt.clf()
pltgif.save()
tspsave('datal', f=fdim, d=ddim)
plt.plot(fdim, ddim)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
(2) 测量过程波形
▲ 图2.1.1 不同频率对应的波形
(3) 测量结果
▲ 图2.1.2 不同频率对应的信号的幅值
??可以看到在上面测量过程中,采集到的数据出现较大的问题,主要是出现数据的丢失。
2、测量高频截止频率
测量频率范围:
-
起始频率 :10kHz
截止频率 :50kHz
采集步数 :50
(1) 采集到不同频率波形
??下面是测量过程中采集到的不同频率的波形:
▲ 图2.1.3 测量过程不同波形
(2) 幅频特性
??下面是不同频率下声卡采集到的信号波形的幅值。
▲ 图2.1.4 不同频率下采集到的信号的幅值
??通过上述采集到的声卡的幅频特性,可以看到它的高频截止频率硬给了25kHz。
三、设置不同采用频率
1、提高采样频率
??设置高频采样频率为96kHz,重复上面测量高频截止频率过程。
▲ 图2.3.1 采集过程不同频率对应的采集波形
??在96kHz下, 对应的声卡的幅频特性如下:
▲ 图2.3.2 测量在采样频率96kHz下对应的信号的幅度
??可以看到提高采样频率并没有实质提高声卡的高频截止频率。
2、降低采样频率
??降低采样频率,设置声卡的采样频率为 24kHz。重新测试声卡的高频截止频率。
▲ 图2.3.3 采集到不同频率的信号波形
▲ 图2.3.4 声卡在采样频率为24kHz下的幅频特性
??从上面可以看到在24kHz 采样频率下,声卡的截止频率大约在12kHz。这说明在声卡前面已经有了抗混叠滤波器了。
??下面是重新测量扫频范围在 10 ~ 20kHz下,采样频率在24kHz下对应的声卡的幅频特性。
▲ 图2.3.5 声卡在采样频率24kHz下的幅频特性
??下面是设置采样频率为12kHz 下,声卡的高频部分的幅频特性。
▲ 图2.3.6 声卡在采样频率12kHz下的幅频特性
??通过上面测试结果可以看到,声卡的采样频率越低,对应的高频截止频率也越低。对应的截止频率(对应增益降低到原来的一半,-6dB)对应的频带宽度等于采样频率的一半。这证明了声卡中存在着前置的可编程的抗混叠滤波器。
3、测量低频截止频率
??设置声卡的采样频率为1200Hz,重新测量声卡的低频采样频率。
▲ 图2.3.7 不同频率下采集到的波形
▲ 图2.3.8 采样频率为1200Hz,低频下的幅频特性
??对比之前的结果来看,在低频阶段,声卡采集到的声音的波形依然存在着较大的损失。
4、测量中频段幅频特性
??测量1000 ~ 2000Hz中声卡的幅频特性。设置采样频率为24000Hz。
▲ 图2.3.9 不同频率采集到的波形
▲ 图2.3.10 采样频率为24000Hz下的声卡的幅频特性
from headm import *
import soundcard as sc
from tsmodule.tsvisa import *
dg1062open(103)
dg1062freq(1,2000)
one_mic = sc.get_microphone('线路输入')
pltgif = PlotGIF()
with one_mic.recorder(samplerate=24000) as mic:
mic.record(numframes=100000)
fdim = linspace(1000, 2000, 50)
ddim = []
for f in fdim:
dg1062freq(1,f)
data = mic.record(numframes=1024)
damp = max(list(data[:,0])) - min(list(data[:,0]))
ddim.append(damp)
printff(f, damp)
plt.clf()
plt.plot(data[:,0])
plt.xlabel("Sample")
plt.ylabel("Values")
plt.grid(True)
plt.tight_layout()
plt.draw()
plt.pause(.1)
pltgif.append(plt)
plt.clf()
pltgif.save()
tspsave('datal', f=fdim, d=ddim)
plt.plot(fdim, ddim)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
?
※ 实验总结 ※
??测试了python中soundcard软件包对于计算机声卡的操作,利用线路输入可以获取外部模拟信号的波形,并通过speaker进行播放。
??通过程序,控制信号源DG1062,利用soundcard采集到信号波形,可以逐点获得声卡的幅频特性。声卡的高频截止频率最大为25kHz左右,不再随着采样频率的提高而提高。如果声卡的采样频率低于48000Hz,声卡中具有前端的抗混叠滤波器,抗混叠滤波器的截止频率等于采样频率的一半。
??对于声卡的低频以及中频的幅频特性的测量,显示了采集过程中数据的不稳定性,这也实测测量结果出现了较大的抖动。
??具体为什么使用soundcard中的 record 指令所获得数据出现截断过程,具体原因还不可而知。
■ 相关文献链接:
● 相关图表链接:
from headm import *
import soundcard as sc
from tsmodule.tsvisa import *
dg1062open(103)
dg1062freq(1,2000)
one_mic = sc.get_microphone('线路输入')
pltgif = PlotGIF()
with one_mic.recorder(samplerate=24000) as mic:
mic.record(numframes=100000)
fdim = linspace(1000, 2000, 50)
ddim = []
for f in fdim:
dg1062freq(1,f)
data = mic.record(numframes=1024)
damp = max(list(data[:,0])) - min(list(data[:,0]))
ddim.append(damp)
printff(f, damp)
plt.clf()
plt.plot(data[:,0])
plt.xlabel("Sample")
plt.ylabel("Values")
plt.grid(True)
plt.tight_layout()
plt.draw()
plt.pause(.1)
pltgif.append(plt)
plt.clf()
pltgif.save()
tspsave('datal', f=fdim, d=ddim)
plt.plot(fdim, ddim)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
|