简 介: 利用Python中的soundcard软件包可以对声卡的MIC,SPEAKER进行操作。基于此,配合可编程信号源DG1062可以获得声卡的详细的幅频特性。

关键词声卡soundcarddg1062幅频特性

#mermaid-svg-IzTmU1LiunUTWkuz .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-IzTmU1LiunUTWkuz .label text{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .node rect,#mermaid-svg-IzTmU1LiunUTWkuz .node circle,#mermaid-svg-IzTmU1LiunUTWkuz .node ellipse,#mermaid-svg-IzTmU1LiunUTWkuz .node polygon,#mermaid-svg-IzTmU1LiunUTWkuz .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IzTmU1LiunUTWkuz .node .label{text-align:center;fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .node.clickable{cursor:pointer}#mermaid-svg-IzTmU1LiunUTWkuz .arrowheadPath{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-IzTmU1LiunUTWkuz .flowchart-link{stroke:#333;fill:none}#mermaid-svg-IzTmU1LiunUTWkuz .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-IzTmU1LiunUTWkuz .edgeLabel rect{opacity:0.9}#mermaid-svg-IzTmU1LiunUTWkuz .edgeLabel span{color:#333}#mermaid-svg-IzTmU1LiunUTWkuz .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-IzTmU1LiunUTWkuz .cluster text{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-IzTmU1LiunUTWkuz .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IzTmU1LiunUTWkuz text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-IzTmU1LiunUTWkuz .actor-line{stroke:grey}#mermaid-svg-IzTmU1LiunUTWkuz .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-IzTmU1LiunUTWkuz .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-IzTmU1LiunUTWkuz #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-IzTmU1LiunUTWkuz .sequenceNumber{fill:#fff}#mermaid-svg-IzTmU1LiunUTWkuz #sequencenumber{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz #crosshead path{fill:#333;stroke:#333}#mermaid-svg-IzTmU1LiunUTWkuz .messageText{fill:#333;stroke:#333}#mermaid-svg-IzTmU1LiunUTWkuz .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IzTmU1LiunUTWkuz .labelText,#mermaid-svg-IzTmU1LiunUTWkuz .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-IzTmU1LiunUTWkuz .loopText,#mermaid-svg-IzTmU1LiunUTWkuz .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-IzTmU1LiunUTWkuz .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-IzTmU1LiunUTWkuz .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IzTmU1LiunUTWkuz .noteText,#mermaid-svg-IzTmU1LiunUTWkuz .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-IzTmU1LiunUTWkuz .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-IzTmU1LiunUTWkuz .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-IzTmU1LiunUTWkuz .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-IzTmU1LiunUTWkuz .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .section{stroke:none;opacity:0.2}#mermaid-svg-IzTmU1LiunUTWkuz .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-IzTmU1LiunUTWkuz .section2{fill:#fff400}#mermaid-svg-IzTmU1LiunUTWkuz .section1,#mermaid-svg-IzTmU1LiunUTWkuz .section3{fill:#fff;opacity:0.2}#mermaid-svg-IzTmU1LiunUTWkuz .sectionTitle0{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .sectionTitle1{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .sectionTitle2{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .sectionTitle3{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-IzTmU1LiunUTWkuz .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .grid path{stroke-width:0}#mermaid-svg-IzTmU1LiunUTWkuz .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-IzTmU1LiunUTWkuz .task{stroke-width:2}#mermaid-svg-IzTmU1LiunUTWkuz .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .taskText:not([font-size]){font-size:11px}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-IzTmU1LiunUTWkuz .task.clickable{cursor:pointer}#mermaid-svg-IzTmU1LiunUTWkuz .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IzTmU1LiunUTWkuz .taskText0,#mermaid-svg-IzTmU1LiunUTWkuz .taskText1,#mermaid-svg-IzTmU1LiunUTWkuz .taskText2,#mermaid-svg-IzTmU1LiunUTWkuz .taskText3{fill:#fff}#mermaid-svg-IzTmU1LiunUTWkuz .task0,#mermaid-svg-IzTmU1LiunUTWkuz .task1,#mermaid-svg-IzTmU1LiunUTWkuz .task2,#mermaid-svg-IzTmU1LiunUTWkuz .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutside0,#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutside2{fill:#000}#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutside1,#mermaid-svg-IzTmU1LiunUTWkuz .taskTextOutside3{fill:#000}#mermaid-svg-IzTmU1LiunUTWkuz .active0,#mermaid-svg-IzTmU1LiunUTWkuz .active1,#mermaid-svg-IzTmU1LiunUTWkuz .active2,#mermaid-svg-IzTmU1LiunUTWkuz .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-IzTmU1LiunUTWkuz .activeText0,#mermaid-svg-IzTmU1LiunUTWkuz .activeText1,#mermaid-svg-IzTmU1LiunUTWkuz .activeText2,#mermaid-svg-IzTmU1LiunUTWkuz .activeText3{fill:#000 !important}#mermaid-svg-IzTmU1LiunUTWkuz .done0,#mermaid-svg-IzTmU1LiunUTWkuz .done1,#mermaid-svg-IzTmU1LiunUTWkuz .done2,#mermaid-svg-IzTmU1LiunUTWkuz .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-IzTmU1LiunUTWkuz .doneText0,#mermaid-svg-IzTmU1LiunUTWkuz .doneText1,#mermaid-svg-IzTmU1LiunUTWkuz .doneText2,#mermaid-svg-IzTmU1LiunUTWkuz .doneText3{fill:#000 !important}#mermaid-svg-IzTmU1LiunUTWkuz .crit0,#mermaid-svg-IzTmU1LiunUTWkuz .crit1,#mermaid-svg-IzTmU1LiunUTWkuz .crit2,#mermaid-svg-IzTmU1LiunUTWkuz .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-IzTmU1LiunUTWkuz .activeCrit0,#mermaid-svg-IzTmU1LiunUTWkuz .activeCrit1,#mermaid-svg-IzTmU1LiunUTWkuz .activeCrit2,#mermaid-svg-IzTmU1LiunUTWkuz .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-IzTmU1LiunUTWkuz .doneCrit0,#mermaid-svg-IzTmU1LiunUTWkuz .doneCrit1,#mermaid-svg-IzTmU1LiunUTWkuz .doneCrit2,#mermaid-svg-IzTmU1LiunUTWkuz .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-IzTmU1LiunUTWkuz .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-IzTmU1LiunUTWkuz .milestoneText{font-style:italic}#mermaid-svg-IzTmU1LiunUTWkuz .doneCritText0,#mermaid-svg-IzTmU1LiunUTWkuz .doneCritText1,#mermaid-svg-IzTmU1LiunUTWkuz .doneCritText2,#mermaid-svg-IzTmU1LiunUTWkuz .doneCritText3{fill:#000 !important}#mermaid-svg-IzTmU1LiunUTWkuz .activeCritText0,#mermaid-svg-IzTmU1LiunUTWkuz .activeCritText1,#mermaid-svg-IzTmU1LiunUTWkuz .activeCritText2,#mermaid-svg-IzTmU1LiunUTWkuz .activeCritText3{fill:#000 !important}#mermaid-svg-IzTmU1LiunUTWkuz .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-IzTmU1LiunUTWkuz g.classGroup text .title{font-weight:bolder}#mermaid-svg-IzTmU1LiunUTWkuz g.clickable{cursor:pointer}#mermaid-svg-IzTmU1LiunUTWkuz g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IzTmU1LiunUTWkuz g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-IzTmU1LiunUTWkuz .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-IzTmU1LiunUTWkuz .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IzTmU1LiunUTWkuz .dashed-line{stroke-dasharray:3}#mermaid-svg-IzTmU1LiunUTWkuz #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz .commit-id,#mermaid-svg-IzTmU1LiunUTWkuz .commit-msg,#mermaid-svg-IzTmU1LiunUTWkuz .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-IzTmU1LiunUTWkuz g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-IzTmU1LiunUTWkuz g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IzTmU1LiunUTWkuz g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IzTmU1LiunUTWkuz .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IzTmU1LiunUTWkuz .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-IzTmU1LiunUTWkuz .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-IzTmU1LiunUTWkuz .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IzTmU1LiunUTWkuz .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-IzTmU1LiunUTWkuz .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-IzTmU1LiunUTWkuz .edgeLabel text{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IzTmU1LiunUTWkuz .node circle.state-start{fill:black;stroke:black}#mermaid-svg-IzTmU1LiunUTWkuz .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-IzTmU1LiunUTWkuz #statediagram-barbEnd{fill:#9370db}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-state .divider{stroke:#9370db}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-IzTmU1LiunUTWkuz .note-edge{stroke-dasharray:5}#mermaid-svg-IzTmU1LiunUTWkuz .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-IzTmU1LiunUTWkuz .error-icon{fill:#522}#mermaid-svg-IzTmU1LiunUTWkuz .error-text{fill:#522;stroke:#522}#mermaid-svg-IzTmU1LiunUTWkuz .edge-thickness-normal{stroke-width:2px}#mermaid-svg-IzTmU1LiunUTWkuz .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-IzTmU1LiunUTWkuz .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-IzTmU1LiunUTWkuz .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-IzTmU1LiunUTWkuz .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-IzTmU1LiunUTWkuz .marker{fill:#333}#mermaid-svg-IzTmU1LiunUTWkuz .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-IzTmU1LiunUTWkuz {color: rgba(0, 0, 0, 0.75);font: ;}

