第一范文网 - 专业文章范例文档资料分享平台

数字信号处理实验报告8

来源:用户分享 时间:2025/6/26 6:31:55 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

以频率f为横坐标,为纵坐标,可以得到虚频谱。 根据采样定理,只有频率不超过的信号才能被正确采集,即Fourier变换的结果中频率大于的部分是不正确的部分,故不在频谱图中显示。即横坐标

6.模块划分

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。

在模块划分时应遵循如下规则:改进软件结构提高模块独立性;模块规模应该适中;深度、宽度、扇出和扇入都应适当;模块的作用域应该在控制域之内;力争降低模块接口的复杂程度;设计单入口单出口的模块;模块功能应该可以预测。

本着上述的启发式规则,对软件进行如图 2所示的模块划分。

图 2频谱分析仪的模块划分

7.界面设计

为了实现预期的功能,根据所给参考界面,设计出如图 3所示的界面。 最上面的部分为标题区,用于显示软件标题等信息,不具人机交互功能。 再往下是信号输入区,包含3种输入方式,考虑到WAV文件可能是多声道,故提供了声道选择的界面,因为每次只能对单个声道进行分析。在信号发生器中加入了混迭选项,从而可以将产生的信号与原有的信号进行混迭。界面应该具有:只有当每个单选框被选中时才允许使用对应的输入框、按钮等;采样点数输入框在声卡与WAV文件的输入方式下作为输出,在信号发生器的输入方式下作为输入。

再往下是分析区。对于WAV文件及录音的信号,有时只对其中一部分信号进行分析,故提供了分析对象范围设定的界面。另外就是时域分析与频域分析的按钮,该软件的核心代码都在这两个按钮的回调函数中。

图3 声音信号频谱分析仪

分析区下面是分析结果区,用于显示波形基本参数与统计量的计算结果。 分析结果区的下面是波形显示区,用于显示时域波形,在录音结束、打开WAV文件成功或者信号发生器生成波形时会更新显示。

右边为频谱图显示区,用于显示各种频谱的谱线,在点击频域分析后会更新显示。

8.输入模块的实现

采样频率Fs与采样点数N是声音信号输入时共同需要作用的参数,故将其独立出来。下面为别介绍三种输入方式的实现。 (1) 声卡输入

这里声卡输入是指由麦克风录音得到的声音信号的输入,MATLAB提供了wavrecord函数,该函数能够实现读取麦克风录音信号。以下是“开始录音”按钮的回调函数内容。

%首先获得设定的Fs值

Fs=str2double(get(findobj('Tag','samplerate'),'String')); %根据设定的录音时长进行录音,将其存入handles.y中

handles.y=wavrecord(str2double(get(handles.recordtime,'String'))*Fs, Fs,'int16'); %保存handles结构体,使得handles.y在别的函数中也能使用 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文件中的声音信息,并且同时读取所有声道。下面是“打开文件”按钮回调函数的部分代码。其它代码与声卡输入的类似。

%从WAV文件中读取的声音信息并临时存放到temp变量中 temp = wavread(get(findobj('Tag','filename'),'String')); %获得所选择的声道

channel=str2double(get(handles.channel,'String')); %将指定声道的信息存放到handles.y中 handles.y=temp(:,channel); (3) 信号发生器

MATLAB有产生标准信号的函数,如sawtooth能够产生三角波或钜齿波,首先利用get函数获得波形soundtype,频率frequency,幅值amp和相位phase,然后是以下代码。

switch soundtype

case 1 %标准正弦波

y=amp*sin(2*pi*x*frequency+phase); case 2 %方波

y=amp*sign(sin(2*pi*x*frequency+phase)); case 3 %三角波

y=amp*sawtooth(2*pi*x*frequency+phase,0.5); case 4 %钜齿波

y=amp*sawtooth(2*pi*x*frequency+phase); case 5 %白噪声

y=amp*(2*rand(size(x))-1); otherwise

errordlg('Illegal wave type','Choose errer'); end

if get(handles.add,'Value')==0.0

handles.y=y; %若没有勾选上“混迭”,则将生成的波形赋给handles.y else %否则将生成的波形与原有波形叠加 handles.y=handles.y+y; end

(4) 时域分析

MATLAB提供了mean,std函数,能够方便地计算均值、标准差。下面是过零检测之后的代码,其中T为过零检测得到的周期(向量),amp为过零检测得到的幅值(向量),n为过零点数。

freq=Fs/mean(T); %计算频率

set(handles.outt,'String',1/freq); %输出周期估计值

set(handles.outfreq,'String',num2str(freq)); %输出频繁估计值 %计算并输出幅值,以幅值均值作为其估计

set(handles.outamp,'String',num2str(mean(amp(2:n-1))));

%将待分析信号的过零点与标准信号的过零点相比较,从而得出相位 phase=2*pi*(1-(ti(1:n-1)-1)./T+floor((ti(1:n-1)-1)./T)); set(handles.outphase,'String',num2str(mean(phase))); %最大值与最小值的一半即为峰值

set(handles.outpeak,'String',(max(handles.y(from:to))-min(handles.y(from:to)))/2); %from,to即是界面中的“从第from点到第to点”

%计算并输出均值

set(handles.outmean,'String',mean(handles.y(from:to))); %计算并输出均方值

set(handles.outmeansquare,'String',mean(handles.y(from:to).^2)); %计算半输出方差

set(handles.outs,'String',std(handles.y(from:to))^2); (5) 频域分析

搜索更多关于: 数字信号处理实验报告8 的文档
数字信号处理实验报告8.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c1cgi07itrj00kc51ztsg_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top