当前位置:文档之家› matlab gui 频谱分析仪

matlab gui 频谱分析仪

频谱分析仪实验报告一:频谱分析仪的功能:(1) 音频信号信号输入。

输入的途径包括从声卡、从WAV文件输入、从信号发生器输入;(2) 信号波形分析。

包括幅值、频率、周期、相位的估计,并计算统计量的峰值、均值、均方值和方差等信息;GUI界面见附页(3) 信号频谱分析。

频率、周期的估计,图形显示幅值谱、相位谱和功率谱等信息的曲线。

二:实验原理1. 时域抽样时域抽样定理给出了连续信号抽样过程中信号不失真的约束条件:对于基带信号,信号抽样频率大于等于2倍的信号最高频率。

时域抽样是把连续信号变成适于数字系统处理的离散信号。

2.快速傅里叶变换(FFT)对有限长序列可以利用离散傅立叶变换(DFT)进行分析。

DFT不但可以很好的反映序列的频谱特性,而且易于用快速算法(FFT)在计算机上进行分析。

MATLAB为计算数据的离散快速傅立叶变换,提供了一系列丰富的数学函数,本设计用的为FFT3.波形分析原理(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的小数部分,同样,以φ的平均值作为相位的估计值。

(4)峰值P的估计在样本数据x中找出最大值与最小值,其差值为双峰值,双峰值的一半即为峰值。

P=[max(yi)-min(yi)]/2(5)均值,均方值,方差,均有计算所得4,频谱图为了直观地表示信号的频率特性,工程上常常将Fourier变换的结果用图形的方式表示,即频谱图三:程序设计1、三种信号的输入方式(1)声卡的输入这里声卡输入是指由麦克风录音得到的声音信号的输入,MATLAB提供了wavrecord函数,该函数能够实现读取麦克风录音信号。

以下是“开始录音”按钮的回调函数内容。

获得FS的值Fs=str2double(get(findobj('Tag','samplerate'),'String'));根据设定的时间长度进行录音,保存在handles中,保存为double型handles.y=wavrecord(str2double(get(findobj('Tag','recordtime'),'String'))*Fs, Fs,'double');handles.inputtype=1;保存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 soundtypecase 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);otherwiseerrordlg('Illegal wave type','Choose errer');endif get(handles.add,'Value')==0.0handles.y=y; 没有混叠else有混叠handles.y=handles.y+y;end2、时域分析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.频域分析频域分析需要作Fourier变换,MATLAB提供了fft函数,能够方便地实现快速Fourier变换算法。

以下代码省去了从界面中获得from、to、Fs的部分,也省去了绘图后设置横、纵坐标轴的名称的部分。

%首先提取出待分析的样本,将其存入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); %绘制功率谱曲线四、软件运行及结果分析1.标准正弦信号的频率估计用信号发生器生成标准正弦信号,然后分别进行时域分析与频域分析,得到的结果如图 4所示。

从图中可以看出,时域分析的结果为f = 400Hz,频域分析的结果为f = 400.37Hz,而标准信号的频率为400Hz,从而对于标准信号时域分析的精度远高于频域分析的精度。

2.非标准正弦信号的频率估计先生生幅值600的标准正弦信号,再将幅值300的白噪声信号与其混迭,对最终得到的信号进行时域分析与频域分析,结果如图 5所示,可以看出,时域分析的结果为f = 540.51Hz,频域分析的结果为f = 626.94Hz,而标准信号的频率为600Hz,从而对于带噪声的正弦信号频域分析的精度远高于时域分析的精度.五、小结通过零检测的方式对于带噪声的信号既容易造成“误判”,也容易造成“漏判”,且噪声信号越明显,“误判”与“漏判”的可能性越大。

但在没有噪声或噪声很小时,时域分析对每个周期长度的检测是没有累积误差的,故随着样本容量的增大,估计的精度大大提高。

但把信号进行傅里叶变换后,频率估计是通过找出幅值谱峰值点对应的频率求出。

不存在零点误判的问题。

但频率离散化的误差及栅栏效应却是不可避免地带来误差。

因此,在作频率估计时,如果没有干扰信号或干扰信号很小时,采用时域分析方法比较好;如果干扰信号大,采用频域分析方法比较好。

附页,GUI界面。

相关主题