操作声卡
文章目录
soundcard
软件包
读取音频设备信息
获取特定输入
录音与回复
录音
回放函数
录音和回复
显示录制
信号波形
采集正弦波
声卡带宽
测量方法
测量结果
测量低频截止频率
测量高频截止频率
设置不同
采用频率
提高采样频率
降低采样频率
测量低频截止频率
测量中频段
幅频特性
实验总结

§01 操作声卡


  在之前通过实验( 测试计算机声卡双通道录音的频率特性 )初步测试了计算机声卡录制声音所对应的频率范围,并在 双声道录制的混动波形信号 记录了 混沌电路产生的混沌物理信号 。实验中使用了录音软件Audacity进行录制。为了方便后期实验,需要测试直接在Python语言中操作声卡。

一、soundcard 软件包

  在python中提供对于声卡操作的软件包包括:

  • PySoundCard
  • SoundCard 0.4.1

  上面两个软件都可以正常安装。由于只在 SoundCard 0.4.1 中给出了示例程序,所以下面仅对SoundCard软件包进行测试。

1、读取音频设备信息

(1) 测试程序

from headm import *
import soundcard as scspeakers = 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 scdefault_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 scdefault_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 指令所获得数据出现截断过程,具体原因还不可而知。


■ 相关文献链接:

  • 测试计算机声卡双通道录音的频率特性
  • 双声道录制的混动波形信号
  • 两个晶体管组成的混沌电路
  • PySoundCard
  • SoundCard 0.4.1
  • DG1062可编程信号源

