基于MATLAB的声音的延迟与混响.docx
《基于MATLAB的声音的延迟与混响.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的声音的延迟与混响.docx(30页珍藏版)》请在冰豆网上搜索。
![基于MATLAB的声音的延迟与混响.docx](https://file1.bdocx.com/fileroot1/2023-8/4/c7472833-6308-4483-93f0-842c416a08ef/c7472833-6308-4483-93f0-842c416a08ef1.gif)
基于MATLAB的声音的延迟与混响
摘要
数字信号处理技术自诞生以来,有了快速的发展,主要是研究用数字或符号序列表示和处理信号,被广泛应用于各个领域。
本次设计是用MATLAB语言对语音信号进行采样分析,并设计数字滤波器对信号进行滤波,比较滤波前后信号特性的变化。
用MATLAB提供的GUI界面开发环境设计用户图形界面使布局编程简化。
ABSTRACT
Digitalsignalprocessingtechnologysinceitsbirthhadrapiddevelopment.thetechnologyistostudythesequenceofnumbersorsymbolsusedtorepresentandsignalprocessing,itiswidelyusedinvariousfield.thedesignistousethe
MATLABlanguagesamplingandanalysisofvoicesignal,anddigitaldesignforsignalfiltering,comparingbeforeandafterfilteringthesignalpropertieschange.GUIinterfaceprovidedwithMATLABdevelopmentenvironmentfordesigningthelayoutofgraphicaluserinterfacemakesprogrammingsimpler.
1绪论
数字信号处理是随着计算机技术的发展而迅速发展起来的一门新兴而古老的学科,它在新的领域如生物医学工程、声学、雷达、地震不、语音通信、数据通信、核科学等学科发挥着重要的作用,而它所采用的各种方法及众多应用已有悠久的历史;同时也是一门具有很强的理论性与实践性,且理论和技术发展都十分迅速的前沿性学科。
随着数字化时代的来临,科学技术的进步而生产发展需求的与日俱增,促进了数字信号处理学科的发展,产生了各种巧妙的信号处理算法;特别是计算机技术的飞速发展,为数字信号处理增添了巨大的生命力。
数字信号处理主要是研究用数字或符号序列表示和处理信号。
处理的目的可以是削弱信号中的多余内容,滤除混杂的噪声和干扰,或者是将信号变换为容易分析和识别的形式,便于估计和选择它的特征参数。
例如通过分析和运算,可以估计脑电图或心电图中的某种特征参数,帮助医生查找病因和分析病情,确定合理的治疗方案;又如,信号在传输时,要受到各种干扰,包括失真、衰落和混入的背景噪声,信号处理要排除这些干扰。
声音信号是一维连续信号,而计算机只能处理离散信号。
为了从离散信号还原连续信号,根据采样定理,可以确定采样频率的最小值。
wav文件是一种数字声音文件格式,本课程设计基于Matlab分析了wav声音文件频谱与声音的关系。
通过采集个人的一段声音进行频谱分析等处理,然后设计数字滤波器处理这个原始声音的wav文件,并比较滤波以后输出声音信号与原声音信号的异同。
1.1设计任务
(1)利用Windows下的录音机或其他软件,录制一段自己的语音信号,时间控制在1s左右,并对录制的信号进行采样。
(2)语音信号的频谱分析,画出采样后语音信号的时域波形和频谱图。
(3)将信号加入延时和混响,再分析其频谱,并与原始信号频谱进行比较。
(4)设计几种特殊类型的滤波器:
单回声滤波器,多重回声滤波器,无限个回声滤波器,全通结构的混响器,并画出滤波器的频域响应。
(5)用自己设计的滤波器对采集的语音信号进行滤波。
(6)分析得到信号的频谱,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化。
(7)回放语音信号。
1.2设计要求
(1)熟悉离散信号和系统的时域特性。
(2)熟悉语音信号的特点。
(3)掌握数字信号处理的基本概念,基本理论和基本方法。
(4)掌握序列快速傅里叶变换方法。
(5)学会MATLAB的使用,掌握MATLAB的程序设计方法。
(6)掌握MATLAB设计各种数字滤波器的方法和对信号进行滤波的方法
2设计的总体方案与原理
2.1设计的总体方案图
语音信号的延时和混响设计方案框图1
2.2程序流程图
语音信号的延时和混响设计程序流程图2
2.3设计的详细原理
2.3.1信号采样
(1)采样频率
采样频率是指计算机每秒钟采集多少个声音样本,采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。
只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。
(2)采样位数
即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。
声卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。
声卡的主要的作用之一是对声音信息进行录制与回放,在这个过程中采样的位数和采样的频率决定了声音采集的质量。
2.3.2混响与延时
(1)混响效果主要是用于增加音源的融合感。
自然音源的延时声阵列非常密集、复杂,所以模拟混响效果的程序也复杂多变。
常见参数有以下几种:
混响时间:
能逼真的模拟自然混响的数码混响器上都有一套复杂的程序,其上虽然有很多技术参数可调,然而对这些技术参数的调整都不会比原有的效果更为自然,尤其是混响时间。
高频滚降:
此项参数用于模拟自然混响当中,空气对高频的吸收效应,以产生较为自然的混响效果。
一般高频混降的可调范围为0.1~1.0。
此值较高时,混响效果也较接近自然混响;此值较低时,混响效果则较清澈。
扩散度:
此项参数可调整混响声阵密度的增长速度,其可调范围为0~10,其值较高时,混响效果比较丰厚、温暖;其值较低时,混响效果则较空旷、冷僻。
预延时:
自然混响声阵的建立都会延迟一段时间,预延时即为模拟次效应而设置。
声阵密度:
此项参数可调整声阵的密度,其值较高时,混响效果较为温暖,但有明显的声染色;其值较低时,混响效果较深邃,切声染色也较弱。
频率调制:
这是一项技术性的参数,因为电子混响的声阵密度比自然混响稀疏,为了使混响的声音比较平滑、连贯,需要对混响声阵列的延时时间进行调制。
此项技术可以有效的消除延时声阵列的段裂声,可以增加混响声的柔和感。
调治深度:
指上述调频电路的调治深度。
(2)延时就是将音源延迟一段时间后,再欲播放的效果处理。
依其延迟时间的不同,可分别产生合唱、镶边、回音等效果。
当延迟时间在3~35ms之间时人耳感觉不到滞后音的存在,并且他与原音源叠加后,会因其相位干涉而产生"梳状滤波"效应,这就是镶边效果。
如果延迟时间在50ms以上时,其延迟音就清晰可辨,此时的处理效果才是回音。
回音处理一般都是用于产生简单的混响效果。
延时、合唱、镶边、回音等效果的可调参数都差不多,具体有以下几项:
*延时时间(Dly),即主延时电路的延时时间调整。
*反馈增益(FBGain),即延时反馈的增益控制。
*反馈高频比(HiRatio),即反馈回路上的高频衰减控制。
*调制频率(Freq),指主延时的调频周期。
*调制深度(Depth),指上述调频电路的调制深度。
*高频增益(HF),指高频均衡控制。
*预延时(IniDly),指主延时电路预延时时间调整。
*均衡频率(EQF),这里的频率均衡用于音色调整,此为均衡的中点频率选择。
由于延时产生的效果都比较复杂多变,如果不是效果处理专家,建议使用设备提供的预置参数,因为这些预置参数给出的处理效果一般都比较好。
2.3.3离散傅立叶变换
在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅立叶变换和逆变换。
下面介绍这些函数。
函数FFT用于序列快速傅立叶变换。
函数的一种调用格式为 y=fft(x)
其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT。
且和x相同长度。
若x为一矩阵,则y是对矩阵的每一列向量进行FFT。
如果x长度是2的幂次方,函数fft执行高速基-2FFT算法;否则fft执行一种混合基的离散傅立叶变换算法,计算速度较慢。
函数FFT的另一种调用格式为 y=fft(x,N)
式中,x,y意义同前,N为正整数。
函数执行N点的FFT。
若x为向量且长度小于N,则函数将x补零至长度N。
若向量x的长度大于N,则函数截短x使之长度为N。
若x为矩阵,按相同方法对x进行处理。
经函数fft求得的序列y一般是复序列,通常要求其幅值和相位。
MATLAB提供求复数的幅值和相位函数:
abs,angle,这些函数一般和FFT同时使用。
函数abs(x)用于计算复向量x的幅值,函数angle(x)用于计算复向量的相角,介于和之间,以弧度表示。
函数unwrap(p)用于展开弧度相位角p,当相位角绝对变化超过时,函数把它扩展至。
用MATLAB工具箱函数fft进行频谱分析时需注意:
(1) 函数fft返回值y的数据结构对称性。
(2)频率计算。
(3) 作FFT分析时,幅值大小与FFT选择点数有关,但不影响分析结果。
2.3.4滤波器设计
本次设计用IIR滤波器对信号进行滤波,函数名为filter
函数filter的调用格式为 y=filter(b,a,x)
该格式采用数字滤波器对数据进行滤波,既可以用于IIR滤波器,也可以用于FIR滤波器。
其中向量b和a分别表示系统函数的分子、分母多项式的系数,若a=1,此时表示FIR滤波器,否则就是IIR滤波器。
该函数是利用给出的向量b和a,对x中的数据进行滤波,结果放入向量y。
(1)单回声滤波器
回音可以由简单的延时单元产生。
直达声和在R抽样周期后出现的一种单个回音,可以用FIR滤波器产生,微分方程为:
y[n]=x[n]+αx[n-R]|α|<1
传输函数为:
H(z)=1+αz-R
传递函数的幅频响应形状象梳子,这种滤波器又叫梳状滤波器。
(2)多重回声滤波器
为了产生以间隔R个抽样周期分开的具有指数衰减振幅的多重回声,可用一个以下形式传输函数的FIR滤波器:
无限个振幅以指数衰减间隔为R个抽样周期的多重回声可用以下形式传输函数的IIR滤波器生成:
IIR多重回声滤波器的基本频率FR=Fs/R,通常锁定在伴音设备的基频上,比如基鼓拍子。
(3)无限个回声滤波器的系统函数:
<1
(4)全通结构的混响器的系统函数:
全通滤波器的传递函数公式为
H(Z)=y(Z)/X(Z)=(-K+Z^(-m))/(1-K*Z^(-m))
其中m为回声延时取样,k为反馈系数。
用直接1型表示这个传递函数则为:
y(n)=k*x(n)+x(n-m)+k*y(n-m)
可见其实际上是一个简单的IIR滤波器,时间n的输出有时间n的输入和m点之前的输入与输出计算而得。
由于这个IIR滤波器的频率响应为水平直线,所以被称为全通滤波器。
3程序设计的步骤和过程
3.1原始语音信号时域波形和频谱
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav');%用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。
[50000150000]表示读取从50000点到150000点的值(若只有一个N的点则表示读取前N点的采样值)。
y=y(:
1);%只取单信道
sound(y,fs,bits);%播放原始信号
Y=fft(y);%对原始信号取傅里叶变换
subplot(2,2,1:
2);plot(y);title('原始信号时域波形');
subplot(2,2,3);plot(abs(Y));title('原始信号幅频');
subplot(2,2,4);plot(angle(Y));title('原始信号相频');
3.2采样后语音信号的时域波形和频谱
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);%只取原信号的一部分,即时间区间[50000150000]
y=y(:
1);
Y=fft(y,6001);%抽取6001点
subplot(2,2,1:
2);plot(y);title('采样信号时域波形');
subplot(2,2,3);plot(abs(Y));title('采样信号幅频');
subplot(2,2,4);plot(angle(Y));title('采样信号相频');
sound(y,fs,bits);%回放采样信号
3.3对采样后的信号延时
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];%延迟3000
Z=fft(z,6001);
subplot(2,2,1:
2);plot(z);title('延时后时域波形');
subplot(2,2,3);plot(abs(Z));title('延时后幅频');
subplot(2,2,4);plot(angle(Z));title('延时后相频');
sound(y,fs,bits);%回放延迟信号
3.4对采样后的信号混响
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];
y=[y;zeros(3000,1)];%补3000
y1=y+z;%将原始信号与延迟信号相加,产生混响信号
Y1=fft(y1,6001);
subplot(2,2,1:
2);plot(y1);title('混响的时域波形');
subplot(2,2,3);plot(abs(Y1));title('混响的幅频');
subplot(2,2,4);plot(angle(Y1));title('混响的相频');
sound(y,fs,bits);%回放混响信号
3.5单回声滤波器程序设计
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];
y=[y;zeros(3000,1)];
a=0.5;
R=5000;%滤波器阶数设置,其值越高,回声越明显
Bz1=[1,zeros(1,R-1),a];%单回声滤波器系统函数分子
Az1=
(1);%单回声滤波器系统函数分母
y2=filter(Bz1,Az1,y);%单回声滤波器系统函数
Y2=fft(y2,6001);
[h,w]=freqz(Bz1,Az1);%求设计的滤波器频谱
subplot(3,2,1);plot(abs(h));
title('单回声滤波器幅频响应');
subplot(3,2,2);plot(angle(h));
title('单回声滤波器相频响应');
subplot(3,2,3:
4);plot(y2);title('单回声滤波器时域图');
subplot(3,2,5);plot(abs(Y2));title('单回声滤波器幅频');
subplot(3,2,6);plot(angle(Y2));title('单回声滤波器相频');
sound(y2,fs,bits);
3.6多重回声滤波器程序设计
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];
y=[y;zeros(3000,1)];
a=0.5;
N=5;
R=9000;%滤波器阶数设置,其值越高,回声越明显
Bz1=[1,zeros(1,N*R-1),-a^N];%多重回声滤波器系统函数分子
Az1=[1,zeros(1,R-1),-a];%多重回声滤波器系统函数分母
y2=filter(Bz1,Az1,y);
Y2=fft(y2,6001);
[h,w]=freqz(Bz1,Az1);
subplot(3,2,1);plot(abs(h));
title('多重回声滤波器幅频响应');
subplot(3,2,2);plot(angle(h));
title('多重回声滤波器相频响应');
subplot(3,2,3:
4);plot(y2);title('多重回声滤波器时域图');
subplot(3,2,5);plot(abs(Y2));title('多重回声滤波器幅频');
subplot(3,2,6);plot(angle(Y2));title('多重回声滤波器相频');
sound(y2,fs,bits);
3.7无限个回声滤波器程序设计
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];
y=[y;zeros(3000,1)];
a=0.5;
R=5000;%滤波器阶数设置,其值越高,回声越明显
Bz=[0,zeros(1,R-1),1];%无限个回声滤波器系统函数分子
Az=[1,zeros(1,R-1),-a];%无限个回声滤波器系统函数分母
y2=filter(Bz,Az,y);
Y2=fft(y2,6001);
[h,w]=freqz(Bz,Az);
subplot(3,2,1);plot(abs(h));
title('无限个回声滤波器幅频响应');
subplot(3,2,2);plot(angle(h));
title('无限个回声滤波器相频响应');
subplot(3,2,3:
4);plot(y2);title('无限个回声滤波器时域图');
subplot(3,2,5);plot(abs(Y2));title('无限个回声滤波器信号幅频');
subplot(3,2,6);plot(angle(Y2));title('无限个回声滤波器信号相频');
sound(y2,fs,bits);
3.8全通结构滤波器程序设计
[y,fs,bits]=wavread('C:
\Users\Administrator\Desktop\音频信号.wav',[50000150000]);
y=y(:
1);
z=[zeros(3000,1);y];
y=[y;zeros(3000,1)];
a=0.5;
R=5000;%滤波器阶数设置,其值越高,回声越明显
Bz1=[a,zeros(1,R-1),1];%全通滤波器系统函数分子
Az1=[1,zeros(1,R-1),a];%全通滤波器系统函数分母
[h,w]=freqz(Bz1,Az1);
yy2=filter(Bz1,Az1,y);
YY2=fft(yy2,6001);
subplot(3,2,1);plot(abs(h));
title('全通滤波器幅频响应');
subplot(3,2,2);plot(angle(h));
title('全通滤波器相频响应');
subplot(3,2,3:
4);plot(yy2);title('全通结构时域图');
subplot(3,2,5);plot(abs(YY2));title('全通结构幅频');
subplot(3,2,6);plot(angle(YY2));title('全通结构相频');
sound(yy2,fs,bits);
4图形用户界面设计
图形用户界面GUI(GraphicsUserInterface)是由各种图形对象,如图形窗口、图轴、菜单、按钮、文本框等构建的用户界面,是人机交流信息的工具和方法。
GUI设计即可以基本的MATLAB程序设计为主,也可以鼠标为主利用GUIDE工具进行设计。
GUIDE(GraphicsUserInterfaceDesignEnviron2ment)是一个专用于GUI程序设计的快速开发环境,使用者通过鼠标就能迅速地产生各种GUI控件,并随心所欲地改变它们的外形、大小及颜色等,从而帮助用户方便地设计出各种符合要求的图形
用户界面。
调用GUIDE的方法有2种,在MATLAB命令窗口中输入guide命令,或在MATLAB主菜单中点击File→New→GUI即可打开一个可编辑的新窗口。
在GUIDE设计环境中,需要用到的工具有属性编辑器、控件布置编辑器、菜单编辑器、对象浏览器、网格标尺设置编辑器以及GUI应用属性设置编辑器等。
GUI设计面板是GUI设计工具应用的平台,面板上部提供了菜单和常用工具按钮,左边提供了多种GUI控件,如按钮、单选按钮、复选框、文本框等。
进行GUI设计时,首先单击GUI面板左边所需的控件,然后在右边的图形界面编辑区中再次单击某一恰当的位置,这时将在该位置上为图形界面添加一相应的控件,接下来,通过属性编辑器和对齐编辑器对各控件设置相关属性和进行界面布置,以完善界面功能。
5结果分析与体会
GUI设计界面
运行结果:
对信号采样后,信号时域波形出现了离散化的分布,不像原始图像那样密集分布,频谱图也是同样的变换,幅度和频率都是根据采样区间变化的
从时域图出延时是让原来的波形向右移动3000,频域的幅度发生了变化。
混响:
在时域图看前面几乎没变化,后面的幅度有一定变化。
在频谱图幅度变化很大,中间的上下相互抵消,两边的跳动很大。
时域上形状大致相同,幅度有微小变化。
频谱上也是滤波前后两边跳动变换较大,幅度变化较大。
时域上滤波前的幅度比滤波后的数值大,形状上滤波后是连续的,滤波前是间断的
频谱上变化两边上下跳的动变化,中间变化抵消
时域上波形变得稀疏了,幅度相对变化较大。
频谱上变化两边上下跳的动变化,中间变化抵消
全通结构时域大致一样,滤波前比滤波后幅度有变化6000以后上下跳动抵消
频域上变化的不为明显,幅度发生了变化。
6设计心得体会
课程设计是培养我们综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程,通过课程设计我们能够比较系统的了解理论知识,把理论和实践相结合,并且用到生活当中。
在做设计的过程中总会出现各种问题,在这种情况下我们都会努力寻求最佳路径解决问题,无形间提高了我们的动手,动脑能力,并且同学之间还能相互探讨问题,研究解决方案,增进大家的团队意识。
此次课程设计综合了数字信号处理的理论知识和实践经验,经过这段时间查阅的相关资料并结合以前学过的数字信号处理课程和实验,我如期完成了设计任务要求,并加深了对知识的理解,提高了自己的实践动手能力。
拿到课程设计任务的时候,不知道从哪儿入