IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 使用soundcard在Python中操作声卡 -> 正文阅读

[Python知识库]使用soundcard在Python中操作声卡

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

关键词 声卡soundcarddg1062幅频特性

?

§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.1 显示采集到的正弦波波形

▲ 图1.3.2 显示采集到的正弦波波形

▲ 图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的声音波形

▲ 图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  不同频率对应的波形

▲ 图2.1.1 不同频率对应的波形

(3) 测量结果

▲ 图2.1.2 不同频率对应的信号的幅值

▲ 图2.1.2 不同频率对应的信号的幅值

??可以看到在上面测量过程中,采集到的数据出现较大的问题,主要是出现数据的丢失。

2、测量高频截止频率

测量频率范围:
起始频率:10kHz
截止频率:50kHz
采集步数:50

(1) 采集到不同频率波形

??下面是测量过程中采集到的不同频率的波形:

▲ 图2.1.3  测量过程不同波形

▲ 图2.1.3 测量过程不同波形

(2) 幅频特性

??下面是不同频率下声卡采集到的信号波形的幅值。

▲ 图2.1.4 不同频率下采集到的信号的幅值

▲ 图2.1.4 不同频率下采集到的信号的幅值

??通过上述采集到的声卡的幅频特性,可以看到它的高频截止频率硬给了25kHz。

三、设置不同采用频率

1、提高采样频率

??设置高频采样频率为96kHz,重复上面测量高频截止频率过程。

▲ 图2.3.1  采集过程不同频率对应的采集波形

▲ 图2.3.1 采集过程不同频率对应的采集波形

??在96kHz下, 对应的声卡的幅频特性如下:

▲ 图2.3.2 测量在采样频率96kHz下对应的信号的幅度

▲ 图2.3.2 测量在采样频率96kHz下对应的信号的幅度

??可以看到提高采样频率并没有实质提高声卡的高频截止频率。

2、降低采样频率

??降低采样频率,设置声卡的采样频率为 24kHz。重新测试声卡的高频截止频率。

▲ 图2.3.3  采集到不同频率的信号波形

▲ 图2.3.3 采集到不同频率的信号波形

▲ 图2.3.4 声卡在采样频率为24kHz下的幅频特性

▲ 图2.3.4 声卡在采样频率为24kHz下的幅频特性

??从上面可以看到在24kHz 采样频率下,声卡的截止频率大约在12kHz。这说明在声卡前面已经有了抗混叠滤波器了。

??下面是重新测量扫频范围在 10 ~ 20kHz下,采样频率在24kHz下对应的声卡的幅频特性。

▲ 图2.3.5 声卡在采样频率24kHz下的幅频特性

▲ 图2.3.5 声卡在采样频率24kHz下的幅频特性

??下面是设置采样频率为12kHz 下,声卡的高频部分的幅频特性。

▲ 图2.3.6 声卡在采样频率12kHz下的幅频特性

▲ 图2.3.6 声卡在采样频率12kHz下的幅频特性

??通过上面测试结果可以看到,声卡的采样频率越低,对应的高频截止频率也越低。对应的截止频率(对应增益降低到原来的一半,-6dB)对应的频带宽度等于采样频率的一半。这证明了声卡中存在着前置的可编程的抗混叠滤波器。

3、测量低频截止频率

??设置声卡的采样频率为1200Hz,重新测量声卡的低频采样频率。

▲ 图2.3.7  不同频率下采集到的波形

▲ 图2.3.7 不同频率下采集到的波形

▲ 图2.3.8 采样频率为1200Hz,低频下的幅频特性

▲ 图2.3.8 采样频率为1200Hz,低频下的幅频特性

??对比之前的结果来看,在低频阶段,声卡采集到的声音的波形依然存在着较大的损失。

4、测量中频段幅频特性

??测量1000 ~ 2000Hz中声卡的幅频特性。设置采样频率为24000Hz。

▲ 图2.3.9  不同频率采集到的波形

▲ 图2.3.9 不同频率采集到的波形

▲ 图2.3.10 采样频率为24000Hz下的声卡的幅频特性

▲ 图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 指令所获得数据出现截断过程,具体原因还不可而知。


■ 相关文献链接:

● 相关图表链接:

#!/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
#============================================================
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-21 12:08:59  更:2021-10-21 12:09:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 10:46:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计