您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 信号处理实验七音频频谱分析仪设计与实现
哈尔滨工程大学实验报告实验名称:离散时间滤波器设计班级:电子信息工程4班学号:姓名:实验时间:2016年10月31日18:30成绩:________________________________指导教师:栾晓明实验室名称:数字信号处理实验室哈尔滨工程大学实验室与资产管理处制实验七音频频谱分析仪设计与实现一、实验原理MATLAB是一个数据分析和处理功能十分强大的工程实用软件,其数据采集工具箱为实现数据的输入和输出提供了十分方便的函数命令。本实验要求基于声卡和MTLAB实现音频信号频谱分析仪的设计原理与实现,功能包括:(1)音频信号输入,从声卡输入、从WAV文件输入、从标准信号发生器输入;(2)信号波形分析,包括幅值、频率、周期、相位的估计、以及统计量峰值、均值、均方值和方差的计算。(3)信号频谱分析,频率、周期的统计,同行显示幅值谱、相位谱、实频谱、虚频谱和功率谱的曲线。1、频率(周期)检测对周期信号来说,可以用时域波形分析来确定信号的周期,也就是计算相邻的两个信号波峰的时间差、或过零点的时间差。这里采用过零点(ti)的时间差T(周期)。频率即为f=1/T,由于能够求得多个T值(ti有多个),故采用它们的平均值作为周期的估计值。2、幅值检测在一个周期内,求出信号最大值ymax与最小值ymin的差的一半,即A=(ymax-ymin)/2,同样,也会求出多个A值,但第1个A值对应的ymax和ymin不是在一个周期内搜索得到的,故以除第1个以外的A值的平均作为幅值的估计值。3、相位检测采用过零法,即通过判断与同频零相位信号过零点时刻,计算其时间差,然后换成相应的相位差。φ=2π(1-ti/T),{x}表示x的小数部分,同样,以φ的平均值作为相位的估计值。频率、幅值和相位估计的流程如图1所示。4、数字信号统计量估计(1)峰值P的估计在样本数据x中找出最大值与最小值,其差值为双峰值,双峰值的一半即为峰值。P=0.5[max(yi)-min(yi)](2)均值估计iNiyNyE01)(式中,N为样本容量,下同。(3)均方值估计2021NiiyNyE(4)方差估计NiiYEyNyD02))((1)(图1频率,幅值和相位估计的流程图其中tin表示第n个过零点,yi为第i个采样点的值,Fs为采样频率。开始n=1,ymax=ymin=0i=3Yyi=10且yi=20且yi=0且yi+10NNymaxyiYyiYymax=yiNtin=i/FsNYtin=[i-yi/(yi-yi-1)]/FsAn=(ymax-ymin)/2ymax=ymin=0iN-1?i++NYT为(ti-ti-1)的平均值,i=1.2,…f=1/Tn++ymin=yiA为Ai的平均值,i=2,3,…yminyiφ为2π(1-{ti/Ti})的平均值结束5、频谱分析原理时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。由于从频域能获得的主要是频率信息,所以本节主要介绍频率(周期)的估计与频谱图的生成。(1)DFT与FFT对于给定的时域信号y,可以通过Fourier变换得到频域信息Y,Y可按下式计算ttfyfyYNiiii101-N0)2sin(jt)2cos(f式中,N为样本容量,Δt=1/Fs为采样间隔。采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散Fourier变换(DFT),即1,,2,1,0,)(/210NkteyfkYNkijNi式中,Δf=Fs/N。但上式的计算效率很低,因为有大量的指数(等价于三角函数)运算,故实际中多采用快速Fourier变换(FFT)。其原理即是将重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。由于三角函数计算的重复量相当大,故FFT能极大地提高运算效率。(2)频率、周期的估计对于Y(kΔf),如果当kΔf=f时,Y(kΔf)取最大值,则f为频率的估计值,由于采样间隔的误差,f也存在误差,其误差最大为Δf/2,周期T=1/f。从原理上可以看出,如果在标准信号中混有噪声,用上述方法仍能够精确地估计出原标准信号的频率和周期。(3)频谱图为了直观地表示信号的频率特性,工程上常常将Fourier变换的结果用图形的方式表示,即频谱图。以频率f为横坐标,|Y(f)|为纵坐标,可以得到幅值谱;以频率f为横坐标,argY(f)为纵坐标,可以得到相位谱;以频率f为横坐标,ReY(f)为纵坐标,可以得到实频谱;以频率f为横坐标,ImY(f)为纵坐标,可以得到虚频谱。根据采样定理,只有频率不超过Fs/2的信号才能被正确采集,即Fourier变换的结果中频率大于Fs/2的部分是不正确的部分,故不在频谱图中显示。即横坐标f∈[0,Fs/2](4)频谱图模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。在模块划分时应遵循如下规则:1.改进软件结构提高模块独立性;2.模块规模应该适中;3.深度、宽度、扇出和扇入都应适当;4.模块的作用域应该在控制域之内;5.力争降低模块接口的复杂程度;6.设计单入口单出口的模块;7.模块功能应该可以预测。本着上述的启发式规则,对软件进行如图2所示的模块划分。图2频谱分析仪的模块划分二、界面设计MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,为众多学科领域提供了一种简洁、高效的编程工具。它提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB一样方便。故本文采用MATLAB作为编程语言实现声音信号频谱分析仪,以下所讲的都是在MATLAB2014a环境中。为了实现预期的功能,设计如图3所示的界面。图3声音信号频谱分析仪最上面的部分为标题区,用于显示软件标题等信息,不具人机交互功能。标题区下面是信号输入区,包含3种输入方式:声卡输入,WAV文件输入,信号发生器输入。考虑到WAV文件可能是多声道,故提供了声道选择的界面,因为每次只能对单个声道进行分析。在信号发生器中加入了混迭选项,从而可以将产生的信号与原有的信号进行混迭。输入方式界面应该具有:只有当每个单选框被选中时才允许使用对应的输入框、按钮等;其中采样点数输入框在声卡与WAV文件的输入方式下作为输出,在信号发生器的输入方式下作为输入。输入方式单选框程序代码为:(1)声卡单选框程序代码set(findobj('Tag','recordtime'),'enable','on');h=findobj('Tag','filename');set(h,'enable','off');h=findobj('Tag','freq');set(h,'enable','off');h=findobj('Tag','amp');set(h,'enable','off');h=findobj('Tag','phase');set(h,'enable','off');set(handles.channel,'enable','off');set(handles.fileopen,'enable','off');set(handles.gensig,'enable','off');set(handles.wavetype,'enable','off');set(handles.add,'enable','off');set(handles.startrecord,'enable','on');(2)WAV文件单选框程序代码h=findobj('Tag','filename');set(h,'enable','on');h=findobj('Tag','freq');set(h,'enable','off');h=findobj('Tag','amp');set(h,'enable','off');h=findobj('Tag','phase');set(h,'enable','off');set(findobj('Tag','recordtime'),'enable','off');set(handles.channel,'enable','on');set(handles.fileopen,'enable','on');set(handles.gensig,'enable','off');set(handles.wavetype,'enable','off');set(handles.add,'enable','off');set(handles.startrecord,'enable','off');(3)信号发生器单选框程序代码h=findobj('Tag','filename');set(h,'enable','off');h=findobj('Tag','freq');set(h,'enable','on');h=findobj('Tag','amp');set(h,'enable','on');h=findobj('Tag','phase');set(h,'enable','on');set(findobj('Tag','recordtime'),'enable','off');set(handles.channel,'enable','off');set(handles.fileopen,'enable','off');set(handles.gensig,'enable','on');set(handles.wavetype,'enable','on');set(handles.add,'enable','on');set(handles.startrecord,'enable','off');再往下是分析区,对于WAV文件及录音的信号,有时只对其中一部分信号进行分析,故提供了分析对象范围设定的界面。另外就是时域分析与频域分析的按钮,该软件的核心代码都在这两个按钮的回调函数中。分析区下面是分析结果区,用于显示波形基本参数与统计量的计算结果。分析结果区的下面是波形显示区,用于显示时域波形,在录音结束、打开WAV文件成功或者信号发生器生成波形时会更新显示。右边为频谱图显示区,用于显示各种频谱的谱线,在点击频域分析后会更新显示。1、输入模块的实现采样频率Fs与采样点数N是声音信号输入时共同需要作用的参数,故将其独立出来。下面分别介绍三种输入方式的实现。(1)声卡输入这里声卡输入是指由麦克风录音得到的声音信号的输入,MATLAB提供了wavrecord函数,该函数能够实现读取麦克风录音信号。以下是“开始录音”按钮的回调函数的程序代码。Fs=str2double(get(findobj('Tag','samplerate'),'String'));handles.y=wavrecord(str2double(get(findobj('Tag','recordtime'),'String'))*Fs,Fs,'int16');handles.inputtype=1;guidata(hObject,handles);plot(handles.time,handles.y);title('WAVE');ysize=size(handles.y)set(handles.samplenum,'String',num2str(ysize(1)));(2)WAV文件输入MATLAB提供了wavread函数,该函数能够方便的打开并读取WAV文件中的声音信息,并且同时读取所有声道。以下是“打开文件”按钮回调函数的程序代码。te
本文标题:信号处理实验七音频频谱分析仪设计与实现
链接地址:https://www.777doc.com/doc-2108766 .html