基于MATLAB的声音信号频谱分析仪设计 收藏
matlab 信号 频谱分析实验报告

matlab 信号频谱分析实验报告实验背景:信号频谱分析是一种通过将信号在频域上进行分解和分析的方法,用于研究信号的频率成分和频率特性。
Matlab是一种常用的科学计算软件,拥有强大的信号处理和频谱分析功能。
本实验旨在通过使用Matlab对信号进行频谱分析,探索信号的频率特性。
实验目的:1. 了解信号频谱分析的基本概念和方法;2. 掌握Matlab中信号频谱分析的基本操作;3. 分析不同类型信号的频谱特性。
实验步骤:1. 生成信号:首先,我们需要生成一个待分析的信号。
可以选择不同类型的信号,如正弦信号、方波信号或噪声信号。
在Matlab中,可以使用相关函数生成这些信号。
2. 绘制时域图:使用Matlab绘制生成的信号的时域图。
时域图展示了信号在时间上的变化情况,可以帮助我们对信号有一个直观的了解。
3. 进行频谱分析:使用Matlab中的傅里叶变换函数对信号进行频谱分析。
傅里叶变换可以将信号从时域转换到频域,得到信号的频谱图。
频谱图展示了信号在不同频率上的能量分布情况。
4. 绘制频谱图:使用Matlab绘制信号的频谱图。
频谱图可以帮助我们观察信号的频率成分和频率特性。
可以选择使用不同的频谱分析方法,如快速傅里叶变换(FFT)或功率谱密度估计(PSD)。
5. 分析频谱特性:观察频谱图,分析信号的频率成分和频率特性。
可以计算信号的主要频率分量,如峰值频率或频率范围。
还可以计算信号的能量分布情况,了解信号在不同频率上的能量分布情况。
实验结果与讨论:通过对不同类型信号进行频谱分析实验,我们可以得到以下结果和讨论:1. 正弦信号的频谱特性:正弦信号在频谱上只有一个频率成分,即信号的频率。
通过频谱分析,我们可以准确地确定正弦信号的频率。
2. 方波信号的频谱特性:方波信号在频谱上存在多个频率成分,主要包括基波频率和谐波频率。
通过频谱分析,我们可以观察到方波信号频谱上的多个峰值。
3. 噪声信号的频谱特性:噪声信号在频谱上呈现较为均匀的能量分布,没有明显的峰值。
音频频谱分析仪设计

