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

基于MATLAB的声音信号频谱分析仪设计 - 收藏 - 图文(3)

来源:网络收集 时间:2019-05-27 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

temp = wavread(get(findobj('Tag','filename'),'String')); %获得所选择的声道

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

3.2.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

11

3.3分析模块

由于MATLAB的绘图功能很强大,所以图形显示模块不用单独开发,可直接调用plot、axis等函数实现图形显示功能,故图形显示也将在分析模块中给出。 3.3.1 时域分析

2.1.2节给出时域分析中的过零检测算法流程,故这里不给出过零检测的代码。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);

3.3.2 频域分析

频域分析需要作Fourier变换,MATLAB提供了fft函数,能够方便地实现快速Fourier变换算法。以下代码省去了从界面中获得from、to、Fs的部分,也省去了绘图后设置横、纵坐标轴的名称的部分。

12

%首先提取出待分析的样本,将其存入sample中 sample=handles.y(from:to);

%生成离散化的频率点,以采样频率作为离散化的间隔 f=linspace(0,Fs/2,(to-from+1)/2);

%对样本作快速Fourier变换,变换结果存入Y中 Y=fft(sample,to-from+1);

[C,I]=max(abs(Y)); %获得幅值最大的点及其所对应的下标值I %则f(I)为最大的幅值所对应的频率,即信号频率的估计值 set(handles.foutt,'String',1/f(I));

%计算并输出周期的估计值

set(handles.foutfreq,'String',f(I)); %输出频率的估计值 Y=Y(1:(to-from+1)/2);

%为与f对应,只取Y的前半部分

plot(handles.plot1,f,2*sqrt(Y.*conj(Y))); %绘制幅值谱曲线 plot(handles.plot2,f,angle(Y)); plot(handles.plot3,f,real(Y));

%绘制相位谱曲线 %绘制实频谱曲线

plot(handles.plot4,f,imag(Y)); %绘制虚频谱曲线 plot(handles.plot5,f,abs(Y).^2); %绘制功率谱曲

4.运行实例与误差分析

为了分析软件的性能并比较时域分析与频域分析各自的优势,本章给出了两种分析方法的频率估计的比较,分析软件的在时域和频域的计算精度问题。 4.1频率估计

4.1.1 标准正弦信号的频率估计

用信号发生器生成标准正弦信号,然后分别进行时域分析与频域分析,得到的结果如图 4所示。从图中可以看出,时域分析的结果为f = 400.3702Hz,频域分析的结果为f = 417.959Hz,而标准信号的频率为400Hz,从而对于标准信号时域分析的精度远高于频域分析的精度。

13

图 4 标准正弦信号的频率估计

4.1.2 带噪声的正弦信号的频率估计

先成生幅值100的标准正弦信号,再将幅值50的白噪声信号与其混迭,对最终得到的信号进行时域分析与频域分析,结果如图 5所示,可以看出,时域分析的结果为f = 158.9498Hz,频域分析的结果为f = 200.391Hz,而标准信号的频率为200Hz,从而对于带噪声的正弦信号频域分析的精度远高于时域分析的精度。

14

图 5 带噪声的正弦信号的频率估计

4.2 结果分析与结论

在时域,频率估计是使用过零检测的方式计算出,从而对于带噪声的信号既容易造成“误判”,也容易造成“漏判”,且噪声信号越明显,“误判”与“漏判”的可能性越大。但在没有噪声或噪声很小时,时域分析对每个周期长度的检测是没有累积误差的,故随着样本容量的增大,估计的精度大大提高。

在频域,频率估计是通过找出幅值谱峰值点对应的频率求出。故不会有时域分析的问题。但频率离散化的误差及栅栏效应却是不可避免地带来误差,仅频率离散化的误差就大于Fs/2。

由实验结果及以上的分析可以得出结论:在作频率估计时,如果信号的噪声很小,采用时域分析的方法较好;如果信号的噪声较大,采用频域分析的方法较好。

15

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于MATLAB的声音信号频谱分析仪设计 - 收藏 - 图文(3)在线全文阅读。

基于MATLAB的声音信号频谱分析仪设计 - 收藏 - 图文(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/642911.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: