Python数字信号处理应用:声音和信号
信号代表随着时间变化的量。这个定义是非常抽象的,所以我们从具象的例子——声音开始。声音源自于空气压力的改变。声音信号代表的是空气压力随着时间的变化。
传声器是测量上述变化并产生表示所测声音的电信号的设备。扬声器是通过输入的电信号产生声音的设备。传声器和扬声器都被称为换能器( transducer ) ,因为它们将信号从一种形式转化成另一种形式,也就是变换了能量的形式。
这本书重点关注信号处理,包括信号的合成、转换和分析。本书将着重于声音信号,但是其方法也同样适用于电信号、机械振动和其他各个领域的信号。
这套方法也同样适用于随空间而不是时间变化的信号,比如远足路线上的海拔变化。还适用于不止一个维度的信号,比如图像--读者可以将它想象为在二维空间中变化的信号。又或者电影,它是二维空间中随着时间变化的信号。
本书从简单的一维声音信号开始。
本章中的代码在这本书资料库的chap01.ipynb中。同时你也可以通过访问http://tinyurl.com/thinkdsp01获取。
1.1周期信号先从周期信号开始,周期信号是在一段时间之后重复出现的信号。比如,你在敲钟时候,钟会振动从而产生声音。把这段声音录制下来,然后绘制出转换后的信号,具体如图1-1所示。
这个信号和三角函数相似,也就是说其形状和正弦三角函数的形状一样。
图1-1中的信号是周期性的。本书所选择的时段显示了3个完整的重复,这也被称为循环。每个循环的时长被称为周期,图1.1中信号的周期大约2.3ms.
图1-1 钟声录音片段
信号的频率是每秒钟内周期的数量,即周期的倒数。频率的单位是每秒钟循环数,或者称为赫兹(Hertz) ,英文符号为“Hz"。
图1-1所示的信号的频率大约为439 Hz ,比交响音乐对音标准的440 Hz稍低。这个音符的音名叫作A,或者更确切地说是A4,如果你对“科学音调记号法”不熟悉,这里的数字后缀表示的是音符所在的八度。A4意思是中央C上面的那个A ,而A5则比其高出一个八度。详见
http://en.wikipedia.org/wiki/Sientific_pitch_notation。
音叉产生的是正弦信号,因为线形的变化是一种简单的谐波运动形式。大部分乐器产生的是周期信号但是这些信号的形状不是正弦式的。例如,图1-2所示的是小提琴演奏鲍凯利尼E大调第五弦乐五重奏第三乐章的录音片段。
图1-2所示的信号是周期性的,但是信号的形状更加复杂。周期信号的形状被称为波形。大部分乐器产生的波形比正弦信号的复杂。波形的形状决定了音乐的音色,也就是我们对声音品性的感受。对于比正弦信号更复杂的复杂波形,人们主观上认为它更加富有内涵、更温暖而有趣。
图1-2 小提琴录音片段
1.2频谱分析本书中最重要的主题是频谱分析,在这个意义下,任何信号都可以表示成一系列不同频率的正弦信号的叠加和。
本书中最重要的数学概念是离散傅里叶变换( Discrete Fourier Transform, DFT ) , DFT也就是将信号转换成频谱。频谱是指相加产生信号的正弦波的集合。
本书中最重要的算法是快速傅里叶变换( Fast Fourier Transform, FFT ) ,它是计算离散傅里叶变换的一种高效方式。
例如,图1-3显示的是图1-2中小提琴录音的频谱。x轴表示的是合成这个信号的频率范围,y轴表示各个频率元素的强度,或者说是振幅。
其中频率最低的元素被称为基频。图1-2所示信号的基频在440 Hz左右(实际上要低一点,或者说"降调") 。
图1-3 小提琴录音片段的频谱
此信号中,基频具有最高的幅度,所以它也是主频。通常情况下,感知到的声音的音高是由其基频决定的,即使它不是主频。
频谱中的其他峰值的频率还有880、1320、1760和2 200 ,它们是基频的整数倍。这些频率元素被称为谐波,因为它们在乐理概念上跟基频和谐:
880Hz是A5的频率,比基频高出一个八度。一个八度意味着频率的两倍;
1320 Hz接近E6 ,也就是A5的纯五度。如果读者对“纯五度”这样的音程概念不熟悉,可以参考https://en.wikipedia.org/wiki/interval_( music) :
1760是A6的频率,比基频高出两个八度;
2200接近C#7,E跟A6是大三度关系。
这些谐波共同构成了A大调和弦,虽然它们并不在同一个八度内。其中的一些音只是近似,因为西方音乐已经按平均律作了调整(参见http://en.wikipedia.org/wiki/ Equal_ temperament )。
在给定谐波和其各自的振幅之后,读者就可以通过加和正弦波来重建信号了。这我们将在后文中讲解。
1.3信号
我写的Python模块thinkdsp.py中包含信号和频谱分析的类和函数。读者可以在本书的仓库中找到这个模块(参见前言中"代码示例的使用")。
thinkdsp提供了一个显示信号的类,名为Signal,这个类是多个信号类型的父类,包括Sinusoid ,下面又包含正弦和弦信号。
thinkdsp提供产生正弦和余弦信号的函数,调用方法如下:
freq是频率,单位为Hz, amp是振幅,单位未指定,将其设定为1.0意思是我们能录制和回放的振幅的最大值。
offset是相位差,按弧度定义。相位差定义了信号周期的开始。比如, offset=0的正弦信号从sin 0开始,也就是从0开始。offset=π/2则从sinπ/2开始,也就是从1开始。
各信号都有_add_方法。所以读者可以对它们使用+操作:
其结果为SumSignal ,表示了两个或者多个信号的叠加和。
Signal实际上是数学函数的Python表示。大部分的信号( Signal )在全部的值下做了定义-从负无穷到正无穷。
读者如果不对Signal进行求值,那它就没什么作用。在这个语境下, "求值"的意思是,根据一系列的时间点ts ,来计算出对应的信号值ys,我在Wave对象中使用封装了表示ts和ys的NumPy数组。
Wave表示的是信号在一系列时间点下求出的值。每个时间点被称为帧(这是借用了电影和视频的概念)。测度本身被称为样本,虽然"帧"和"样本”在一些情况下可以互换使用。
Signal提供了make-wave,后者返回一个新的Wave对象:
duration参数指的是Wave的长度,单位为秒。star意为开始的时间,单位也是秒。framerate是每秒帧数,它是一个整数,意思也就是每秒内的样本数。
11025帧每秒是在音频文件格式中最常使用的几个帧率之一,这些音频文件包括波形音频文件(Waveform Audio File, WAV )和MP3。
这个例子对信号从t-0到-0.5进行求值,共取得5 513个间距相等的帧( 5513是11 025的一半)。帧间的时间差被称为时间步长,值为1/11 025s,约等于91us.
Wave提供了plot方法,使用方法为pyplot,读者可以这样绘制波形:
pyplot是matplotlib的一部分。很多Python发布版都含有它,否则读者就需要自行安装了。
对于freq=440 ,在0.5秒之内有220个周期,所以其绘制结果看起来会像一大块色块。要放大显示几个周期的波形,读者可以使用segment,它复制了Wave的一段,然后返回一个新波形:
period是Signal的属性,它返回的是信号的周期,单位为秒。
start和duration的单位都是秒。这个例子从mix中复制了前3个周期。其结果是一个Wave对象。
如果我们绘制segment,它的结果如图1-4所示。这个信号包含两个频率元素,所以它比音叉的的信号更为复杂,但是比小提琴的简单。
图1-4 两个三角函数混合信号的片段
1.4 波形的读写
Thinkdsp提供的read_wave可以读取WAV文件并返回一个Wave对象:
Wave提供了write函数,它能写WAV文件:
读者能通过媒体播放器播放WAV文件,从而听到这个Wave对象。在Unix系统上我使用的是aplay,它是一个简单鲁棒的播放器,很懂Linux发行版都有它。
Thinkdsp同时还提供play_wave,它能以子进程运行媒体播放器:
一般情况下,我使用的是aplay,读者当然也可以使用其他播放器。
1.5 频谱
Wave提供了make_spectrum,它返回的是Spectrum:
而Spectrum提供了plot:
我所写的thinkplot模块提供了pyplot中一些函数的封装。它包含于本书的Git仓库中(参见前言的"代码示例的使用")。
Spectrum提供了3种修改频谱的方法。
low_pass,它加载一个低通滤波器,也就是说高于某个给定的截止频率的频率元素被按照一定因数衰减(也就是在大小上降低)了。
high_pass,它加载了一个高通滤波器,也就是说低于某个截止频率的元素被衰减量。
Band_stop,它让处于两个截止频率之间的波段内的频率元素衰减了。
下面的例子将所有高于600的频率衰减了99%:
低通滤波器会移除明亮的高频声音信号,所以其结果的声音比较压抑而且昏暗。读者可以将Spectrum转化回Wave ,然后播放来感受一下:
play方法将波形写入一个文件并播放它。如果读者使用Jupyter Notebook ,就可以使用make_audio ,它会创建一个音频部件用于播放声音。
1.6波形对象
thinkasp.py里面并没有什么复杂的东西。其提供的大部分函数只是对NumPy和SciPy函数的稀薄封装( thin wrappers )。
thinkdsp的初始库包括Signal、wave和Spectrum 。给定Signal,读者就能创建一个wave。给定一个wave,读者就能创建一个spectrum,反之亦然。其关系如图1-5所示。
Wave对象包括3个特性:包含信号参数的NumPy数组vs ;信号开始采样和取值的时间点数组ts;每单位时间的采样数framerate,时间的单位通常是秒,但也可以不是。在我所列举的一些例子中,时间的单位都是天。
图1-5 thinkdsp中各类之间的关系
Wave还提供了3个只读属性: start, end和duration.如果读者修改了 ts ,这些属性也会相应改变。读者可以通过直接修改ts和ys来改变波形。例如:
第一行将波形扩大了2倍,让它听起来更响亮。第二行将被波形按时间移动了,让它晚一秒开始。
此外wave还提供了执行通用操作的方法。例如,与上面相同的两个变换可以写成以下形式:
读者可以在http://greenteapress.com/thinkdsp.html阅读关于这些方法和其他内容的文档。
1.7 信号对象
signal是一个父类,它向各种信号提供通用的函数,比如make_wave 。子类继承了这些方法并提供evaluate ,也就是在给定的时间序列内对信号取值。
例如,Sinusoid是signal的子类,定义如下:
_init_的参数有:
freg
频率,其含义为每秒周期数,单位是Hz.
amp
幅度。幅度的单位比较随意,通常设定为1.0 ,对应为传声器的最大输入或给扬声器的最大输出。
offset
其含义为信号周期的起始。offset的单位为弧度。
func
它是一个Python函数,用来对指定时间点的信号求值。通常它不是np.sin就是np.cos ,对应的分别是正弦信号和余弦信号。
跟很多初始化方法一样,它也是把参数存起来以备未来使用。
Signal提供了make_wave ,如下所示:
start 和duration 分别表示开始和持续的时间,单位为秒。 framerate是每秒帧数(采样数)。
n代表采样的数量,而ts是采样时间的 Numpy 数组。
为计算ys , make_wave 需要引用evaluate ,它是由Sinusoid提供的:
下面我们来逐步地解析这个函数。
1. self.freg 是频率,代表每秒周期数,而ts的各个元素都是以秒计的,所以它们的乘积是从起始时间开始的周期数。
2.P12是一个常数,其值为21,乘上P12之后就把周期转换成了相位。读者可以把相位理解为弧度形式的"从起始时间开始的周期数",而每个周期的弧度是2π。
3. self.offset 是t=0时刻的相位。其作用是把信号在时域上向左或者向右移动一定距离。
4·如果self.func是np.sin 或者np.cos ,其值便是处于-1~1。
5·乘上self.amp之后产生的信号范围为- self.amp到self.amp。
在数学意义上, evaluate 的形式如下:
y = Acos (2π ft +фo)
其中A是幅度,是频率,是时间, ф0是相位偏移。这里看起来像是我写了大段的代码,而仅仅为了对一个简单的表达式求值,但是正如我们将要看到的,这段代码提供了处理所有信号的构架,而不仅是三级函数信号的。
本文节选自《Python数字信号处理应用》
本书介绍了使用Python语言实现数字信号处理的方法,内容共有11章,以Python代码为示例由浅入深地向读者介绍了数字信号处理的相关知识及其应用。书中涉及周期信号及其频谱、波形的谐波结构、非周期信号以及频谱图、噪声、自相关函数、离散余弦变换和离散傅里叶变换、滤波、卷积、微分与积分、调制采样等数字信号处理相关技术。
浅谈数字信号处理器的定义、作用、原理及应用场景
数字信号处理器(DSP) 作为一种关键的电子元件,在通信、音频、图像处理等领域扮演着不可或缺的角色。然而,对于许多人来说,数字信号处理器的概念可能依然模糊,其作用和原理也许并不为人所熟知。因此,小编接下来将浅谈数字信号处理器的本质与作用,从定义、原理到应用场景,全面解析数字信号处理器的重要性和广泛应用。
一、 数字信号处理器的定义与概述
数字信号处理器(DSP)是一种专用的微处理器,其设计用于执行数字信号处理相关的任务。与通用微处理器相比,DSP更专注于数字信号处理应用,具有高效处理数字信号的能力。
二、数字信号处理器的基本工作原理
数字信号处理器通过一系列算法和指令来处理数字信号。其基本工作原理包括以下几个关键步骤:
取样与量化 :将模拟信号转换为数字信号,通过取样和量化操作获取信号的离散表示。数字信号处理 :利用内置的算法和指令对数字信号进行各种处理,如滤波、变换、编解码等。输出重构 :将处理后的数字信号重新转换为模拟信号输出,供后续电路或设备使用。三、 数字信号处理器的作用与优势
数字信号处理器在以上应用场景中发挥着重要的作用,并具有以下优势:
高效性 :专门优化的硬件结构和算法设计,使得其在数字信号处理方面具有高效性能。灵活性 :可编程的特性使得数字信号处理器能够适应不同的信号处理需求,具有较高的灵活性。实时性 :快速的处理速度和低延迟使得数字信号处理器能够实现对实时信号的处理要求。四、数字信号处理器的应用场景
数字信号处理器广泛应用于许多领域,包括但不限于:
1、通信领域
数字信号处理器在通信领域有着广泛的应用,其中最典型的案例之一是在基站中的使用。通过数字信号处理器,基站能够高效地处理信号、调制解调、错误校正等,实现数据的传输和通信的稳定性。例如,4G和5G网络中的基站使用了先进的数字信号处理器技术,提供了更快的数据传输速度和更稳定的网络连接。
2、音频处理领域
在音频处理领域,数字信号处理器也发挥着重要作用。例如,音频处理器和音频编解码器中常常集成了数字信号处理器,用于实现音频信号的滤波、均衡、混响等处理。许多音频设备,如数字音频播放器、音频接口等,都采用了数字信号处理器技术,为用户提供高品质的音频体验。
3、图像处理领域
数字信号处理器在图像处理领域也有着重要的应用。例如,数字相机、图像传感器等设备中常常集成了数字信号处理器,用于图像的采集、处理和压缩。此外,数字信号处理器还可以用于图像增强、目标识别等领域,为图像处理提供了强大的技术支持。
4、医疗设备领域的应用:
医学成像 :数字信号处理器在医学成像设备中广泛应用,如CT(计算机断层扫描)、MRI(磁共振成像)、超声波和X射线成像等。它们用于图像重建、去噪、增强和实时图像处理。心电图(ECG)分析 :在心电图监测和分析中,DSP用于提取心电信号中的特征,诊断心脏病变、心律失常等。生物医学信号处理 :DSP可用于处理各种生物医学信号,如脑电图(EEG)、心电图(ECG)、肌电图(EMG)等,以实现生理状态的监测、分析和诊断。医疗仪器控制 :DSP被用于控制医疗设备,如手术机器人、呼吸机、除颤器等,以实现精确的运动控制、信号处理和反馈控制。医疗图像处理 :在医疗图像处理中,DSP可用于图像重建、分割、配准和特征提取,帮助医生进行诊断和治疗规划。5、工业控制领域的应用:
机器视觉 :在自动化生产线上,DSP用于机器视觉系统,进行图像采集、处理和分析,用于质量控制、物体识别、位置测量等。运动控制 :DSP被广泛用于工业机器人、数控机床等运动控制系统中,实现高精度的运动控制和路径规划。信号处理和控制 :在工业自动化中,DSP用于实时信号处理和控制,例如PID控制、滤波、采样和数据处理等。智能传感器网络 :DSP可以用于处理从传感器获取的数据,如温度、压力、湿度等,以实现智能化的监测和控制。电力电子 :在电力电子领域,DSP用于控制电力转换器、逆变器、变频器等,实现电能的高效转换和控制。在数字信号处理器的应用过程中,我们可以总结到一些成功经验 ,如下:
合理选择型号 :根据实际需求选择合适的数字信号处理器型号,考虑性能、功耗、成本等因素。充分发挥性能 :充分利用数字信号处理器的处理能力,优化算法和程序设计,提高系统的性能和效率。精心设计系统架构 :设计合理的系统架构,合理分配资源,优化系统性能,提高系统的稳定性和可靠性。不断创新和优化 :持续关注新技术的发展,不断进行创新和优化,保持系统在竞争中的竞争力。相关问答
【什么是数字信号在通信中,数字信号以什么方式传输,具体可以...
[最佳回答]数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内.二进制码就是一种数字信号.二进制码受噪声的影响小,易于有数字电路进行处理,所以得...
【举出一个DSP具体应用的实例,并说明为什么要采用DSP】作业帮
[最佳回答]数字信号处理,比如视频解码啊什么的,TI的OMAP处理器就是ARM+DSP内核,DSP非常适合复杂运算处理.
信号与信息处理有什么用?
信号与信息处理是电子与通信领域的重要基础学科,有着广泛的应用。它可以用于通信、电子、生物医学、图像处理、机器感知等多个领域。信号与信息处理的具体应用...
信号系统有什么作用?
首先,信号与系统这么课是电气专业的大头,在后面的数字信号处理,滤波器设计都是十分重要的。可以说,以后的学习都用得着这门课,我个人这门课学的是大学以来最...
什么专业学数字信号处理?
数字信号处理(DigitalSignalProcessing,DSP)是面向电子信息学科的一门专业基础课,它的基本概念、基本分析方法已经渗透到了信息与通信工程、电路与系统、集...
信号分析与处理的意义?
下面是几个常见领域中信号分析与处理的意义:通信系统:在通信领域,信号分析与处理用于设计和优化无线通信系统、数字通信系统和数据传输协议。通过对信号进行...
什么叫数字频率数字信号处理里面的_作业帮
[最佳回答]如果没记错的话DSP里面的数字频率是指每一个数字信号出现时间周期的倒数,也就是1秒钟内出现数字信号的个数.如果没记错的话DSP里面的数字频率是指...
2.数字传输有哪些优点?
答:数字传输的优点:抗干扰的能力强,数字信号通过中继再生后可消除噪音积累,理论上数值信号可以传送无限远;数字通信可以通过差错控制编码来提高通信的可靠性...
找工作数字信号处理专业以后可以找什么工作?
可以从事电子工程师,设计开发一些电子、通信器件等,也可以从事软件工程师,设计开发与硬件相关的各种软件,项目主管、质量管理等可以从事电子工程师,设计开发...
matlab信号处理方面的书籍推荐?
推荐Matlab信号处理与应用金涛/第1版(2005年1月1日)/2005-1-1出版简介本书共分为8章,内容包括Matlab概述、信号与系统理论与Matlab实现、傅里叶变换与...