资源描述:
《哈尔滨工程大学数字信号处理实验八》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、实验原理1、频率(周期)检测对周期信号来说,可以用时域波形分析来确定信号的周期,也就是计算相邻的两个信号波峰的时间差或过零点的时间差。这里采用过零点(ti)的时间差T(周期)。频率即为f=1/T,由于能够求得多个T的值(ti有多个),故采用它们的平均值作为周期的估计值。2、幅值检测在一个周期内,求出信号最大值ymax与最小值ymin的差的一半,即A=(ymax-ymin)/2,同样,也会求出多个A值,但第一个A值对应的ymax和ymin不是在一个周期内搜索得到的,故以除以第一个以外的A值的平均作为幅值的估计值。3、相位检测采用过零法,即通过判断与同
2、频零相位信号过零点时刻,计算其时间差,然后换成相应的相位差。φ=2п(1-ti/T),同样,以φ的平均值作为相位的估计值。频率、幅值和相位估计的流程图见实验讲义64页图3.13。4、数字信号统计量估计(1)峰值p的估计在样本数据x中找出最大值与最小值,其差值为双峰值,双峰值的一半即为峰值。(2)均值估计(3)均方值估计(4)差估估计5、频谱分析原理时域分析只能反映信号的幅值随时间的变化情况,除单频谱分量的简单波形外,很难明确提示信号的频率组成的各频率分量的大小,而频域分析能很好的解决此问题。(1)DFT与FFT对于给定的时域信号y,可以通过Fourie
3、r变换得到频域信息Y。采样信号是一个不连续的频谱,不能算出所有点的值,所以采用离散Fourier变换DFT,但其计算效率较低,故实际中常用快速傅立叶变换。(2)频率、周期的估计对于Y(k△f),如果当k△f=f~时,Y(k△f)取最大值,则f为频率的估计值,由于采样间隔的误差,f~也存在误差,其误差最大为△f/2。周期T=1/f,从原理上可以看出,如果在标准信号中混有噪声,用上述方法仍能够精确地估计出原标准信号的频率和周期。(3)频谱图为了直观地表示信号的频率特性,常常将傅立叶变换的结果用图形的方式表示,及频谱图。以频率f为横坐标,
4、Y(f)
5、为纵坐标
6、,可以得到幅值谱;以频率f为横坐标,argY(f)为纵坐标,可以得到相位谱;以频率f为横坐标,ReY(f)为纵坐标,可以得到实频谱;以频率f为横坐标,ImY(f)为纵坐标,可以得到虚频谱。根据采样定理,只有频率不超过Fs/2的信号才能被正确采集,即傅立叶变换结果中频率大于Fs/2的部分是不正确的,故不在频谱中显示。(4)模块划分模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。模块划分时应遵循如下规则:改进软件结构提高模块独立性;模块规模应该适中;深度,宽度,扇出都
7、应适当;模块的作用域应该在控制域之内;力争降低接口的复杂程度;设计单入单出的模块口德模块;模块功能可以预测。对软件进行如讲义66页3.14图所示的模块划分。参考代码如下:(1)声卡输入:“开始录音”按钮的回调函数如下%首先获得设定的Fs值Fs=str2double(get(findobj('Tag','samplerate'),'String'));%根据设定的录音实诚进行录音,将其存入handles.y中handles.y=wavrecord(str2double(get(findobj('Tag','recordtime'),'String'))*
8、Fs,Fs,'double');handles.inputtype=1;%保存handles结构体,使得handle.y在别的函数中也能使用guidata(hObject,handles);%在波形显示区绘出波形plot(handles.time,handles.y);title('WAVE');%将所采到的点的数量输出在“采样点数中”ysize=size(handles.y)set(handles.samplenum,'String',num2str(ysize(1)));(2)WAV文件输入:“打开文件”按钮的回调函数的部分内容%从WAVw文件中读
9、取的声音信息并临时存放到temp变量中temp=wavread(get(findobj('Tag','filename'),'String'));%获得所选的声道channel=str2double(get(handles.channel,'String'));%将指定的声道的信息存放到handles.y中handles.y=temp(:,channel);handles.inputtype=2;guidata(hObject,handles);plot(handles.time,handles.y);title('WAVE');ysize=size(
10、handles.y)set(handles,samplenum,'String',num2st