简易-FFT-分析仪.doc
《简易-FFT-分析仪.doc》由会员分享,可在线阅读,更多相关《简易-FFT-分析仪.doc(22页珍藏版)》请在冰点文库上搜索。
![简易-FFT-分析仪.doc](https://file1.bingdoc.com/fileroot1/2023-4/29/1f8d6fb1-ef7a-4bcd-b563-05b4361d0f09/1f8d6fb1-ef7a-4bcd-b563-05b4361d0f091.gif)
数字信号处理
课程设计报告
课设题目:
简易FFT分析仪
学院:
信息与电气工程学院
专业:
电子与信息工程
班级:
姓名:
学号:
指导教师:
2013年
12月
13日
1.不要删除行尾的分节符,此行不会被打印
哈尔滨工业大学(威海)课程设计报告
目录
一.课程设计任务 1
二.课程设计原理及设计方案 2
三.课程设计的步骤和结果 3
四.课程设计总结 4
五.设计体会 5
六.参考文献 6
-19-
哈尔滨工业大学(威海)课程设计报告
一.课程设计任务
数字信号处理是一门理论和技术发展十分迅速、应用非常广泛的前沿性
学科,在雷达、通信、医学、地震等众多领域都有广泛的应用。
《数字信号处理》课程是电子、通信、信号处理等专业的专业基础课程,数字信号处理课程设计是完成数字信号处理相关理论的学习后进行的综合性训练课程,使学生能够对信号的采集、处理、传输、显示和存储等相关理论及技术实现有一个系统地掌握和理解。
本课程设计的目的为:
1)巩固和加深学生对数字信号处理的基本概念、基本原理、基本分析方法的理解;
2)培养学生根据设计题目的要求,综合利用数字信号处理技术的能力,提高学生综合运用所学知识,解决实际工程技术问题的能力;
3)通过课程设计,培养学生查阅文献、资料,独立解决实际问题的能力。
通过课程设计,要求学生综合运用数字信号处理的理论知识进行频谱分析和滤波器设计,通过理论推导得出相应结论,再利用MATLAB或LabView作为编程工具进行计算机实现,从而加深对所学知识的理解,建立概念。
设计一个20Hz~20KHz范围内的频谱分析仪(用计算机声卡);
要求:
1)用计算机声卡实时采集语音信号,并实时显示时域波形信号;
2)可以从计算机中读取语音信号文件,并能够实时显示时域波形信号;
3)实现对信号进行幅度上的放大、缩小显示,存储等;
4)实时显示信号的频谱,信号的频谱分辨率可以进行设置;
5)采用常见的低通、高通、带通、带阻(50Hz)滤波器对信号进行滤波,滤波器阶数可调,带宽可调,观察信号频谱的变化;
6)对信号频谱进行非实时高分辨率分析;
7)编制GUI用户界面,能够在用户界面上实现上述所有功能。
8)其它功能可参考商用FFT分析仪添加;
二.课程设计原理及设计方案
2.1频谱分析仪原理
频谱分析仪是研究电信号频谱结构的仪器,用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量,可用以测量放大器和滤波器等电路系统的某些参数,是一种多用途的电子测量仪器。
它又可称为频域示波器、跟踪示波器、分析示波器、谐波分析器、频率特性分析仪或傅里叶分析仪等。
基于快速傅里叶变换(FFT)的现代频谱分析仪,通过傅里叶运算将被测信号分解成分立的频率分量,达到与传统频谱分析仪同样的结果。
新型的频谱分析仪采用数字方法直接由模拟/数字转换器(ADC)对输入信号取样,再经FFT处理后获得频谱分布图。
傅里叶变换告诉我们,任何时域的电信号都是由一定幅度、频率和相位的正弦波组合而成,利用适当的滤波器,可以把信号分解为单独的正弦波,或者是不同频率谱线的组合,然后对它们进行单独的分析处理。
反过来说,频谱就是正弦波谱线的集合,通过适当的合成会产生原来的时域信号。
离散付里叶变换X(k)可看成是z变换在单位圆上的等距离采样值
同样,X(k)也可看作是序列付氏变换X(ejω)的采样,采样间隔为ωN=2π/N,由此看出,离散付里叶变换实质上是其频谱的离散频域采样,对频率具有选择性(ωk=2πk/N),在这些点上反映了信号的频谱。
根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失任何信息,FFT变换则说明对于时间有限的信号(有限长序列),也可以对其进行频域采样,而不丢失任何信息。
所以只要时间序列足够长,采样足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT可以用以进行连续信号的频谱分析。
2.2FFT原理
FFT(FastFourierTransformation),即为快速傅氏变换,是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。
这样变换以后,总的运算次数就变成N+2*(N/2)^2=N+(N^2)/2。
继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
图1:
8点FFT变换图
2.3滤波器分析原理
数字滤波器(digitalfilter)是由数字乘法器、加法器和延时单元组成的一种装置。
其功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。
由于电子计算机技术和大规模集成电路的发展,数字滤波器已可用计算机软件实现,也可用大规模集成数字硬件实时实现。
数字滤波器是一个离散时间系统(按预定的算法,将输入离散时间信号转换为所要求的输出离散时间信号的特定功能装置)。
应用数字滤波器处理模拟信号时,首先须对输入模拟信号进行限带、抽样和模数转换。
数字滤波器输入信号的抽样率应大于被处理信号带宽的两倍,其频率响应具有以抽样频率为间隔的周期重复特性,且以折叠频率即1/2抽样频率点呈镜像对称。
为得到模拟信号,数字滤波器处理的输出数字信号须经数模转换、平滑。
数字滤波器具有高精度、高可靠性、可程控改变特性或复用、便于集成等优点。
数字滤波器在语言信号处理、图像信号处理、医学生物信号处理以及其他应用领域都得到了广泛应用。
数字滤波器有低通、高通、带通、带阻和全通等类型。
它可以是时不变的或时变的、因果的或非因果的、线性的或非线性的。
应用最广的是线性、时不变数字滤波器..以及f.i.r滤波器。
IIR滤波器有以下几个特点:
IIR数字滤波器的系统函数可以写成封闭函数的形式。
IIR数字滤波器采用递归型结构,即结构上带有反馈环路。
IIR滤波器运算结构通常由延时、乘以系数和相加等基本运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。
由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。
IIR数字滤波器在设计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,其设计工作量比较小,对计算工具的要求不高。
在设计一个IIR数字滤波器时,我们根据指标先写出模拟滤波器的公式,然后通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。
IIR数字滤波器的相位特性不好控制,对相位要求较高时,需加相位校准网络。
在MATLAB下设计IIR滤波器可使用Butterworth函数设计出巴特沃斯滤波器,使用Cheby1函数设计出契比雪夫I型滤波器,使用Cheby2设计出契比雪夫II型滤波器,使用ellipord函数设计出椭圆滤波器。
下面主要介绍前两个函数的使用。
与FIR滤波器的设计不同,IIR滤波器设计时的阶数不是由设计者指定,而是根据设计者输入的各个滤波器参数(截止频率、通带滤纹、阻带衰减等),由软件设计出满足这些参数的最低滤波器阶数。
在MATLAB下设计不同类型IIR滤波器均有与之对应的函数用于阶数的选择。
IIR单位响应为无限脉冲序列FIR单位响应为有限的
IIR幅频特性精度很高,不是线性相位的,可以应用于对相位信息不敏感的音频信号上;
FIR幅频特性精度较之于IIR低,但是线性相位,就是不同频率分量的信号经过FIR滤波器后他们的时间差不变。
这是很好的性质。
另外有限的单位响应也有利于对数字信号的处理,便于编程,用于计算的时延也小,这对实时的信号处理很重要。
IIR滤波器的优点在于,其设计可以直接利用模拟滤波器设计的成果,因为模拟滤波器本身就是无限长冲激响应的。
通常IIR滤波器设计的过程如下:
首先根据滤波器参数要求设计对应的模拟滤波器(如巴特沃斯滤波器、切比雪夫滤波器等等),然后通过映射(如脉冲响应不变法、双线性映射等等)将模拟滤波器变换为数字滤波器,从而决定IIR滤波器的参数。
IIR滤波器的重大缺点在于,由于存在反馈其稳定性不能得到保证。
另外,反馈还使IIR滤波器的数字运算可能溢出。
FIR滤波器最重要的优点就是由于不存在系统极点,FIR滤波器是绝对稳定的系统。
FIR滤波器还确保了线性相位,这在信号处理中也非常重要。
此外,由于不需要反馈,FIR滤波器的实现也比IIR滤波器简单。
FIR滤波器的缺点在于它的性能不如同样阶数的IIR滤波器,不过由于数字计算硬件的飞速发展,这一点已经不成为问题。
再加上引入计算机辅助设计,FIR滤波器的设计也得到极大的简化。
基于上述原因,FIR滤波器比IIR滤波器的应用更广。
三.课程设计的步骤和结果
3.1整体UI设计及模块设计
UI整体设计如下:
图2:
数字频谱分析仪UI
整体模块分为四大部分:
信号输入部分:
信号输入有音频文件输入和声卡实时输入两部分,其中文件输入可以实现任意路径下的文件打开(因matlab对中文支持不好估不建议打开中文目录下文件),点选声卡输入后显示模块切换为双坐标系,能上下同时实时显示时域信号和频域信号。
信号变换部分:
信号变换部分主要为信号的幅度变换和信号保存。
实时fft变换的分辨率也在此部分进行设置。
对信号的幅度放大及缩小直观的显示的显示坐标上,同保存文件可以实现对处理后音频文件的任意路径保存。
信号分析部分:
信号分析部分即实现频谱分析的主要功能,其中包含有高分辨率的FFT分析和滤波分析等。
滤波分析中又包含低通、高通、带通、带阻的滤波。
滤波后直接进行FFT输出频谱。
其中滤波功能实现了滤波带宽可调,阶数可调。
首先输入给定带宽,通过阶数估算按钮估算出最小阶数,然后输入阶数便可以实现指定带宽指定阶数的滤波分析。
对于带宽的定义,为方便计算,自定义了低通为0Hz到给定值,带通和带阻为2100Hz为中心,上下扩展二分之一给定值为通带和阻带,高通为给定值以上为通带。
这种定义只是为了输入和计算方便,并非科学的带宽定义。
显示部分:
显示部分为坐标系显示,可切换单坐标系和双坐标系,其中只有在实时录入语音信号时才会显示双坐标系,其他分析时刻均为单坐标系。
3.2文件输入及实时语音显示
文件输入部分采用uigetfile函数实现,得到任意路径的文件字符串,然后使用wavread函数进行wav读入,实现主体如下
globalnewpath;
oldpath=cd;
ifisempty(newpath)|~exist('newpath')
newpath=cd;
end
cd(newpath);
[filename,pathname]=uigetfile(...%获得文件路径及名称
{'*.*','AllFiles(*.*)'},...
'Pickafile');
iffilename~=0
newpath=pathname;
end
cd(oldpath);
y=wavread([pathnamefilename]);%读入指定目录文件
文件读入后直接使用plot函数绘制时域图形,并将读入信号保存至handles结构体中以便后其他模块调用。
图3:
打开文件窗口
图4:
打开的音频文件时域波形
录音部分采用驱动声卡的方式进行,为实现实时采样,设定声卡每次采样1s,显示部分每隔1s刷新一次,此部分采用wihle
(1)实现。
同时定义了停止录音的按钮为togglebutton,未按下时值为零,按下后值为一,在死循环中检测按键值,若按下则跳出循环,由此实现停止录音。
录音信号每一秒都一次累加到信号存储向量data0中,录音停止后将完整信号存入handles结构体中已备后面调用。
部分实现代码如下:
while
(1)
ifget(handles.p5,'value')
break;
end
AI=analoginput('winsound');
chan=addchannel(AI,1);
set(AI,'SampleRate',8000)%设置采样速率为8000Hz
ActualRate=get(AI,'SampleRate');%从AI中获取实际采样速率
set(AI,'TriggerChannel',chan)%设置触发通道
set(AI,'TriggerType','software');%设置触发类型
set(AI,'Triggercondition','rising');%设置为电压上升至某值后触发
set(AI,'TriggerConditionValue',0.013);%设置触发电压值
set(AI,'TriggerDelay',0);%设置触发时延
set(AI,'TriggerDelayUnits','seconds');%设置触发时延的单位
set(AI,'timeout',1)%定义超时值
Fs=ActualRate;%设置采样速率
cleardata1;
start(AI)%开始采样
try
[data1,time]=getdata(AI);%将采样得到的数据保存到data1
catchtime=0;data1=0;
disp('Atimeoutoccurred.');
end
data0=[data0;data1];%累加信号
plot(handles.a2,data0);%以时间为横轴,数据为纵轴作图
%xlabel('Time(sec.)');ylabel('SignalLevel(Volts)');
delete(AI)
clearAI
fs=5000;%采样频率20Khz
fy=fft(data0,ns);%进行fft变换
mag=abs(fy);%求幅值
f=(0:
length(fy)-1)'*fs/length(fy);%进行对应的频率转换
plot(handles.a3,f,mag);%做频谱图
end
handles.sign=data0;%保存录音信号
guidata(hObject,handles);
图5:
实时语音录入
3.3信号变换部分
信号幅度变化只采用简单的系数相乘的方式实现。
通过动态文本框读入幅值系数,然后直接于已知信号相乘得到幅度上的放大或缩小。
y=vs*handles.sign;%vs即为放大幅度值
图6:
幅值放大前后
上图为放大4倍前和4倍后的图形,可以看出图形没有太大变化,但是纵坐标的刻度发生了变化,可以看出幅度确实变化为4倍。
同时将处理后的音频保存,可以明显的听出音量增大了,即实现了幅度改变功能。
信号保存则使用uiputfile函数实现,可以将文件保存至任意路径下。
由于读入音频信号和录音采样频率不同,故在保存时采用分别处理,录音使用8000Hz保存,而音频文件则使用44100Hz保存。
部分实现代码如下:
data=handles.sign;
[filename,pathname]=uiputfile({‘wav’,’*.wav’},‘Pickanwav’);
ifget(handles.r1,’value’)
wavwrite(data,44100,[pathnamefilename]);%保存音频信号采样频率
end
ifget(handles.r2,’value’)
wavwrite(data,8000,[pathnamefilename]);%保存录音信号采样频率
end
图7:
保存文件对话框
3.4信号分析部分
FFT使用fft函数实现,非实时高分辨率的fft只需要读入采样点数,直接使用fy=fft(y,n);进行变换即可。
变换后需要将横轴转变为频域,采用fy=fft(y,n);语句,而后直接使用plot函数输出即可。
图8:
FFT变换后频谱
滤波部分则采用FFT滤波器,加凯塞窗来实现。
根据要求,滤波器指标均采用As=100dB,Ap=1dB来设计。
Matlab函数中,点数N多采用估算函数估算的方式。
故在进行滤波器生成前,先输入要求的带宽,使用估算函数算出最小阶数及其他参数等,在最小阶数的基础之上可随意改变滤波器阶数,再生成要求的滤波器进行滤波。
关于带宽的设定在前面已有说明,仅以方便输入及运算为原则进行了设计。
以低通滤波器为例,生成及滤波代码如下:
Ap=1;As=100;%定义通带及阻带衰减
dev=[(10^(Ap/20)-1)/(10^(Ap/20)+1),10^(-As/20)];%计算偏移量
mags=[1,0];%低通
fcuts=[B,B+200];%边界频率
[N,Wn,beta,ftype]=kaiserord(fcuts,mags,dev,fs);%估算FIR滤波器阶数
hh1=fir1(Np,Wn,ftype,kaiser(Np+1,beta));%FIR滤波器设计
x_1=filter(hh1,1,y);%滤波
x_1(1:
ceil(Np/2))=[];%群延时N/2,删除无用信号部分
L=length(x_1);
Np=2^(nextpow2(L));
Hw_1=fft(x_1,Np);
plot(handles.a1,(0:
Np-1)*fs/L,abs(Hw_1));%查看信号频谱
图9:
低通、高通、带通、带阻滤波后频谱
四.课程设计总结
通过完成课设要求,将结果分析比较后,得出以下结论
对于FFT变换,虽然对于手工计算显得繁杂,但对于计算机实现则相对快捷和方便,尤其matlab自带fft函数,只需要调用函数即可完成变换,大大缩短了计算难度和时间。
对于FFT采样点数,通过对比可知,在增加采样点数N之后,频谱分辨率大大提高,同时运算时间大大增加,不利于实时显示,但对于没有时间要求的情况下,高点数更利于分析。
图10:
不同采样点数的FFT频谱
对于滤波器设计,可以使用多种方法进行设计。
中规中矩的方法即是手工计算滤波器N及β值,然后付给程序对应数值即可生成滤波器。
第二种方法即为使用matlab的函数。
在滤波器参数确定方面,只需要简单估算即可完成,大大提高了设计效率。
同时matlab还提供了更为强大的采用FDATool工具箱,作为专业的滤波器设计,同样也可以适用于对于硬件电路波波器系数的相关计算。
在以上几种方法中,最为简便的还是直接使用估算函数进行估算和生成,也是本次课程设计中采用的方式。
通过对不同带宽和不同种类的滤波器滤波效果进行比较后,发现对于语音信号而言,由于频率比较单一,合理的设置滤波频点,可以使用低通滤波器进行去噪处理,并且经过高通滤波之后频谱的高频部分明显被消除。
图11:
去除高频噪声后的语音信号频谱
对于声卡音频采集,则有两种方法,本次使用了直接驱动声卡的方式,设置相对繁琐,而matlab还提供了直接的wavrecord函数可以使用,但相对而言,直接驱动声卡则可以有更多细节的设置进行设置,两者各有各的优点,需要时可以根据需求来选择不同的方法。
五.设计体会
本次课程设计中,加深了对GUI的使用理解,完整的设计出了实现目的的UI界面,同时通过多方面的资料学习,也弥补了自己在理论方面的不足。
了解了FFT的变化过程,原理,同时能够熟练的使用matlab做FFT变换。
在滤波器设计方面,也了解了matlab几种不同的设计方法,由于个人的能力所限,只选取了相对简单的一种方法进行实际的设计。
而对于滤波器参数方面。
尚不能完整的进行全部的设计,需要依托给出部分参数才可以设计完成滤波器,这一点在以后的学习中还会加强学习。
在语音信号方面本次课设中也得到了良好的学习,掌握了matlab中语音信号的读入保存的操作,并且通过对滤波器结果的分析,初步感受到了语音信号处理和分析的方法。
此次课设最大的收货在于对于数字信号理论学习的加深和实际应用,尝试设计并且成功,是最好的学习。
同时对于matlab的使用和操作也得到了巩固和加深,了解了很多以前从未接触的函数和设计思路以及方法,为进后的学习和分析都打下了良好的基础。
同时感谢老师的指导,以及同学相互讨论的帮助,在今后的学习中会对此次课设所体现出的不足加以改进,不断成长。
六.参考文献
1谭津基于MATLAB的实时语音可视化时频域分析系统,科技资讯2012,3:
13-14
2陈璇,李启海,朱万彬,张继勇,鲁秀娥基于声卡和MATLAB的音频信号的采集和处理,长春理工大学学报(自然科学版)2010,33(3):
71-74
3黄健,刘鹏,吴智可变带宽FIR低通滤波器设计和RAG算法系数综合,电子信息对抗技术2010,1(25):
73-82
4熊欣基于Matlab的FIR数字滤波器设计中国科技论文在线
5sunev基于Matlab的语音信号滤波器的设计与实现博客园
6sunev基于Matlab的FIR滤波器设计与实现博客园
课程设计成绩评定