● 相关图表链接:

  • 图1.3.1 显示采集到的正弦波波形
  • 图1.3.2 显示采集到的正弦波波形
  • 图1.3.3 显示采集到的1kHz的声音波形
  • 图2.1.1 不同频率对应的波形
  • 图2.1.2 不同频率对应的信号的幅值
  • 图2.1.3 测量过程不同波形
  • 图2.1.4 不同频率下采集到的信号的幅值
  • 图2.3.1 采集过程不同频率对应的采集波形
  • 图2.3.2 测量在采样频率96kHz下对应的信号的幅度
  • 图2.3.3 采集到不同频率的信号波形
  • 图2.3.4 声卡在采样频率为24kHz下的幅频特性
  • 图2.3.5 声卡在采样频率24kHz下的幅频特性
  • 图2.3.6 声卡在采样频率12kHz下的幅频特性
  • 图2.3.7 不同频率下采集到的波形
  • 图2.3.8 采样频率为1200Hz,低频下的幅频特性
  • 图2.3.9 不同频率采集到的波形
  • 图2.3.10 采样频率为24000Hz下的声卡的幅频特性
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2021-10-20
#
# Note:
#============================================================
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()
#    data = mic.record(numframes=1024)
#    plt.plot(data)
#    plt.xlabel("Samples")
#    plt.ylabel("Values")
#    plt.grid(True)
#    plt.tight_layout()
#    plt.show()
#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

