当前位置:文档之家› 信号处理实验七音频频谱分析仪设计与实现

信号处理实验七音频频谱分析仪设计与实现

哈尔滨工程大学实验报告实验名称:离散时间滤波器设计班级:电子信息工程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)均值估计i Ni y Ny E ∑==1)(式中,N 为样本容量,下同。

(3) 均方值估计()2021∑==Ni iyNy E(4) 方差估计∑=-=Ni i Y E y N y D 02))((1)(图 1 频率,幅值和相位估计的流程图其中ti n表示第n个过零点,y i为第i个采样点的值,Fs为采样频率。

5、频谱分析原理时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。

由于从频域能获得的主要是频率信息,所以本节主要介绍频率(周期)的估计与频谱图的生成。

(1)DFT 与FFT对于给定的时域信号y ,可以通过Fourier 变换得到频域信息Y ,Y 可按下式计算()t t f y f y Y N i i i i ∆⎥⎦⎤⎢⎣⎡∆+∆=∑∑-101-N 0)2sin(j t)2cos(f ππ式中,N 为样本容量,Δt = 1/Fs 为采样间隔。

采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散Fourier 变换(DFT),即1,,2,1,0,)(/21-=∆=∆--∑N k t e y f k Y N ki j N i π式中,Δ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 为横坐标,arg Y(f)为纵坐标,可以得到相位谱; 以频率f 为横坐标,Re Y(f)为纵坐标,可以得到实频谱; 以频率f 为横坐标,Im Y(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文件及录音的信号,有时只对其中一部分信号进行分析,故提供了分析对象范围设定的界面。

相关主题