信号处理实验实验八:音频频谱分析仪设计与实现一、实验名称:音频频谱分析仪设计与实现二、实验原理:MATLAB是一个数据信息和处理功能十分强大的工程实用软件,其数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令。
本实验可以用MATLAB进行音频信号频谱分析仪的设计与实现。
1、信号频率、幅值和相位估计(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的小数部分,同样,以φ的平均值作为相位的估计值。
频率、幅值和相位估计的流程如图所示。
其中tin表示第n个过零点,yi为第i个采样点的值,Fs为采样频率。
2、数字信号统计量估计(1) 峰值P的估计在样本数据x中找出最大值与最小值,其差值为双峰值,双峰值的一半即为峰值。
P=0.5[max(yi)-min(yi)](2)均值估计式中,N为样本容量,下同。
(3) 均方值估计(4)方差估计2、频谱分析原理时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。
(1)DFT与FFT对于给定的时域信号y,可以通过Fourier变换得到频域信息Y。
Y可按下式计算式中,N为样本容量,Δt = 1/Fs为采样间隔。
基于matlab的频谱分析仪设计

Frequency AnalyzerYangXiao M2013705103HuaZhong University of Science and TechnologySchool of Mechanical Science and Engineering Abstract: Matlab Is a numerical analysis, matrix calculation, scientific data visualization and nonlinear dynamic state system modeling and simulation, and other functions of practical software engineering.It’s easy to use the windows environment and cast off a tradition on the interactive programming language (such as C, Fortran) Edit mode In large range.In this report,The task is to design a frequency analyzer by using matlab.Keyword:frequency analyzer;Matlab;time-domainanalysis;frequency-domain analysis;1.PrefaceMATLAB is called Matrix Laboratory,which is designed by the United States MathWorks company.It’s a commercial mathematical software. Matlab can be use for Matrix operations, mapping functions and data, algorithm, creating the user interface, connect to other programming languages procedures, mainly used in engineering calculations, control design, signal processing and communications, image processing, signal detection, design and financial modeling analysis and other fields. GUI (Graphical User Interface, referred to as GUI, known Graphical User Interface) is displayed using the graphical user interface of computer operations.. Matlab has a powerful GUl tool. In this report, by using matlab GUI tool we could design a frequency analyzer.Frequency analyzer is the instrument which could be used to study the structure of the electrical signal spectrum, and used to measure the signal parameters of signal distortion, modulation, frequency stability and spectral purity.Frequency analyzer could be used to measure some parameters of amplifier and filter circuit system , and it is a kind of multipurpose electronic measuring instrument.FFT (Fast Fourier Transformation) is the fast algorithm of DFT(discrete Fourier transformtion), which is based on discrete Fourier transform.By using FFT we could get the answer faster than DFT.2.IntroduceThe frequency analyzer which is designed by using matlab have three models:record,play wav file and generator some waves .Every model could make three kinds of waveforms:the time domain figure,the frequency spectrum domain figure and the power spectrum figure.We could get the message we want from the frequency analyzer.The interface is that:2.1 Interface3. Design PrinciplesThe task is to design the frequency analyzer which can record,open wav file and play it,generator some kinds of waveforms . Each waveform could do FFT analysis and draw its frequency spectrum figure and power spectrum figure.3.1 signal input3.1.1 choose signal inputWhen we start using the frequency analyzer,we should first set the sampling frequency,sampling numbers and the model of inputting signal.The frequency analyzer has three model of inputting:it’s the record,open and play wav file,signal generator.The program is(just the record):val=get(handles.model,'Value');switch valcase 1h=findobj('Tag','recordtime');set(h,'enable','on');h=findobj('Tag','startrecord');set(h,'enable','on');h=findobj('Tag','filename');set(h,'enable','off');h=findobj('Tag','openfile');set(h,'enable','off');h=findobj('Tag','wave');set(h,'enable','off');h=findobj('Tag','amplitude');set(h,'enable','off');h=findobj('Tag','frequency');set(h,'enable','off');h=findobj('Tag','phase');set(h,'enable','off');h=findobj('Tag','add');set(h,'enable','off');h=findobj('Tag','generatorwave');set(h,'enable','off');When we choose one model ,the others couldn’t work.3.1.2 The recordWe could input the sound signal by using the microphone.Matlab provides the wavecord function,which can be used to get the signal of microphone.The program of record is :Fs=str2double(get(handles.samplefrequency,'String'));N=str2double(get(handles.recordtime,'String'))*Fs;handles.y=wavrecord(N, Fs,'double');handles.inputtype=1;guidata(hObject,handles);plot(handles.axes1,handles.y);ysize=size(handles.y);set(handles.samplenumber,'String',num2str(ysize(1)));3.1.3 Read the wav fileWe use the function of wavread to open the wav file and play it. Theprogram is:[fname,filepath]=uigetfile('*.wav','wav');set(handles.filename,'string',fname);[handles.y,Fs,bit]=wavread(fname);temp = wavread(get(findobj('Tag','filename'),'String'));handles.inputtype=2;guidata(hObject,handles);plot(handles.axes1,(1:length(handles.y))/Fs,handles.y);ysize=size(handles.y);set(handles.samplenumber,'String',num2str(ysize(1)));set(handles.samplefrequency,'string',Fs);wavplay(temp,Fs);3.1.4 Signal generatorMatlab has the general functions which can generator the general waveform directly.We judge the signals should add or not.The program is:Fs=str2double(get(handles.samplefrequency,'String'));N=str2double(get(handles.samplenumber,'String'));x=linspace(0,N/Fs,N);t=get(handles.wave,'Value');f=str2double(get(handles.frequency,'String'));a=str2double(get(handles.amplitude,'String'));p=str2double(get(handles.phase,'String')); switch tcase 1y=a*sin(2*pi*x*f+p);case 2y=a*square(sin(2*pi*x*f+p));case 3y=a*sawtooth(2*pi*x*f+p,0.5);case 4y=a*sawtooth(2*pi*x*f+p);case 5y=a*(2*rand(size(x))-1);endif get(handles.add,'Value')==0.0handles.y=y;elsehandles.y=handles.y+y;endhandles.inputtype=3;guidata(hObject,handles);plot(handles.axes1,handles.y);xlim([0 200]);3.2 Time domain analysisMatlab provides the functions of mean and std,which can easily calculate the mean and variance.The program is :Fs=str2double(get(handles.samplefrequency,'String'));N=str2double(get(handles.samplenumber,'String'));set(handles.vpp,'String',(max(handles.y)-min(handles.y)));set(handles.average,'String',mean(handles.y));set(handles.variance,'String',std(handles.y)^2);3.3 Frequency domain analysisMatlab provide the function of FFT,which can easily achieve the fast Fourier transform algorithm.The program is:Fs=str2double(get(handles.samplefrequency,'String'));N=str2double(get(handles.samplenumber,'String'));temple=handles.y;f=linspace(0,Fs/2,N/2);P=2*fft(temple,N)/N;Pyy=sqrt(P.* conj(P));plot(handles.axes2,f,Pyy(1:N/2));plot(handles.axes3,f,abs(P(1:N/2)).^2);3.4 Simulation3.4.1 The recordWe select the record ,set the record time and sampling frequency,pushthe start record button to begin recording.We can get the waveform of the sound in the graphic area axes1.If we push the time analysis button ,we could get the parameter of vpp,average variance.If we push the fft button,we could get the frequency spectrum figure and power spectrum figure in the graphic area axes2 and axes3.The result is shown:3.1 Image of record3.4.2 Read the wav fileThe result is shown:3.2 wav file amplitude-frequency characteristic3.4.3 Signal generatorWe set the waveform, amplitude, frequency, phase and other information to generate the waveform.The time domain analysis and frequency domain analysis is shown:3.3 amplitude-frequency characteristic of sin wave3.4 amplitude-frequency characteristic of square waveWe can add some waves and analysis3.5 phase frequency characteristics of Superposition signalOther waveform analysis:3.6 amplitude-frequency characteristic of noise4 .Exist problemWhen using the signal generator to generator the wave,the picture ofaxes3 (power spectrum)would change.I can’t solve this problem.And Ifail to build the window function.5.ConclusionIn the future study, I will learn MATLAB this powerful engineering software more harder and try to solve some common engineering problems.References[1] 薛山. MATLAB基础教程. [M] 北京:清华大学出版社,2011.3。
应用Matlab对含噪声语音信号进行频谱分析及滤波

应用Matlab对含噪声语音信号进行频谱分析及滤波频谱分析是对信号的频率特性进行研究和描述的一种方法,而滤波是对信号进行去除或者强调特定频率成份的处理。
在语音信号处理中,频谱分析及滤波常用于去除噪声、增强语音信号的清晰度和可听度。
Matlab作为一种强大的科学计算软件,提供了丰富的工具和函数用于频谱分析和滤波。
下面将详细介绍如何使用Matlab对含噪声语音信号进行频谱分析及滤波的步骤和方法。
1. 导入语音信号首先,我们需要将含噪声的语音信号导入到Matlab中进行处理。
可以使用Matlab提供的`audioread()`函数读取语音文件,并将其存储为一个向量。
```matlab[y, Fs] = audioread('noisy_speech.wav');```其中,`y`是读取到的语音信号向量,`Fs`是采样率。
如果语音文件的采样率不是默认的16kHz,可以使用`resample()`函数调整采样率。
2. 绘制时域波形为了对语音信号有一个直观的了解,可以绘制其时域波形图。
使用Matlab的`plot()`函数可以实现这一目标。
```matlabt = (0:length(y)-1)/Fs;plot(t, y);xlabel('Time (s)');ylabel('Amplitude');title('Time Domain Waveform');```这段代码将绘制出含噪声语音信号的时域波形图,横轴表示时间,纵轴表示信号的幅值。
3. 进行频谱分析频谱分析可以匡助我们了解语音信号在不同频率上的能量分布情况。
在Matlab 中,可以使用`fft()`函数对语音信号进行傅里叶变换,得到其频谱。
```matlabN = length(y);Y = fft(y);P = abs(Y).^2/N;f = Fs*(0:(N/2))/N;plot(f, 10*log10(P(1:N/2+1)));xlabel('Frequency (Hz)');ylabel('Power (dB)');title('Power Spectrum');```上述代码将绘制出含噪声语音信号的功率谱图,横轴表示频率,纵轴表示功率(以分贝为单位)。
用matlab画出声音的频谱

一.实验内容
任选一个声音文件,画出其波形图和频谱图。
二.算法分析和描述
(1)选择一个wav文件作为分析的对象
(2)读取音频信号的数据,并画出其时域波形和频谱图。
所使用到的几个函数如下:
1.[x,fs,bits]=wavread('filename')这是一个matlab中读取wav文件的
数据的函数。
2.[d]=fft(w,l)这是matlab中fft函数的一种输入输出形式。
3.sound(w,fs,bits)函数它将数列的数据通过声卡转化为声音。
三.实现方法(含实现思路、程序流程图和源程序列表等)clear
[y,fs,bits]=wavread(‘声音');
sound(y,fs,bits);
Y=fft(y,4096);
subplot(211);
plot(y);
title('声音信号的波形');
subplot(212)
plot(abs(Y));
title('声音信号的频谱');
四.实验结果分析(含执行结果验证、输出显示信息和图形等)通过编程实现得到下列图形:。
利用MATLAB软件对音频信号进行频谱分析与处理

利用MATLAB软件对音频信号进行频谱分析与处理一、简介频谱分析是通过对信号的频率成分进行分析,它允许我们了解信号的特性,计算信号的能量分布,同时还可以用来定位造成干扰的频率组件,以及检测和分析信号的变化。
MATLAB是一种编程语言和科学计算软件,它可以非常便捷地实现对音频信号的频谱分析和处理。
二、实现方法1.导入音频信号在使用MATLAB进行频谱分析时,首先需要先将音频信号导入MATLAB环境中。
可以使用audioplayer和audioread函数来完成这一步骤,示例代码如下:[audioData, fs] = audioread(‘AudioFile.wav’);player = audioplayer(audioData, fs);play(player);其中audioData表示从wav文件中读取的音频数据,fs表示采样率,player表示存储audioData和fs的audioplayer实例,play函数可以播放音频文件。
2.信号预处理针对所记录的音频信号,需要进行一些基本的信号处理操作,包括去噪、均衡、时域平均等。
去噪可以用MATLAB内置的函数完成,例如:audioData_NoiseRemoved = denoise(audioData,‘meanspectrum’);均衡是指将频谱的一些区域调整到更好的水平,可以用equalizer函数实现:audioData_Equalized = equalizer(audioData, ‘bandwidth’, 0.2);时域平均则可以使用conv函数实现:audioData_Meaned = conv(audioData, [1/N 1/N ... 1/N]);3.频谱分析频谱分析的主要工作是计算信号的谱密度,也就是每一个频率分量的能量。
利用MATLAB软件对音频信号进行频谱分析与处理

本科毕业设计说明书(论文)第I 页共I 页毕业设计说明书(论文)外文摘要本科毕业设计说明书(论文)第II 页共I 页目次1 引言 (1)1.1 研究背景 (1)1.2 本文主要研究内容 (1)2 MATLAB简介 (3)2.1 什么是MATLAB (3)2.2 MATLAB的发展历史 (3)2.3 MATLAB系统 (4)2.4 MATLAB的主要功能和特性 (6)3. 数字滤波器简介 (8)3.1 数字滤波器的定义及分类 (8)3.2 数字滤波器设计方法 (10)4.音频信号频谱分析的软件实现 (13)4.1 数字滤波器设计 (13)4.2 音频信号频谱分析 (17)4.3 界面设计 (37)结论 (43)致谢 (44)参考文献 (45)本科毕业设计说明书(论文)第1 页共45 页1 引言1.1 研究背景在计算机技术日新月异的今天,计算机已同人们的日常生活和工作越来越紧密的联系在一起。
而在工程计算领域中,计算机技术的应用正逐步把科技人员从繁重的计算工作中解放出来。
在科学研究和工程应用的过程中,往往需要进行大量的数学计算,传统的纸笔和计算器已根本不能满足海量计算的要求。
MATLAB的产生是与数学计算紧密联系在一起的, MATLAB由主包和功能各异的工具箱组成,其基本数据结构是矩阵,它具有非常强大的计算功能,正是凭借其杰出的性能,MATLAB现在已成为世界上应用最广泛的工程计算应用软件之一。
MATLAB在国外的高校已成为大学生、硕士生、博士生必须掌握的基本程序设计语言。
信号处理是科学研究和工程技术许多领域都需要进行的一个重要环节,这种处理包括信号的检测、变换、滤波、传输、信号提取等。
传统上对信号的处理大都采用模拟系统来实现,然而,随着人们对信号处理要求的不断提高,以及模拟信号处理中一些不可克服的缺点,对信号的许多处理转而采用数字的方法来进行。
信号处理技术是开发具有自主知识产权的各类先进产品的瓶颈,是一项关键技术。
信号处理算法课程设计报告 Matlab对语音信号进行频谱分析及滤波

实验报告题目:Matlab对语音信号进行频谱分析及滤波专业班级电子09学生学号指导教师刘利民完成时间 2012 年 6月 11 日一、设计目的为了巩固所学的数字信号处理理论知识,使学生对信号的采集、处理、传输、显示和存储等有一个系统的掌握和理解,再者,加强学生对Matlab软件在信号分析和处理的运用。
二、设计内容1、语音信号的采集录制了一段声音,在C盘保存为WAV格式(也可以利用已有的音乐)。
然后在Matlab软件平台下.利用函数wavread对语音信号进行采样,并记录下了采样频率和采样点数,在这里我们还通过函数sound引入听到采样后自己所录的一段声音。
2、语音信号的频谱分析首先画出语音信号的时域波形;然后对语音信号进行频谱分析,在Matlab 中,我们利用函数fft对信号进行快速傅里叶变换,得到信号的频谱特性性。
3、设计数字滤波器和画出其频谱响应设计一个数字滤波器:F c =4800 Hz,Fb=5000 Hz,Ap= 1dB,As=100dB,利用Matlab中的函数freqz画出了该滤波器的频率响应。
4、对滤波前后的信号进行对比,分析信号的变化,并回放语音信号。
三、课程设计应完成的工作步骤1、语音信号的采集,并播放原始语音信号;2、画出语音信号的时域波形,语音信号的频谱分析;3、数字滤波器的设计;4、对语音信号进行滤波处理;5、对滤波前后的语音信号频谱进行对比分析;并回放语音信号四、设计结果分析二、设计内容1 语音信号的采集利用windows自带的关机语音C:\WINDOWS\Media\Windows XP 关机.wav,时间刚好在1s以内(如图)。
在matlab 平台下,利用函数wavread对语音信号进行采样。
通过wavread函数的使用,进一步理解采样频率,采样位数。
采样和播放语音信号:[z1,fs,bits]=wavread('C:\WINDOWS\Media\Windows XP 关机.wav')运行结果:fs = 20250 bits =16(fs表示采样频率(Hz),nbits表示采样位数)sound(x1,fs,bits); %播放语音信号2 语音信号的频谱分析首先画出由wavread函数采样后的信号的时域波形和它的频域响应波形;其次对语音信号进行FFT变换,得到FFT频谱特性曲线,与原语音信号的频谱特性曲线进行比较。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MATLAB的声音信号频谱分析仪设计 收藏 1.概述 随着软硬件技术的发展,仪器的智能化与虚拟化已成为未来实验室及研究机构的发展方向[1] 黄昱. 软件频谱仪设计. 华中科技大学硕士学位论文. 2004.5。虚拟仪器技术的优势在于可由用户定义自己的专用仪器系统,且功能灵活,很容易构建,所以应用面极为广泛。基于计算机软硬件平台的虚拟仪器可代替传统的测量仪器,如示波器、逻辑分析仪、信号发生器、频谱分析仪等[2] 肖旸,胡耀祖. 基于虚拟技术的频谱分析仪器方案. 微机发展,2003.6。从发展史看,电子测量仪器经历了由模拟仪器、智能仪器到虚拟仪器,由于计算机性能的飞速发展,已把传统仪器远远抛到后面,并给虚拟仪器生产厂家不断带来连锅端的技术更新速率。目前已经有许多较成熟的频谱分析软件,如SpectraLAB、RSAVu、dBFA等。 声卡是多媒体计算机最基本的配置硬件之一,价格便宜,使用方便。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,他的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令[3] 张桂林,张烈平. 基于声卡和Matlab的虚拟信号发生器. 现代电子技术。本文将给出基于声卡与MATLAB的声音信号频谱分析仪的设计原理与实现方法,功能包括: (1) 音频信号信号输入,从声卡输入、从WAV文件输入、从标准信号发生器输入; (2) 信号波形分析,包括幅值、频率、周期、相位的估计,以及统计量峰值、均值、均方值和方差的计算; (3) 信号频谱分析,频率、周期的估计,图形显示幅值谱、相位谱、实频谱、虚频谱和功率谱的曲线。 2.设计原理 2.1波形分析原理 2.1.1 信号频率、幅值和相位估计 (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的小数部分,同样,以φ的平均值作为相位的估计值。 频率、幅值和相位估计的流程如图 1所示。 图 1 频率、幅值和相位估计的流程图 其中tin表示第n个过零点,yi为第i个采样点的值,Fs为采样频率。 2.1.2 数字信号统计量估计 (1) 峰值P的估计 在样本数据x中找出最大值与最小值,其差值为双峰值,双峰值的一半即为峰值。 P=0.5[max(yi)-min(yi)] (2)均值估计
式中,N为样本容量,下同。 (3) 均方值估计 (4) 方差估计
2.2频谱分析原理 时域分析只能反映信号的幅值随时间的变化情况,除单频率分量的简单波形外,很难明确提示信号的频率组成和各频率分量大小,而频谱分析能很好的解决此问题。由于从频域能获得的主要是频率信息,所以本节主要介绍频率(周期)的估计与频谱图的生成。 2.2.1 DFT与FFT 对于给定的时域信号y,可以通过Fourier变换得到频域信息Y。Y可按下式计算
式中,N为样本容量,Δt = 1/Fs为采样间隔。 采样信号的频谱是一个连续的频谱,不可能计算出所有的点的值,故采用离散Fourier变换(DFT),即
式中,Δf = Fs/N。但上式的计算效率很低,因为有大量的指数(等价于三角函数)运算,故实际中多采用快速Fourier变换(FFT)。其原理即是将重复的三角函数算计的中间结果保存起来,以减少重复三角函数计算带来的时间浪费。由于三角函数计算的重复量相当大,故FFT能极大地提高运算效率。 2.2.2 频率、周期的估计
对于Y(kΔf),如果当kΔf = 时,Y(kΔf)取最大值,则为频率的估计值,由于采样间隔的误差,也存在误差,其误差最大为Δf / 2。 周期T=1/f。 从原理上可以看出,如果在标准信号中混有噪声,用上述方法仍能够精确地估计出原标准信号的频率和周期,这个将在下一章做出验证 2.2.3 频谱图 为了直观地表示信号的频率特性,工程上常常将Fourier变换的结果用图形的方式表示,即频谱图。 以频率f为横坐标,|Y(f)|为纵坐标,可以得到幅值谱; 以频率f为横坐标,arg Y(f)为纵坐标,可以得到相位谱; 以频率f为横坐标,Re Y(f)为纵坐标,可以得到实频谱; 以频率f为横坐标,Im Y(f)为纵坐标,可以得到虚频谱。 根据采样定理,只有频率不超过Fs/2的信号才能被正确采集,即Fourier变换的结果中频率大于Fs/2的部分是不正确的部分,故不在频谱图中显示。即横坐标f ∈[0, Fs/2] 2.3. 模块划分 模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户需求。根据人类解决一般问题的经验,如果一个问题由两个问题组合而成,那么它的复杂程度大于分别考虑每个问题时的复杂程度之和,也就是说把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。 在模块划分时应遵循如下规则[4] 张海藩. 软件工程. 北京:人民邮电出版社, 2002:改进软件结构提高模块独立性;模块规模应该适中;深度、宽度、扇出和扇入都应适当;模块的作用域应该在控制域之内;力争降低模块接口的复杂程度;设计单入口单出口的模块;模块功能应该可以预测。 本着上述的启发式规则,对软件进行如图 2所示的模块划分。
图 2频谱分析仪的模块划分 3.软件实现 3.1界面设计 MATLAB是Mathworks公司推出的数学软件,它将数值分析、矩阵计算、信号处理和图形显示结合在一起,为众多学科领域提供了一种简洁、高效的编程工具。它提供的GUIDE工具为可视化编程工具,使得软件的界面设计像VB一样方便。故本文采用MATLAB作为编程语言实现声音信号频谱分析仪,以下所讲的都是在MATLAB7.0环境中。 为了实现预期的功能,设计如图 3所示的界面。
图 3 频谱分析仪的界面设计 最上面的部分为标题区,用于显示软件标题等信息,不具人机交互功能。 再往下是信号输入区,包含3种输入方式,考虑到WAV文件可能是多声道,故提供了声道选择的界面,因为每次只能对单个声道进行分析。在信号发生器中加入了混迭选项,从而可以将产生的信号与原有的信号进行混迭。界面应该具有:只有当每个单选框被选中时才允许使用对应的输入框、按钮等;采样点数输入框在声卡与WAV文件的输入方式下作为输出,在信号发生器的输入方式下作为输入。 再往下是分析区。对于WAV文件及录音的信号,有时只对其中一部分信号进行分析,故提供了分析对象范围设定的界面。另外就是时域分析与频域分析的按钮,该软件的核心代码都在这两个按钮的回调函数中。 分析区下面是分析结果区,用于显示波形基本参数与统计量的计算结果。 分析结果区的下面是波形显示区,用于显示时域波形,在录音结束、打开WAV文件成功或者信号发生器生成波形时会更新显示。 右边为频谱图显示区,用于显示各种频谱的谱线,在点击频域分析后会更新显示。 3.2输入模块的实现 采样频率Fs与采样点数N是声音信号输入时共同需要作用的参数,故将其独立出来。下面为别介绍三种输入方式的实现。 3.2.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))); 3.2.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.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