使用soundcard在Python中操作声卡相关推荐

  1. 在Python中操作文件之truncate()方法的使用教程

    在Python中操作文件之truncate()方法的使用教程 这篇文章主要介绍了在Python中操作文件之truncate()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下 ...

  2. Python中操作MySQL/Oracle

    Python中操作MySQL/Oracle 一.Python操作数据库介绍 二.Python操作MySQL 2.1 PySQL模块 2.1.1 安装PyMySQL 2.2 基本使用 2.3 获取最新创 ...

  3. python中seek函数的用法_在Python中操作文件之seek()方法的使用教程

    seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾. 没有返回值.需要注意的是,如果该文件被 ...

  4. python中的pymysql_(转)Python中操作mysql的pymysql模块详解

    原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...

  5. Python中操作mysql的pymysql模块详解

    前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11. ...

  6. python文件处理seek()方法的参数是,在Python中操作文件之seek()方法的使用教程

    在Python中操作文件之seek()方法的使用教程 seek()方法在偏移设定该文件的当前位置.参数是可选的,默认为0,这意味着绝对的文件定位,它的值如果是1,这意味着寻求相对于当前位置,2表示相对 ...

  7. 二十三、python中操作MySQL步骤

    python中操作mysql步骤 1.引入模块 在py文件中引入pymysql模块 from pymysql import * 2.connection对象 用于建立与数据库的连接 创建对象:调用co ...

  8. python gmtime_在Python中操作日期和时间之gmtime()方法的使用

    在Python中操作日期和时间之gmtime()方法的使用 这篇文章主要介绍了在Python中操作日期和时间之gmtime()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 gm ...

  9. python中gmtime的hour错误_python中gmtime的hour错误_在Python中操作日期和时间之gmtime()方法的使用...

    python中datetime怎么用广告总是在最精彩的时候出现,你总是在小编爱的最深的时候离开. ''''' 日期相关的操作 ''' from datetime import datetime fro ...

最新文章

  1. 提升职场价值,把握成长方向
  2. VTK:可视化之VisualizeImageData
  3. easyui中的option设置selected没有效果
  4. ASP.NET Core 快速入门(实战篇)
  5. 网页复选框设置只能选一个_男生在密室呆一个月, 只能选手机或者女人, 结果太现实...
  6. php写简单接口_php写接口的日常
  7. 任务计划、chkconfig工具、systemd管理服务、unit、target
  8. Jpa的@Id和@GeneratedValue的使用
  9. Spring-bean的循环依赖以及解决方式___Spring源码初探--Bean的初始化-循环依赖的解决
  10. Mac设置terminal 像其他linux发行版一样显示工作路径
  11. python 根据关键字 切割pdf_用python拆分pdf
  12. 【Kindle】pdf转mobi适合kindle查看格式
  13. html 跑步比赛小游戏,趣味跑步比赛游戏
  14. 线性代数齐次方程求解与非齐次方程的解的关系
  15. 连接超时与读取超时概述
  16. 基于共享单车轨迹的自行车道规划(读书笔记)
  17. 中国医科大学2021年9月《护理研究》作业考核试题
  18. Linux创建磁盘并分区命令
  19. 群晖服务器+微信同步,群晖服务器 云同步
  20. 流利阅读12.27 Why life expectancy in America is down again

热门文章

  1. 阿里巴巴直播防控中的实人认证技术
  2. Ubuntu Server上的LVM配置
  3. Selenium Firefox启动提示导入收藏夹
  4. Dev 控件中的combox禁止输入
  5. UniDAC使用教程(二):数据更新
  6. MySQL WHERE语句筛选操作符
  7. solr4.5分组查询、统计功能介绍
  8. NeHe OpenGL教程 第二十三课:球面映射
  9. 《大数据分析原理与实践》——小结
  10. Hadoop(十二):从源码角度分析Hadoo是如何将作业提交给集群的