信 号 与 题目:信号与系统在 系 统 小 论 文
MATLAB中的应用 姓名:井满
班级:B110404
学号:B11040424
信号与系统在MATLAB中的应用
摘要: 声卡与MATLAB的声音信号频谱分析仪的设计原理与实现方法,分析软
件的性能并比较时域分析与频域分析各自的优势。频域,频率估计是通过找出幅值谱峰值点对应的频率求出;时域,频率估计是使用过零检测的方式计算出。 关键字: MATLAB 、音频信号、时域、频域
英文翻译:MATLAB、Audio、time domain、frequency domain
随着软硬件技术的发展,仪器的智能化与虚拟化已成为未来实验室及研究机构的发展方向。虚拟仪器技术的优势在于可由用户定义自己的专用仪器系统,且功能灵活,很容易构建,所以应用面极为广泛。基于计算机软硬件平台的虚拟仪器可代替传统的测量仪器,如示波器、逻辑分析仪、信号发生器、频谱分析仪等。从发展史看,电子测量仪器经历了由模拟仪器、智能仪器到虚拟仪器,由于计算机性能的飞速发展,已把传统仪器远远抛到后面,并给虚拟仪器生产厂家不断带来连锅端的技术更新速率。目前已经有许多较成熟的频谱分析软件,如SpectraLAB、RSAVu、dBFA等。
声卡是多媒体计算机最基本的配置硬件之一,价格便宜,使用方便。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,他的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令。本文将给出基于声卡与MATLAB的声音信号频谱分析仪的设计原理与实现方法,功能包括:
(1) 音频信号信号输入,从声卡输入、从WAV文件输入、从标准信号发生器输入; (2) 信号波形分析,包括幅值、频率、周期、相位的估计,以及统计量峰值、均值、均方值和方差的计算;
(3) 信号频谱分析,频率、周期的估计,图形显示幅值谱、相位谱、实频谱、虚频谱和功率谱的曲线。
对周期信号来说,可以用时域波形分析来确定信号的周期,也就是计算相邻的两个信号波峰的时间差、或过零点的时间差。这里采用过零点(ti)的时间差T(周期)。频率即为,由于能够求得多个T值(ti有多个),故采用它们的平均值作为周期的估计值。
在一个周期内,求出信号最大值与最小值的差的一半,即,同样,也会求出多个A值,但第1个A值对应的和不是在一个周期内搜索得到的,故以除第1个以外的A值的平均作为幅值的估计值。
采用过零法,即通过判断与同频零相位信号过零点时刻,计算其时间差,然后换成相应的相位差。,{x}表示x的小数部分,同样,以的平均值作为相位的估计值。 时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。由于从频域能获得的主要是频率信息,所以本节主要介绍频率(周期)的估计与频谱图的生成。
采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散Fourier变换(DFT),即
因为有大量的指数(等价于三角函数)运算,故实际中多采用快速Fourier变换(FFT)。其原理即是将重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。
对于,如果当时,取最大值,则为频率的估计值,由于采样间隔的误差,也存在误差。
从原理上可以看出,如果在标准信号中混有噪声,用上述方法仍能够精确地估计出原标准信号的频率和周期。
为了直观地表示信号的频率特性,工程上常常将Fourier变换的结果用图形的方式表示,即频谱图。
以频率f为横坐标,为纵坐标,可以得到幅值谱; 以频率f为横坐标,为纵坐标,可以得到相位谱; 以频率f为横坐标,为纵坐标,可以得到实频谱; 以频率f为横坐标,为纵坐标,可以得到虚频谱。
根据采样定理,只有频率不超过的信号才能被正确采集,即Fourier变换的结果中频率大于的部分是不正确的部分,故不在频谱图中显示。即横坐标。
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。 MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,为众多学科领域提供了一种简洁、高效的编程工具。它提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB一样方便。故本文采用MATLAB作为编程语言实现声音信号频谱分析仪,以下所讲的都是在MATLAB7.0环境中。
再往下是信号输入区,包含3种输入方式,考虑到WAV文件可能是多声道,故提供了声道选择的界面,因为每次只能对单个声道进行分析。在信号发生器中加入了混迭选项,从而可以将产生的信号与原有的信号进行混迭。界面应该具有:只有当每个单选框被选中时才允许使用对应的输入框、按钮等;采样点数输入框在声卡与WAV文件的输入方式下作为输出,在信号发生器的输入方式下作为输入。 再往下是分析区。对于WAV文件及录音的信号,有时只对其中一部分信号进行分析,故提供了分析对象范围设定的界面。另外就是时域分析与频域分析的按钮,该软件的核心代码都在这两个按钮的回调函数中。
分析结果区的下面是波形显示区,用于显示时域波形,在录音结束、打开WAV文件成功或者信号发生器生成波形时会更新显示。
采样频率Fs与采样点数N是声音信号输入时共同需要作用的参数,故将其独立出来。下面为别介绍三种输入方式的实现。
这里声卡输入是指由麦克风录音得到的声音信号的输入,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))); MATLAB提供了wavread函数,该函数能够方便的打开并读取WAV文件中的声音信息,并且同时读取所有声道。下面是“打开文件”按钮回调函数的部分代码。其它代码与声卡输入的类似。
%从WAV文件中读取的声音信息并临时存放到temp变量中
temp = wavread(get(findobj('Tag','filename'),'String')); %获得所选择的声道
channel=str2double(get(handles.channel,'String'));
%将指定声道的信息存放到handles.y中
handles.y=temp(:,channel);
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
节给出时域分析中的过零检测算法流程,故这里不给出过零检测的代码。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)));
信号系统论文
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)