第一篇:现代信号处理课设报告
中南大学 课程设计报告
题 目 现代信号处理课程设计 学生姓名 万义武 指导教师 周扬、支国明 学 院 信息科学与工程学院 学 号 0909118219 专业班级 电子信息专业1102班
一、课程设计题目
1、信号发生器
用户根据测试需要,可任选以下两种方式之一生成测试信号:(1)直接输入(或从文件读取)测试序列;(2)输入由多个不同频率正弦信号叠加组合而成的模拟信号公式(如式 1-1 所示)、采样频率(Hz)、采样点数,动态生成该信号的采样序列,作为测试信号。12 100sin(2)100sin(2)100sin(2)n f t f t f t
(1-1)
2、频谱分析
使用 FFT 对产生的测试信号进行频谱分析并展示其幅频特性与相频特性,指定需要滤除 的频带,通过选择滤波器类型(IIR / FIR),确定对应的滤波器(低通、高通)技术指标。
3、滤波器设计
根据以上技术指标(通带截止频率、通带最大衰减、阻带截止频率、阻带最小衰减),设 计数字滤波器,生成相应的滤波器系数,并画出对应的滤波器幅频特性与相频特性。(1)IIR DF 设计:可选择滤波器基型(巴特沃斯或切比雪夫型);
(2)FIR DF 设计:使用窗口法(可选择窗口类型,并比较分析基于不同窗口、不同阶数 所设计数字滤波器的特点)。
4、数字滤波
根据设计的滤波器系数,对测试信号进行数字滤波,展示滤波后信号的幅频特性与相频特 性,分析是否满足滤波要求(对同一滤波要求,对比分析各类滤波器的差异)。(1)IIR DF:要求通过差分方程迭代实现滤波(未知初值置零处理);
(2)FIR DF:要求通过快速卷积实现滤波(对于长序列,可以选择使用重叠相加或重叠 保留法进行卷积运算)。
5、选做内容
将一段语音作为测试信号,通过频谱展示和语音播放,对比分析滤波前后语音信号的变化,进一步加深对数字信号处理的理解。
二、设计过程
《1》、第一、二题:(1).信号发生器。
①直接输入(或从文件读取)测试序列;
②输入由多个不同频率正弦信号叠加组合而成的模拟信号公式。
③使用FFT对产生的测试信号进行频谱分析并展示其幅频特性与相频特性。(2).源代码
t=(0:0.00001:1);n=0:100;f1=50;y=sin(2*pi*f1*t);f=input('please f=');T=1/f;x=sin(2*pi*f1*n*T);m=fft(x);h=abs(m);figure(1);subplot(321)plot(t,y);subplot(322)stem(n,x,'.');title('xulitu');subplot(323)plot(n,h);title('fupintu');subplot(324)xi=interp1(n,x,t*f1,'linear');plot(t,xi);title('chongjiantu');
(3)结果
(4)分析:
采样原理:对模拟信号进行采样可以看作是一个模拟信号通过一个电子开关S。设电子开关每隔周期T合上一次,每次合上的时间为τ,在电子开关输出端得到其采样信号,一般τ很小, τ越小,采样输出脉冲的幅度越接近输入信号在离散时间点上的瞬时值。
《2》、第三、四题
(1)题目(滤波器设计与数字滤波)
滤波器设计—根据输入的数字滤波器的技术指标,包括通带截止频率,通带最大衰减,阻带截止频率,阻带最小衰减,设计滤波器,生成相应的滤波器系数,并画出对应的滤波器幅频、相频特性。IIR DF设计:可选择滤波器基型(巴特沃斯或切比雪夫型);
(2)源代码
i=input('please input i(choose fuction)=');switch fix(i)
case {1}%低通滤波
wp=input('please input wp=');ws=input('please input ws=');ap=input('please input ap=');as=input('please inout as=');fs=1;T=1/fs;
wp1=(2/T)*tan(wp/2);ws1=(2/T)*tan(ws/2);
[n,wn]=buttord(wp1,ws1,ap,as,'s');[b,a]=butter(n,wn,'s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,0.8,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('单位脉冲响应');grid;clear;
case{2}%高通滤波
wp=input('please input wp=');ws=input('please input ws=');ap=input('please input ap=');as=input('please inout as=');fs=1;T=1/fs;
wp1=(2/T)*tan(wp/2);ws1=(2/T)*tan(ws/2);
[n,wn]=buttord(wp1,ws1,ap,as,'s');[b,a]=butter(n,wn,'high','s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,0.9,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('单位脉冲响应 ');grid;clear;
case{3}%带通滤波
wpl=input('please input wpl=');wph=input('please input wph=');wsl=input('please input wsl=');wsh=input('please input wsh=');ap=input('please input ap=');as=input('please inout as=');wp=[wpl,wph];ws=[wsl,wsh];fs=1;T=1/fs;
wp2=(2/T)*tan(wp/2);ws2=(2/T)*tan(ws/2);
[n,wn]=buttord(wp2,ws2,ap,as,'s');[b,a]=butter(n,wn,'s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,1.2,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('单位脉冲响应 ');grid;clear;
end
(3)结果
低通滤波
高通滤波
带通滤波(4)分析
用双线性变换法设计无限脉冲响应数字滤波器(IIF DF)时,先把数字滤波器指标转换成模拟滤波器的指标,然后根据模拟滤波器的指标设计模拟滤波器,再经过线性变换把模拟滤波器转换成数字滤波器。该系统要能够设计巴特沃兹型低通、带通、高通滤波器,并能够输入数字滤波器的性能指标,显示出滤波器的阶数和系数。该系统的关键部分是滤波器的设计部分,按照双线性变换法设计滤波器的步骤进行设计即可。
三、设计总结与心得体会
在课程设计的这段时间,我获益匪浅。不但进一步掌握了数字信号处理的基础知识及MATLAB的基本操作。虽然在做的过程中遇到了一些问题,但都通过自己的努力解决了它们。这次课程设计对我各方面的综合能力有了很大的提高,对我以后的实践都有很大的帮助。
本次课程设计不但让我又学到了一些知识,而且也提高了我的综合能力。使我在各个方面都得到了锻炼,以后有这样的机会一定会更加的很好利用,它不仅可以提高学习的针对性而且可以很好的锻炼动手能力以及自己的逻辑设计能力和处理问题的能力,希望在以后这方面的能力会很好的加强。
四、课程设计指导书
[1] 《数字信号处理(第二版)》.丁玉美等 西安电子科技大学出版社 [2] 《数字信号处理及其MATLAB实现》,陈怀琛等译,电子工业出版社;
[3] 《MATLAB及在电子信息课程中的应用》,陈怀琛等,电子工业出版社
五、鸣谢
此次的课程社真心感谢那些为我们提供良好的上机环境已经良好的知道的老师们。同时也感谢中南大学给了我这一次检验自己的动手能力以及发现自己错误的机会!
第二篇:现代信号处理(信号分析)
(一).信号分析
1、编制信号生成程序,产生下述各序列,绘出它们的时域波形
1)单位抽样序列 (n)
2)矩形序列 RN(n)
3)三角波序列
n1,0n3x3(n)8n,4n7
0,其它
4)反三角波序列
4n,0n3x4(n)n3,4n7
0,其它
5)Gaussian序列
(np)
q,0n15x5(n)e
0,其它2
6)正弦序列
x6(n)sin16t
取 fs64Hz,N16
7)衰减正弦序列
(t)Aesin(2ft)u(t)对连续信号x70进行采样,可得到测试序列
x 7(n)Ae anTf 0 nT)sin(2u。令(n)A=50,采样周期T=1ms,即fs=1000Hz,f0=62.5,a=100。
2.对上述信号完成下列信号分析
1)对三角波序列x3(n)和反三角波序列x4(n),作N=8点的FFT,观察比较它们的幅频特
性,说明它们有什么异同?绘出两序列及其它们的幅频特性曲线。at在x3(n)和x4(n)的尾部补零,作N=16点的FFT,观察它们的幅频特性发生了什么变化?
分析说明原因。
2)、观察高斯序列x5(n),固定信号x5(n)中的参数p=8,令q分别等于2,4,8,观察它们的时域和幅频特性,了解当q取不同值时,对信号序列的时域幅频特性的影响;固定q=8,令p分别等于8,13,14,观察参数p变化对信号序列的时域及幅频特性的影响,观察p等于多少时,会发生明显的泄漏现象,混叠是否也随之出现?记录实验中观察到的现象,绘出相应的时域序列和幅频特性曲线。
3)对于正弦序列x4(n),取数据长度N分别等于8,16,32,分别作N点FFT,观察它们的的时域和幅频特性,说明它们的差别,简要说明原因。
4)、观察衰减正弦序列x7(n)的时域和幅频特性,绘出幅频特性曲线,改变采样频率fs,使
fs=300Hz,观察此时的频谱的形状和谱峰出现位置?说明产生现象的原因。
3.设有一连续时间信号s(t),其由20Hz、220Hz和750Hz的正弦信号叠加而成,分析确定采样频率及数据分析长度,计算并绘出信号的频谱,指出各个频率份量。
你们先自己看一下Matlab的书,对照书上的例题仿真一下,多练习。
先给出信号分析部分的题目给你们,你们可以先做做,最好使用GUI,将所有的部分集成在一起。滤波器部分的题目开学后再给你们,如果Matlab熟练了,那部分做起来很快的。
如果题目中的公式看不到的话,可能是公式编辑器的版本问题,我采用的是公式编辑器5.2
追求完美。他还告诫在场的师生:“每个清华人都负有责任,建设这个国家。为学,要扎扎实实,不可沽名钓誉。做事,要公正廉洁,不要落身后骂名。”
第三篇:数字图像处理课设报告
数字图像处理课程设计报告
细胞识别
目录
第一部分
1、实验课题名称--------------------3
2、实验目的--------------------------3
第 1 页
3、实验内容概要--------------------3 第二部分
1、建立工程文件--------------------3
2、图像信息获取--------------------4
3、如何建立下拉菜单--------------6
4、标记Mark点----------------------6
5、二值化9
6、填洞---9
7、收缩---10
8、获取中心点------------------------11
9、细胞计数---------------------------13
10、All-steps---------------------------13
11、扩展功能-------------------------14 第三部分
12、各步骤结果和错误举例------16 第四部分
13、心得体会--------------------------22
第一部分
1、实验课题:细胞识别
2、实验目的:对血液细胞切片图片进行各种处理,最终得出细胞的数目、面积等信息。
3、实验内容概要:基于VC++6.0软件下的细胞识别,通过细胞的标记、二
第 2 页 值化、填洞、收缩、获取中心点、计数等过程完成实验目的。
第二部分——实验具体步骤
1、建立工程文件
① 新建MFC工程项目:--MFC AppWizard、工程名
② 拷贝cdib.h,cdib.cpp到工程文件夹,再向工程里添加
③ doc.h添加变量:m_lpDib 和头文件#include”cdib.h”
④ doc.cpp:变量(m_lpDib)的new、delete
第 3 页
⑤ doc.cpp: Serialize()
2、图像信息获取
① 读取图像参数View.cpp: OnDraw()m_pDib->Draw()如果图像不为空的话,那么就执行如下主要代码:
② 点击键,建立类向导,在messages中添加OnInitialUpdate()函数,添加代码实现对自动打开固定图片。
③ 通过鼠标右击,点击建立类向导,在messages中添加OnMouseMove()函数,添加代码实现获取所要信息,即实现鼠标在图像任一位置移动时可以直观的读取相对应位置的信息。可以在屏幕上显示鼠标所指点的坐标以及RGB、HSI和灰度值,通过HSI的可以选取合适的阈值来找到细胞以及边界。
第 4 页 ④ 为了RGB图像转化为人眼更容易识别的HSI模型,我们可以通过添加成员函数RgbtoHsi来实现这一功能。
HSI模型与RGB模型的转化关系
(添加函数时,可以右击类窗口中的view.h,选中add member function,之后选择函数的返回值类型和函数描述,其它默认不变)
确定后在里面添加实现函数功能的代码。
3、添加下拉菜单
在resourceview那栏的找到菜单按键设置
第 5 页 双击,后在里面添加所需按键
每个按键的ID号为注意在填写为IDR_加菜单大写。
之后右击按键,建立类向导添加按键所需函数
4、标记mark 分为四步
1.找出mark(red)点和maybemark(blue)点
2.将maybemark(blue)点变成mark(black red)点
3.将mark(black red)点变成edge(yellow(fullred&&fullgreen))点 4.edge点滤波
基本思想:Mark点指的是我们要寻找的细胞内的点。我们先获取每一个像素点的RGB分量,然后我们将其转化成HSI分量,将H分量进行归一化,因为S的范围是0到1,所以我们要进行尺度的一致,这样才具有可计算性。然后我们通过每个像素点的H分量和S分量的值与细胞内部的H分量和S分量计算欧几里得距离,设定一个Mark门限值(我们这里将MarkDoor设置为0.09,大家可以行设置合适的参数),小于这个门限值我们就当做是细胞的内部,然后对细胞进行标记(Red)。还需要设定一个Maybe Mark门限值(我们这里将Maybe MarkDoor设置为0.15,大家可以行设置合适的参数),我们大于Mark门限值小于Maybe Mark门限值时,我们暂时看成是细胞,我们进行Maybe Mark的标记(Blue)。否则的话,我们需要考虑,一些不是Mark和Maybe Mark点的*lpSrc==0我们区别一下赋值为1,*lpSrc==255
第 6 页 我们区别一下赋值为254,*(lpSrc+1)==255我们区别一下赋值为254.这样的话,我们在后面判断是否为Mark点的时候,我们只需要判断*lpSrc是否为0就可以了,判断Maybe Mark点时只需要判断*(lpSrc)是否为255就可以了。对于边缘的判断只需要判断*(lpSrc+1)是否为255就可以了。
将细胞标记为Mark用红色(255,0,0)标记出来,将可能是的细胞标记为MayBe Mark用蓝色(0,0,255)标记出来。将MayBeMark To Mark的区域用亮红(128,0,0)表示,将不可能是细胞的区域、细胞边界分别用绿色标记出来。操作过程:(1)根据H、S的欧几里得距离sqrt(s2+h2)来大致的确定哪些是细胞(Mark)和可能是细胞(Maybe Mark)的点。
(2)根据Maybe Mark点周围的情况,如果它的上下左右四个方向有Mark点,则将Maybe Mark点变成Mark点。
(3)用Sobel算子来做边缘的提取边界(0,255,255)(255,255,0),使用3*3的模板,使用欧几里得距离来判断是否为边缘。
两种Sobel算子如下:
第 7 页
主要代码如下:
doubletmp1=pixel[0]+2*pixel[1]+pixel[2]-pixel[6]-2*pixel[7]-pixel[8];doubletmp2=pixel[0]+2*pixel[3]+pixel[6]-pixel[2]-2*pixel[5]-pixel[8];double edge=sqrt(tmp1*tmp1+tmp2*tmp2);
if(edge>edgeDoor)*(lpDst+1)=255;//Sobel判断该点是否edge//edgeDoor=40(4)edge滤波
就是去除全边缘点(四周都是背景或边缘)(强度为5)
5、二值化
基本思想:将原有彩色图像变换为二值图像,其中细胞0X80(128)用Gray(灰色)标记出来,边缘0xF0(240)用Bright(亮色)标记出来,其他表示为0。主要代码:
第 8 页
6、填洞
将细胞中或者细胞相邻的地方的较小的背景填成细胞的背景,填完的细胞背景的灰度值是129,因为都被访问过了,然后将边缘去掉。
填洞的基本思想:首先将细胞或边缘内的黑点置为vistied = 0x01,以该黑点为中心,在其上下左右侧进行访问是否有未访问的黑点,若有则将上方黑点压栈,且上下左右侧的黑点置已访问。将堆栈顶端的数据弹出,作为新的种子进行扩散,即以该元素为基点,判断其周围是否存在未访问黑点,若有则继续压栈,重复操作。直到找到最后一点,此点四周均不存在未访问黑点,结束访问。若洞像素数小于100大于50,洞内像素数及其初进栈的点(56,(409,222))时,则进行填洞。填洞的过程就是将非mark点转化为mark点。
主要标记访问代码:
填洞函数主要代码分析:
填完洞后,进行下面操作:
如果图像中只有已访问黑点0x01则将其恢复成0;如果图像中只有Edge点0xf0则将 Edge置为黑点。这样图像中只有黑色的背景以及灰色的细胞mark(0x80)点。
主要代码:
第 9 页
7、收缩
收缩的目的是为了方便计数。通过扫描图像,对图像进行预先的3次腐蚀,判断所生成边界点,然后根据原理判定是否标注该点,存放所标志的中心点,便于统计细胞个数及计算细胞半径。
由Mark生成边界,我们有四邻域生成边界和八邻域生成边界。判断该点是否为Mark点,如果是Mark点的话,我们判断i、j是否是我们选取图片的边界,如果是的话,我们将该点变成边缘点,否则我们判断它的上下左右(周围八个点)是否有非Mark点,如有有,则将这边变成边缘点,反之,不变。
8邻域收缩操作代码(4邻域与8邻域思想相同):
第 10 页
8、获取中心点
根据前面所作工作统计获得的中心点个数,去掉一系列不符合要求的点得出最终的细胞个数、细胞的平均半径和平均面积,用对话框输出统计结果。
操作过程如下:
① 首先我们要去除访问标志,是我们先前一次在判断是否需要保存点的时候(MarkIt(int i, int j)),我们将边缘点都标记成访问过了,这时在处理下一次遍历图片发现中心点的时候,我们要进行判断点是否要保存就没有办法做了,所以在没进行一次图片的遍历之前我们都需要去除访问标志。主要代码:*lpSrc&=NO_VISITED;//0xfe// 清除visited标志
最后位 置0操作
② 需要判断是否是边界以外的点,这里我们只处理边界内部的点,对于边界外部的点不加以查找中心点。对于内部的点,我们先要判断是否是孤立的边缘点,即判断该边缘点的上下左右四个点都不是Mark点和边缘点我们认为是孤立的边缘点,但是我们在这里也要去除半径不大于2的孤立点,因为我们认为它的半径太小,是噪声。如果是半径大于2的孤立点,我们对他进行标记成中心点,对半径做一点补偿(pt.radius=k+pre_shrink_count+4,4为补偿)。然后在入队。
主要代码如下:
{
第 11 页 if(k<3)// 如果进行第一次收缩即消失的点则认为该点是噪点,不进行保存直接进行下一次收缩
continue;
// 孤立的点
*lpSrc |=CENTERED;//0x2 对孤立点加上中心点标志0xf2//后面shrink时为0x02
// 保存一下CENTER_POINT信息(圆心,半径)
pt.x=i;pt.y=j;pt.radius=k + pre_shrink_count + 4;// +4放大补偿,k为把此圆收缩到一点所经历的收缩次数
points_temp.push_back(pt);continue;}
③ 需要判断是否需要保存该点,我们在判断它的上下左右是否有没有访问过的边缘点,这里我们运用递归函数来找相连通的边缘点,如果是全边缘点的时候我们就需要保存,即将m_bFullEdge=1。在保存的函数中我们将该点变成中心点,然后半径补偿然后我们来对该点入队(保存),然后将该点设置成没有访问过的点,因为下面在做该点的上下左右是否为访问过的,访问过才保存,因为这个点已经保存过了,所以要将保存过的点设置成没有访问过,我们必须将这点变成没有访问过。然后判断该点的周围八点是否是访问过的,如果访问过就保存该点,这里也是运用递归函数来实现的。
对中心点处理:
a)独立的中心点直接存储
b)相邻的中心点通过递归求质心作为圆心,最大半径作为新的半径,合并各中心为一点
主要代码如下:
pt.x=tot_x/tot_num;//质心 pt.y=tot_y/tot_num;pt.radius=max_radius;//取最大半径作为质点中心点半径 *(lpSrc-(pt.y-j)*lLineBytes+pt.x-i)|=CENTERED;//质点置为中心点 points.push_back(pt);c)相近但不相邻的点,求质心为圆心,最大半径为半径(直到无相近点)
主要代码如下:
if(abs(x0-x)+abs(y0-y)<10)// 相近
{
/*pt=points.at(j);if(points.at(i).radius
pt=points.at(i);*/ points.at(i).x=(x+x0)/2;//取均值,保存最大半径
第 12 页
points.at(i).y=(y+y0)/2;points.at(i).radius=max(points.at(i).radius,points.at(j).radius)+4;pt=pt=points.at(i);d)在无相近点的情况下,若半径小于8,则删除。
主要代码如下:
if(bdelete)
{
} e)两圆相交,若其中一圆非相交部分面积小于50%,则删除
主要代码如下:
if(total
9、细胞计数
打开我们处理前的图片,根据前面保存中心点的队列,我们知道中心点的位置和细胞的半径,然后我们重新的导入细胞的图片,在上面画圆,标出细胞。然后我们获取细胞内部的HSI的最大值和最小值,计算出细胞的平均面积和个数。主要代码如下:
msg.Format(“共有%d个细胞,平均半径%d,平均面积%d : H(%3.1f,%3.1f)S(%3.2f,%3.2f)I(%3.2f,%3.2f)”, m_vCenterPoints.size(),(int)(totr/m_vCenterPoints.size()+.5),(int)(tota/m_vCenterPoints.size()+.5), 360.0*min[0]/255.0,360.0*max[0]/255.0, 1.0*min[1]/255.0,1.0*max[1]/255.0, 1.0*min[2]/255.0,1.0*max[2]/255.0);
10、All-steps
第 13 页 可以一次性实现细胞识别的所有操作步骤
设置控制按键的权限,点击update_command_ui ,键入控制条件
每步操作时给cellprocess设置不同数值,表示那步进行过,只能进行规定的下步操作,从而在运行过程中放置按键误触导致程序崩溃。
11、扩展:
区域选择:
第 14 页
建立类向导:OnButtonDown 和OnButtonUp 键入代码:
在OnDraw中添加下列代码
注意:bool 变量m_bDrag要定义在view.cpp文件头部,定义在view.h会出现第一次区域选择时出现错误。
添加复位按键:
第 15 页
点击该键后会重新读取图像(和图像自动打开代码一样)
第三部分
12、各步骤结果和错误举例
① 各步骤结果图
a.Mark(Red)& MayBe Mark(Blue)
maybemark to mark(black red)第 16 页
edge information and edge filter
twovalue
fillholes 第 17 页
shrink
findcenter 第 18 页
count
出现的错误举例:
Mousemove 程序中出现问题: 1.错误:
没有加#include “MainFrm.h”头文件 2.错误
第 19 页
error C2248: 'm_wndStatusBar' : cannot access protected member declared in class 'CMainFrame'
需将protected: // control bar embedded members CStatusBar m_wndStatusBar;CToolBar
m_wndToolBar;
protected变为public 供用户操作使用
MouseMove函数中((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str);使str.Format中内容显示在标准窗口图像的左下方bar
3.MouseMove的坐标判决放在for循环外,鼠标移动到图像外,程序会崩溃。解决:改变坐标判决代码的位置
通见问题:
在ClassView中的类视图不见了,在FileView视图中该类的.h和.cpp文件仍然存在
解决方案:先保存workspace,然后关闭工程,删除此工程目录中的.ncb文件,重新打开workspace 原因:classview显示混乱 在类中添加的成员变量和成员函数不能显示出来,即使显示出来了变量或函数,双击后不能跳至正确的位置。
第 20 页
Edge information中出现问题
正常
不正常
memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);代码应放在图像处理前,参考图像是初始状态的图像,把第一步的四个小步骤分开写在不同的函数内时,因为每一小步的操作都会改变图像的状态,如果把: memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);写在maybemark_to_mark之后那么参考图像就不是原始图像
发现:做到shrink时,看到收缩后的图像效果很差,和标准收缩图像相差较大,经调试后发现问题(没注意 ppt最后一页有,老师在qq群在中也提到过)。
Shrink操作后,关闭图像,出现问题 GenEdge4()函数中出现问题 for(int j=0;j { lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-1; for(int i=0;i { lpSrc++;......和 for(int j=0;j for(int i=0;i { 第 21 页 lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-i;....for循环问题 有差异 后面起始点地址为dot1 前面起始点地址为 dot1+1,不处理四周边界 可以把第二个for循环语句中前面的i=0 改成i=1.观察图像,发现Shirnk后未保存填洞点,结果只有 0x00 0x80 0xf0 // *lpSrc &=NO_EDGE_POINT;//至关重要 少写后,程序一直崩溃。 这段代码在GenEdge函数中,在shrink步骤中没影响,但在找中心点过程中用到这个函数时,这段代码就十分必要。否则程序会在运行findcenter时直接崩溃。 中心点标志 0x02 不是0xf2 Temp.at(n).y 等同于 temp[n].y 13、心得体会 通过对本次数字图像处理课程设计的学习,进一步加深了对数图知识的理解,同时也基本掌握了VC++软件的使用方法。从一开始的连图像都无法打开,到最后在老师上课的资料以及同学的帮助和学长的参考程序下终于完成了一幅细胞图像的整个识别过程。自己一向在编程方面有所欠缺,通过咨询老师和同学还有百度,自己也慢慢理解了所写程序代码的含义,间接地提高了自己写代码与识别代码的能力。 通过一个星期多的学习,我对细胞识别的基本思想有了深一步的理解,也让我对c语言相关的知识得到了回顾。此次课程设计给我们提供了一个既能学习又能锻炼的机会,使我们养成了查找资料(主要是在百度上查阅一些代码的含义)的习惯,将理论与实际相结合起来,锻炼了分析问题和实际解决问题的能力。提高了适应能力,为今后的学习和实践打下了基础。 第 22 页 目录 一、课程设计目的要求 ………………………………………… 1 二、课程设计选题 ……………………………………………… 1 三、程序分析及运行果 ………………………………………… 1、第一题 …………………………………………………… 2、第三题 …………………………………………………… 3、第五题 …………………………………………………… 4、第七题 …………………………………………………… 四、课程设计总结 ……………………………………………… 参考文献 ………………………………………………………… 附.程序源代码 …………………………………………………… 2 4 6 9 12 13 14 一、课程设计目的要求 1.全面复习课程所学理论知识,巩固所学知识重点和难点,将理论与实践很好地结合起来。 2.提高综合运用所学知识独立分析和解决问题的能力; 3.熟练使用一种高级语言进行编程实现。 二、课程设计选题 本次课程设计,按任务书要求选择了1、3、5、7题,第8题为选作,因为能力有限,所以并未选择,现将题目及要求摘录如下: 1.给定模拟信号:xa(t)Aeatsin(0t)u(t),式中A444.128,502,0502 rad/s。对xa(t)进行采样,可得采样序列 x(n)xa(nT)AeanTsin(0nT)u(nT)1)选择采样频率fs=1 kHz,观测时间Tp50ms,观测所得序列x(n)及其幅频特性|X(ejw)| 2)改变采样频率fs=300Hz,观测此时|X(ejw)|的变化 3)令采样频率fs=200Hz,观测此时|X(ejw)|的变化 要求分析说明原理,绘出相应的序列及其它们对应的幅频特性曲线,指出|X(ejw)|的变化,说明为什么? 3.一个连续信号含两个频率分量,经采样得 x(n)=sin2π*0.125n+cos2π*(0.125+Δf)n n=0,1……,N-1 已知N=16,Δf分别为1/16和1/64,观察其幅频特性;当N=128时,Δf不变,其结果有何不同,为什么?分析说明原因,并打印出相应的幅频特性曲线 119n)cos(n),使用FFT分析其频谱: 5.一个序列为x(n)0.5cos(20201)使用不同宽度的矩形窗截短该序列为M点长度,取M分别为: a)M=20 b)M=40 c)M=160 ;观察不同长度的窗对谱分析结果的影响; 2)使用汉宁窗、哈明窗重做1) 3)对三种窗的结果进行理论分析及比较。并绘出相应的幅频特性曲线 7.FIR DF的设计 分别利用矩形窗、汉宁窗、哈明窗设计一个N=11的线性相位FIR 低通和高通数字滤波器,截止频率c3rad,要求:求出各滤波器的单位脉冲响应h(n);绘出各滤波器的幅频及相频响应曲线;观察各滤波器的通带波纹和阻带波纹;比较不同窗函数对滤波特性的影响。 三、程序分析及运行结果 程序综述及GUI界面:程序全部利用matlab语言写成,通过与GUI模块的按钮控件pushbutton链接,使之能够通过按动按钮跳出显示窗口来实现程序的运行以及最后结果的呈现,简洁明了。程序最终的GUI界面如下图所示: 1、第一题: 设计思想:此程序按第一题题目要求,预先给定了模拟信号at(t)Aesin(0t)u(t),同时给出了相关参数,A444.128,502,xa0502按照题目要求直接在程序中定义相关变量并赋值。题目还rad/s。要求采取三种不同的采样频率分别为1kHZ、300HZ和200HZ,所以T1=0.001,T2=1/300,T3=0.005。Fft函数对序列进行傅立叶变换,得到幅频特性曲线。程序通过subplot、stem、plot等函数将结果显示在弹出的窗口中。这样第一题的要求就基本实现了。程序代码: A=444.128;%设定参数 w=50*sqrt(2)*pi;a=50*sqrt(2)*pi;T1=0.001;N1=50;n=0:49;x1=A*exp(-a*n*T1).*sin(w*n*T1);%所给信号 figure;subplot(3,2,1);stem(x1,'.');%坐标函数及现实函数 xlabel('n');ylabel('x(n)');title('x(n)序列1');y1=fft(x1,N1);%傅立叶变换 subplot(3,2,2);plot(abs(y1));xlabel('(N=50 wk=2pik/N)k');ylabel('|X1(jw)|');title('幅频特性|X1(jw)|'); T2=1/300;N2=15;n=0:14 x2=A*exp(-a*n*T2).*sin(w*n*T2);subplot(3,2,3);stem(x2,'.');xlabel('n');ylabel('x(n)');title('x(n)序列2');y2=fft(x2,N2);subplot(3,2,4);plot(abs(y2));xlabel('(N=15 wk=2pik/N)k');ylabel('|X2(jw)|');title('幅频特性|X2(jw)|');T3=0.005;N3=10;n=0:9;x3=A*exp(-a*n*T3).*sin(w*n*T3);subplot(3,2,5);stem(x3,'.');xlabel('n');ylabel('x(n)');title('x(n)序列3');y3=fft(x3,N3);subplot(3,2,6);plot(abs(y3));xlabel('(N=10 wk=2pik/N)k');ylabel('|X3(jw)|');title('幅频特性|X3(jw)|'); 运行结果: 结果分析:从运行结果看,随着采样频率的减少,幅频特性的失真越明显。所以采样频率越低,越容易失真。 2、第三题: 设计思想:用FFT进行谱分析时,首先必须对信号进行采样,使之变成离散信号,然后就可按照前面的方法用FFT来对连续信号进行谱分析。按采样定理,采样频率fs应大于2倍信号的最高频率,为了满足采样定理,一般在采样之前要设置一个抗混叠低通滤波器。 按题目要求,讲程序分为N=16和N=128两部分。首先定义出N、f1、f2等参数,接着列出题目所要求的信号,然后利用傅立叶变换函数,最后通过坐标以及输出函数得出相应幅频特性曲线。程序代码: %第三题(N=16)N=16;n=0:15;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y1=fft(x1,16);%傅立叶变换函数 figure; subplot(2,2,1);stem(n,abs(y1),'.'); axis([0 15 0 8]);%标注坐标长度 xlabel('(N=16 wk=2pik/N)k');ylabel('|X1(K)|'); title('幅频特性|X1(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y2=fft(x2,16); subplot(2,2,2);stem(n,abs(y2),'.');axis([0 15 0 8]); xlabel('(N=16 wk=2pik/N)k');ylabel('|X2(K)|');title('幅频特性|X2(K)|');%第三题(N=128)N=128;n=0:127;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y3=fft(x1,128);figure; subplot(2,2,1);stem(n,abs(y3),'.');axis([0 127 0 65]); xlabel('(N=128 wk=2pik/N)k');ylabel('|X3(K)|');title('幅频特性|X3(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y4=fft(x2,128); subplot(2,2,2);stem(n,abs(y4),'.');axis([0 127 0 65]); xlabel('(N=128 wk=2pik/N)k');ylabel('|X4(K)|');title('幅频特性|X4(K)|'); 运行结果: N=16: N=128: 结果分析:由实验运行结果可得出当采样点数N不同时,信号的幅频特性是不同的,这是因为X(k)是x(n)的傅里叶变换X(ejw)在频率区间[0,2π]上的N点等间隔采样,这就是DFT的物理意义,由此可见,DFT的变换长度N不同,表示对X(ejw)在[0,2π]区间上的采样间隔和采样点数不同,所以DFT的变换结果不同。 3、第五题: 设计思想:本题给定了一个序列,要求用窗函数截短。通过调整窗口长度可以有效的控制过渡段的宽度。其中题目中要求的汉宁窗是升余弦窗,能够使能量更集中在主瓣中;哈明窗是改进的升余弦窗,能使能量更加集中在主瓣中。本程序定义了窗长度,给出相应的序列之后,用窗函数去截短相应的长度,最后通过窗口输出截短后的序列。程序代码: %第五题(矩形窗) M1=20;M2=40;M3=160;%定义窗长度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);%相应序列 x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);b1=boxcar(M1)'.*x1;%用窗函数截短 b2=boxcar(M2)'.*x2;b3=boxcar(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(b1)),'.');subplot(3,1,2);stem(abs(fft(b2)),'.');subplot(3,1,3);stem(abs(fft(b3)),'.');%第五题(汉宁窗) M1=20;M2=40;M3=160;%定义窗长度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20); x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);y1=hanning(M1)'.*x1;%窗函数截短 y2=hanning(M2)'.*x2;y3=hanning(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(y1)),'.');subplot(3,1,2);stem(abs(fft(y2)),'.');subplot(3,1,3);stem(abs(fft(y3)),'.');%第五题(哈明窗) M1=20;M2=40;M3=160;%定义窗长度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);h1=hamming(M1)'.*x1;%窗函数截短 h2=hamming(M2)'.*x2;h3=hamming(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(h1)),'.');subplot(3,1,2);stem(abs(fft(h2)),'.');subplot(3,1,3);stem(abs(fft(h3)),'.'); 运行结果: 矩形窗: 汉宁窗: 哈明窗: 结果分析:信号的截短产生了能量泄漏,不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样,用FFT算法计算频谱又产生了栅栏效应,所以不同的窗函数对信号频谱的影响是不一样的。从运行结果中可以看出矩形窗主瓣比较集中,旁瓣较高,并有负旁瓣;汉宁窗和哈明窗结果从图上粗看基本一样,但哈明窗加权的系数能使旁瓣达到更小。 4、第七题: 设计思想: 题目要求分别利用矩形窗、汉宁窗、哈明窗设计一个N=11的线性相位FIR 低通和高通数字滤波器。FIR滤波器在保证幅度特性满足技术要求的同时,很容易做到有严格的线性相位特性。FIR滤波器设计的任务是选择有限长度的h(n),使传输函数H(ejw)满足技术要求。本题中要求设计的线性相位FIR滤波器的,可利y用fir1函数设计出滤波器,再利用freqz函数得出其频率响应。程序代码: %第七题(矩形窗)N=10;wn=1/3;b1lp=fir1(N,wn,boxcar(N+1));%用fir1函数设计低通滤波器 b1hp=fir1(N,wn,'high',boxcar(N+1));%用fir1函数设计高通滤波器 M=1024;w=0:(M-1);t=0:10; h1lp=freqz(b1lp,1,w/M*2*pi);%得出频率响应 h1hp=freqz(b1hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b1lp,'.');subplot(3,2,2);stem(t,b1hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h1lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h1hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h1lp));subplot(3,2,6); plot(w/M*2,angle(h1hp));%第七题(汉宁窗)N=10;wn=1/3; b2lp=fir1(N,wn,hanning(N+1)); b2hp=fir1(N,wn,'high',hanning(N+1));M=1024; w=0:(M-1);t=0:10; h2lp=freqz(b2lp,1,w/M*2*pi);h2hp=freqz(b2hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b2lp,'.');subplot(3,2,2);stem(t,b2hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h2lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h2hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h2lp));subplot(3,2,6); plot(w/M*2,angle(h2hp)); %第七题(哈明窗)N=10;wn=1/3; b3lp=fir1(N,wn,hamming(N+1)); b3hp=fir1(N,wn,'high',hamming(N+1));M=1024;w=0:(M-1);t=0:10; h3lp=freqz(b3lp,1,w/M*2*pi);h3hp=freqz(b3hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b3lp,'.');subplot(3,2,2);stem(t,b3hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h3lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h3hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h3lp));subplot(3,2,6); plot(w/M*2,angle(h3hp)); 运行结果: 矩形窗: 汉宁窗: 哈明窗: 结果分析:如运行结果所示,通过三个窗口设计出的滤波器,得到的频率响应特性是不同的。此题再次验证了第五题的结论:矩形窗主瓣比较集中,旁瓣较高,并有负旁瓣;汉宁窗和哈明窗都有使能量集中在主瓣中的作用,但哈明窗加权的系数能使旁瓣达到更小。 四、课程设计总结: 随着课程设计报告的基本完成,本次课程设计终于接近了尾声。本次课程设计要求我们利用上学期所学的现代信号处理课程的知识结合MATLAB编程工具,完成几道信号处理以及滤波器设计的题目,通过实际操作,回顾所学内容,夯实基础,强化理论知识,并体验理论与实际相结合的过程。 设计过程中遇到的第一个问题便是对于MATLAB语言的不熟悉,其实现在想想这个本不应该成为问题。虽然本专业并没有开设MATLAB程序设计这门课,但是在上学期上现代信号处理课时老师已经向我们强调过MATLAB语言的重要性,并且也在课堂上通过PPT的形式向我们展示了其部分功能。同时,老师还在上学期结课时特别提醒过课程设计会用到MATLAB语言,要求我们在暑假里去熟悉它。可惜的是,老师的的话并没有引起我的足够重视,才导致等到要真正设计的时候一头雾水,无从下手。通过这件事,我明白了对于一件事情,想要做得很好,提前做功课和准备是必不可少的,机会只垂青有准备的人。 当然,通过本次课程设计,我还是基本熟悉了一些MATLAB模块以及与本课程有关的一些函数的用法。但是由于上学期先代信号处理课程学得不是很好,所以也就是在懂的同学的指导下按部就班的写了一些代码,也没有什么创新,但还是很好的回顾的所学的频谱分析以、傅立叶变换以及滤波器设计的内容。也实际设计了一个滤波器,虽然借助与MATLAB函数,但也算一个不错的结果。老师在任务书中提到的目的要求,我自认为多多少少完成到达了一些。但不可否认的是还有很多没有达到。总之,很多东西还是需要自己在不断的摸索中找到答案。 另外,通过这次课程设计让我认识了一门新的语言———MATLAB,它在以后的学习中还会用到,相信在以后学习的过程的中,我会比较好的掌握并运用它。 参考文献 1、《数字信号处理》第二版,丁玉美 高西全等,西安电子科技大学出版社,2001.1 2、《MATLAB及在电子信息课程中的应用》,陈怀琛等,电子工业出版社出版,2002.4 3、《MATLAB数字信号处理与应用》,张德丰等,清华大学出版社,2010 4、《MATLAB数字信号处理》,王彬等,机械工业出版社,2010 5、《信号与信息处理基础》,彭军 李宏等,中国铁道出版社,2009.2 附.程序源代码 function varargout = untitled(varargin)%UNTITLED M-file for untitled.fig % UNTITLED, by itself, creates a new UNTITLED or raises the existing % singleton*.% % H = UNTITLED returns the handle to a new UNTITLED or the handle to % the existing singleton*.% % UNTITLED('Property','Value',...)creates a new UNTITLED using the % given property value pairs.Unrecognized properties are passed via % varargin to untitled_OpeningFcn.This calling syntax produces a % warning when there is an existing singleton*.% % UNTITLED('CALLBACK')and UNTITLED('CALLBACK',hObject,...)call the % local function named CALLBACK in UNTITLED.M with the given input % arguments.% % *See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one % instance to run(singleton)”.% % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help untitled % Last Modified by GUIDE v2.5 21-Oct-2011 14:29:04 % Begin initialization codeDO NOT EDIT %---Executes just before untitled is made visible.function untitled_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; %---Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第三题(N=16)N=16;n=0:15;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y1=fft(x1,16);%傅立叶变换函数 figure; subplot(2,2,1);stem(n,abs(y1),'.');axis([0 15 0 8]);%标注坐标长度 xlabel('(N=16 wk=2pik/N)k');ylabel('|X1(K)|');title('幅频特性|X1(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y2=fft(x2,16); subplot(2,2,2);stem(n,abs(y2),'.');axis([0 15 0 8]); xlabel('(N=16 wk=2pik/N)k');ylabel('|X2(K)|');title('幅频特性|X2(K)|'); %---Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第五题(矩形窗) M1=20;M2=40;M3=160;%定义窗长度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);%相应序列 x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);b1=boxcar(M1)'.*x1;%用窗函数截短 b2=boxcar(M2)'.*x2;b3=boxcar(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(b1)),'.');subplot(3,1,2);stem(abs(fft(b2)),'.');subplot(3,1,3);stem(abs(fft(b3)),'.'); %---Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5(see GCBO) % eventdata reservedto be defined in a future version of MATLAB% handles structure with handles and user data(see GUIDATA) %第五题(哈明窗) M1=20;M2=40;M3=160;%定义窗长度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);h1=hamming(M1)'.*x1;%窗函数截短 h2=hamming(M2)'.*x2;h3=hamming(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(h1)),'.');subplot(3,1,2);stem(abs(fft(h2)),'.');subplot(3,1,3);stem(abs(fft(h3)),'.'); %---Executes on button press in pushbutton7.function pushbutton7_Callback(hObject, eventdata, handles) % hObject handle to pushbutton7(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第七题(矩形窗)N=10;wn=1/3; b1lp=fir1(N,wn,boxcar(N+1));%用fir1函数设计低通滤波器 b1hp=fir1(N,wn,'high',boxcar(N+1));%用fir1函数设计高通滤波器 M=1024;w=0:(M-1);t=0:10; h1lp=freqz(b1lp,1,w/M*2*pi);%得出频率响应 h1hp=freqz(b1hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b1lp,'.');subplot(3,2,2);stem(t,b1hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h1lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h1hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h1lp));subplot(3,2,6); plot(w/M*2,angle(h1hp)); %---Executes on button press in pushbutton9.function pushbutton9_Callback(hObject, eventdata, handles)% hObject handle to pushbutton9(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第七题(哈明窗)N=10;wn=1/3; b3lp=fir1(N,wn,hamming(N+1)); b3hp=fir1(N,wn,'high',hamming(N+1));M=1024;w=0:(M-1);t=0:10; h3lp=freqz(b3lp,1,w/M*2*pi);h3hp=freqz(b3hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b3lp,'.');subplot(3,2,2);stem(t,b3hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h3lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h3hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h3lp));subplot(3,2,6); plot(w/M*2,angle(h3hp)); 信息科学与工程学院 数字信号处理课程设计实验报告 课题名称: 简单信号滤波演示系统 学生姓名: 学 号: 专业班级: 指导老师: 实验时间: 2014.10.8 目 录 第一章 概述.................................3 第二章 第三章 第四章第五章第六章 1.1 FIR、IIR概述.................................3 1.2题目要求......................................3 设计分析.............................5 2.1算法分析......................................5 2.2 在matlab中实现的分析........................6 程序实现.......................8 3.1 程序主体介绍..................................8 3.2 子程序........................................9 3.3 程序调试及运行结果............................9 3.4 结果分析及问题分析...........................16 心得体会............................17 参考文献............................18 源代码..............................19 MATLAB 第一章 概述 1.1 FIR、IIR概述 数字滤波器是指输入输出均为数字信号,通过一定的运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分的器件。数字滤波器与模拟滤波器相比数字滤波器具有精度高、稳定、体积小、重量小、灵活等特点。主要分为两种:有限脉冲响应FIR和无限脉冲响应IIR。设计滤波器的主要要求有两种,一是幅频特性,一是相频特性。一般的滤波器主要是对幅频特性作出要求,如果对输出相频特性也有要求,就需要用到线性相位滤波器。IIR滤波器的设计主要有两类,一是借助于模拟滤波器设计进行,二是直接在频域或时域中进行设计。FIR滤波器的设计不能借助于模拟滤波器,也有两类设计方法,一是窗函数法,二是频率采样法。还有一种比较有效的方法是切比雪夫等波纹逼近法,需通过计算机辅助进行。 1.2题目要求 设计一个工作流程如图所示的信号滤波演示系统: 图2 滤波演示图 ⑴ 信号发生器—根据信号选择分为两大类: ① 静态型:直接输入(或从文件读取)测试信号序列; ② 动态型:输入由多个不同频率正弦信号叠加组合而成的模拟信号公式 100sin(2f1t)100sin(2f2t)...100sin(2fnt)采样频率(Hz)以及采样点数,动态生成该信号的采样序列,作为测试信号。 ⑵ 频谱分析—使用FFT 对产生的测试信号进行频谱分析并展示其幅频、相频特 性,指定需要滤除或保留的频带,通过选择滤波器类型(IIR/FIR),确定对 应的滤波器(低通、高通、带通、带阻)技术指标。 ⑶ 滤波器设计—根据IIR/FIR 数字滤波器技术指标设计滤波器,生成相应的滤 波器系数,并展示对应的滤波器幅频(衰减)、相频特性。 ① IIR DF 设计:使用双线性变换法,可选择滤波器基型(巴特沃斯或切比雪夫型); ② FIR DF 设计:使用窗口法,可选择窗口类型。 ⑷ 数字滤波—根据设计的滤波器系数,对测试信号进行滤波。 ① IIR DF:要求通过差分方程迭代实现滤波,未知初值置零处理; ② FIR DF:要求通过快速卷积实现滤波。可以选择使用重叠相加或重叠保留法进行卷积运算,并动态展示卷积运算的详细过程。 ⑸ 输出信号分析—展示滤波后信号的幅频与相频特性,分析是否满足滤波要求。 对同一滤波要求,根据输出信号频谱,对比分析各类滤波器的差异。选做部分 将一段语音作为测试信号,通过频谱展示和语音播放,对比分析滤波前后语音信号的变化,进一步加深对数字信号处理的理解。 第二章 设计分析 2.1算法分析 此题目的实现可分为三个某块的设计实现:输入信号模块,设计滤波器模块,滤波模块。 首先明确各模块间的数据依赖关系:在输入信号模块得到信号后,对信号 进行频域分析,从而确定滤波器的相关技术指标,根据滤波器的技术指标与类型,在滤波器设计模块完成滤波器的设计,然后将滤波器的设计结果传递给滤波模块,滤波模块同时接收输入信号,从而通过运算,实现信号的滤波处理。从数据传递关系上分析,滤波模块的实现依赖于其他模块的数据输出,因此放在最后设计。先设计输入模块。 因为此设计相对复杂,分模块设计,通过参数传递和接口实现分模块设计即检验,提高程序的稳定性与健壮性。 输入的实现可以有两种方式:静态输入和动态输入。静态输入选择从文本输入数据,将信号取样值以矩阵的形式存放在文本中。采用文件的读取就可以实现,比较容易。动态输入,即输入由一系列频率的正弦信号相加的组成的信号,需要经过采样的,注意在设置采样频率时一定要符合奈奎斯特准则,提高采样点数,增加频谱分辨率。最后输出一采样信号向量,传递给其余两模块。 滤波器的设计,通过输入信号的频谱分析,设置滤波器的参数,然后才可以设计滤波器。第一步需要总结设计滤波器需要哪些参数,通过学习可以总结,所有滤波器的参数有四个:通带截止频率、阻带截止频率、通带最大衰减、阻带最小衰减。 对滤波器的设计分两类:FIR和IIR,二则所需的函数及设计方法不同。IIR采用借助于模拟滤波器的方式,包括巴特沃斯滤波器和切比雪夫滤波器两种类型。FIR采用窗函数方式,有矩形窗、三角窗、汉明窗、汉宁窗、布莱克曼和凯塞窗。通过调用不同的函数来实现滤波器的设计。特别在实现窗函数滤波器时,各个函数的主要区别是不同的频率采样,可以通过选择结构实现,简化程序。通过滤波器的设计最后可以得到滤波器的系统函数H(z)的系数。分析滤波器的幅频特性和相频特性,如果不符合要求重新设定滤波器参数或者换成其他滤波器类型。如果性能符合要求,则将系数传递给滤波模块。滤波模块不调用滤波函数,实现滤波功能根据滤波器类型的不同,有两种方式可以选择,一种是通过差分方程运算,一种是通过线性卷积运算。前者适合对IIR滤波器进行滤波,后者适合对FIR滤波器进行滤波。且线性卷积为实现对长序列的卷积运算,采用重叠相加法,采用动态变化展示运算过程。 2.2 在matlab中实现的分析 输入模块通过读取文件和直接输入数据运算可以很容易实现。在输入信号确定后,要对其进行频谱分析,从而确定滤波器的参数和类型(低通、高通、带通、带阻),此模块作用也就完成,将数据分别用全局变量传递给下面的模块。 设置模拟信号: 我采用的测试信号是两个正弦信号叠加而成的信号,信号为 y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)其中频率f1=30;频率f2=50;频率f3=200;采样频率fs=3000;采样间隔 Ts=1/fs;采样点数 N=1024;n=1:N 采集模拟信号的程序代码: f1=30;% 频率1 f2=50;% 频率2 f3=200;% 频率3 fs=3000;% 采样频率 Ts=1/fs;% 采样间隔 N=1024;% 采样点数 n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)+sin(2*pi*f1*n*Ts);% 正弦波混合 频谱分析: 使用FFT对产生的测试信号进行频谱分析并展示其幅频特性与相频特性,指定需要滤除的频带,通过选择滤波器类型IIR,确定对应的滤波器(低通、高通)技术指标Fp、Fc、Rp、Rs。 滤波器的设计: 根据以上技术指标(通带截止频率、通带最大衰减、阻带截止频率、阻带最 小衰减),设计数字滤波器,生成相应的滤波器系数,并画出对应的滤波器 幅频特性与相频特性。分别设计巴特沃斯滤波器、切比雪夫I型滤波器、切 比雪夫II型滤波器、椭圆滤波器、yulewalk滤波器。 巴特沃斯和切比雪夫的滤波函数调用为: [N,Wc]=buttord(wp,ws,rp,rs);[N,Wc]=cheb1ord(wp,ws,rp,rs);[B,A]=butter(N,Wc,’property’);[B,A]=cheby1(N,rp,Wc,’property’); property对于低通和高通为’’,带通’high’,带阻’stop’;窗函数滤波器设计的调用函数: 求窗函数的阶数: N=ceil((h*pi)/wdel);%wdel为窗函数的过渡带宽,h对应不同窗函数的值 wn=boxcar(N+1);wn=triang(N+1);wn=hanning(N+1);wn=hamming(N+1);wn=blackman(N+1);wn=kaiser(N+1,beta);%bata为kaiser的a参数 B=fir1(N,ws,'property',wn);property对于低通和高通为’’,带通’high’,带阻’stop’; 数字滤波: 根据设计的滤波器系数,对测试信号通过差分方程迭代实现滤波数字滤波,展示滤波后信号的幅频特性与相频特性,分析是否满足滤波要求(对同一滤波要求,对比分析各类滤波器的差异)。 需要注意的是,窗函数对滤波参数的使用,需要通过运算得到一窗函数阶数,对通带最大衰减无使用。需要注意FIR和IIR对参数的不同利用。 滤波模块:运用差分方程运算的滤波函数,可以用循环调用简单实现。动态展示线性卷积的重叠相加法可以用流程图来说明: 第三章 MATLAB程序实现 3.1 程序主体介绍 此程序界面也是采用GUI,不过是采用图形用户界面开发环境。和第一个对比,布局更加容易,很容易调整界面。但是在一些函数操作行会受一些限制,比如函数参数的传递,目前来说还是采用全局变量才能完成。 pushbutton1_Callback(hObject, eventdata, handles)%获得输入信号 uipanel11_SelectionChangeFcn(hObject, eventdata, handles)%获取滤波器的设计参数 uipanel15_SelectionChangeFcn(hObject, eventdata, handles)%设计滤波器 pushbutton4_Callback(hObject, eventdata, handles)%进行滤波 以上是一些功能控件,需要注意的是他们的view ballcak属性,对于groupbutton一组按钮,需要选用SelectionChangeFcn,其余选择callback属性即可。另外,handles函数作用为传递的句柄,是一结构体,调用时注意此处。其余和直接用函数创建GUI界面无太大区别。 3.2 子程序 3.2.1 IIR滤波器 FIR滤波器 巴特沃斯滤波器 3.2.2 矩形窗 三角窗 汉宁窗 哈明窗 3.3 程序调试及运行结果 原始信号幅频特性及相频特性 巴特沃斯的幅频特性及相频特性 信号滤波后的幅频特性及相频特性 矩形窗的幅频特性及相频特性 信号滤波后的幅频特性及相频特性 三角窗的幅频特性及相频特性 信号滤波后的幅频特性及相频特性 汉宁窗的幅频特性及相频特性 信号滤波后的幅频特性及相频特性 哈明窗的幅频特性及相频特性 信号滤波后的幅频特性及相频特性 3.4 结果分析及问题分析 用双线性变换法设计无限脉冲响应数字滤波器(IIF DF)时,先把数字滤波器指标转换成模拟滤波器的指标,然后根据模拟滤波器的指标设计模拟滤波器,再经过线性变换把模拟滤波器转换成数字滤波器。该系统要能够设计巴特沃兹型低通、带通、高通滤波器,并能够输入数字滤波器的性能指标,显示出滤波器的阶数和系数。该系统的关键部分是滤波器的设计部分,按照双线性变换法设计滤波器的步骤进行设计即可。 第四章 心得体会 本次课程设计可以称为matlab和数字信号处理的综合设计,因为这次有一半的时间在研究matlab,有一半的时间在思考数字信号问题的解决。几天下来收获是很多的,对数字信号处理有了一次全面的回顾,而且也看到了matlab的神秘面容。只要是自己真正的努力去做了,就绝对不会后悔在课程设计上花费的时间。现在发现自己确实会的太少,而这次又学了太多,对自己以后的学习还是有鞭策意义的。 这次课程设计也使我认识到了matlab的强大,或者进一步说工具软件有着你意想不到的功效,能节省你的时间,同时又能够让你从实践上更深层次的认识到所学知识的奇妙,而且可以同时明白了学习与实践的相辅相成。对课程设计也是一直保持很高兴趣的,虽然有时为它焦头烂额,但是也会因此有柳暗花明的喜悦,任何事情都折射着一个普通的道理——付出才有回报。浅显的道理,却是需要我们用毅力来坚持见证的。 具体来说,通过本次课程设计,我掌握了MATLAB的基本运用,尤其是其中GUI可视化图形用户界面的设计,包括函数调用与在图形用户界面开发环境下的调用。函数的调用与参数的传递是两个简单却很容易出错的地方,自由细心才可以保证程序的健壮性。 对数字信号本身内容的理解来说,全书的内容确实是可以融合在这两个课程设计题目中的,一个是DFT运用,另一个是滤波器的设计和利用。对全书的内容可以做出最好的概括。其中滤波器的设计中,调用了许多滤波函数,这是本次实验有点欠缺的地方,但是仍然从整体上把握了整个滤波器的设计过程。 对于课程设计中出现的问题,解决的方式有两种,一是自己解决。可以上网,查阅图书和matlab的本身的帮助文件,不断尝试,自己修改错误,可以更好的反省。二是与同学相商。一加一不是等于二那么简单的,相互交流才是进步的最好方式。其中解决问题最重要的应该是坚持不懈,在遇到问题时,不放弃才有可能称为最后的胜利者。 每次课程设计都收获颇多,而且每次都对自己的学习态度做一次调整,这个的作用确实是很大的,希望以后更加珍惜的课程设计的时间。 第五章 参考文献 [1] 丁玉美等.数字信号处理 [M].西安:西安电子科技大学出版社,2002 [2] 程佩青.数字信号处理教程,第二版[M].北京:清华大学出版社,2001 [3] 赵树杰等.数字信号处理[M].西安:西安电子科技大学出版社,1997 [4] 陈怀琛等.MATLAB 及在电子信息课程中的应用[M],北京:电子工业出版社出 版,2002 [5] 余成波.数字信号处理及MATLAB实现,第一版[M].北京:清华大学出版社,2008 [6] S.K.Mitra.Digital Signal Processing: A Computer Based Approach, 3rdEdition[M],New York, USA:McGraw-Hill,2000 [7] R.G.Lyons.Understanding Digital Signal Processing,2nd Edition[M].New Jersey, USA:Prentice Hall,2005 第六章 源代码 function varargout = df(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename,...'gui_Singleton', gui_Singleton,...'gui_OpeningFcn', @df_OpeningFcn,...'gui_OutputFcn', @df_OutputFcn,...'gui_LayoutFcn', [] ,...'gui_Callback', []);if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end function df_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = df_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function edit1_Callback(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit2_Callback(hObject, eventdata, handles) function edit2_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit3_Callback(hObject, eventdata, handles) function edit3_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit4_Callback(hObject, eventdata, handles) function edit4_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit5_Callback(hObject, eventdata, handles) function edit5_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton1_Callback(hObject, eventdata, handles)f=zeros(1,4); f(1)=str2num(get(handles.edit2,'String'));f(2)=str2num(get(handles.edit1,'String'));f(3)=str2num(get(handles.edit3,'String'));f(4)=str2num(get(handles.edit4,'String')); T=str2num(get(handles.edit12,'String'));%采样周期% fre=str2num(get(handles.edit5,'String'));%采样频率% t=0:1/fre:T; xn=10*sin(2*pi*t*f(1))+10*sin(2*pi*t*f(2))+10*sin(2*pi*t*f(3))+10*sin(2*pi*t*f(4)); set(handles.axes15,'userdata',xn);%将Xn放在用户数据userdata% yn3=abs(fft(xn));%快速傅立叶变换(符频特性)% n1=[0:length(yn3)-1]/length(yn3)*fre;%横坐标% axes(handles.axes12);%坐标系编号% stem(n1,yn3,'.'); axis([0,fre/2,0,max(yn3)]);%坐标轴单位控制% title('信号的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|'); yn4=angle(fft(xn));%相频特性% n4=[0:length(yn4)-1]/length(yn4)*fre;axes(handles.axes16);stem(n4,yn4,'.'); axis([0,fre/2,min(yn4),max(yn4)]);title('信号的相频特性');xlabel('频率(Hz)');ylabel('相位'); function edit6_Callback(hObject, eventdata, handles) function edit6_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit7_Callback(hObject, eventdata, handles) function edit7_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit8_Callback(hObject, eventdata, handles) function edit8_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit9_Callback(hObject, eventdata, handles) function edit9_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton2_Callback(hObject, eventdata, handles)xn=get(handles.axes15,'userdata');fre=str2num(get(handles.edit5,'String')); fp=str2num(get(handles.edit6,'String'));%通带最大频率 % fs=str2num(get(handles.edit7,'String'));%阻带最小频率% rp=str2num(get(handles.edit8,'String'));rs=str2num(get(handles.edit9,'String'));wp=2*fp/fre;ws=2*fs/fre; [N,wc]=buttord(wp,ws,rp,rs,'s');%求阶数,截止频率% [B,A]=butter(N,wc,'s');%巴特沃兹模拟低通滤波器系数% [Bz,Az]=bilinear(B,A,1); [H,w]=freqz(Bz,Az);%分析数字滤波器% axes(handles.axes14);plot(w/pi,abs(H)); axis([0,1,0,max(abs(H))]);title('巴特沃兹的幅频特性');xlabel('w/π'); ylabel('|X(ejw)|');axes(handles.axes17);plot(w/pi,angle(H));title('巴特沃兹的相频特性');xlabel('频率(Hz)');ylabel('相位'); yn2=filter(Bz,Az,xn);%迭代法求解滤波信号% yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信号滤波后的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信号滤波后的相频特性');xlabel('频率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function edit10_Callback(hObject, eventdata, handles)function edit10_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit11_Callback(hObject, eventdata, handles) function edit11_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton5_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi; Bt=ws-wp; N0=ceil(1.8*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,boxcar(N));%单位序列相应% yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('矩形窗的损耗函数');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('矩形窗的相频特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);%重叠相加法求滤波后序列% yn=abs(fft(yn2));n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信号滤波后的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信号滤波后的相频特性');xlabel('频率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton6_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi; Bt=ws-wp; N0=ceil(6.1*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,bartlett(N)); yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('三角窗的损耗函数');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn);n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('三角窗的相频特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信号滤波后的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信号滤波后的相频特性');xlabel('频率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton7_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi;if(fp N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,hanning(N));else Bt=wp-ws; N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,'high',hanning(N));end yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('汉宁窗的损耗函数');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('汉宁窗的相频特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信号滤波后的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信号滤波后的相频特性');xlabel('频率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton8_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi;if(fp N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,hamming(N));else Bt=wp-ws; N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,'high',hamming(N));end yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('哈明窗的损耗函数');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('哈明窗的相频特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信号滤波后的幅频特性');xlabel('频率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信号滤波后的相频特性');xlabel('频率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); %---Executes during object creation, after setting all properties.function axes12_CreateFcn(hObject, eventdata, handles)% hObject handle to axes12(see GCBO) % eventdata reservedhandles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes12 %---Executes on mouse press over axes background.function axes12_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to axes12(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Hints: get(hObject,'String')returns contents of edit12 as text % str2double(get(hObject,'String'))returns contents of edit12 as a double %---Executes during object creation, after setting all properties.function edit12_CreateFcn(hObject, eventdata, handles)% hObject handle to edit12(see GCBO) % eventdata reservedhandles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end %---If Enable == 'on', executes on mouse press in 5 pixel border.%---Otherwise, executes on mouse press in 5 pixel border or over edit5.function edit5_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to edit5(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %---Executes during object deletion, before destroying properties.function edit12_DeleteFcn(hObject, eventdata, handles)% hObject handle to edit12(see GCBO) % eventdata reserved-to be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)第四篇:现代信号处理课程设计报告(中南大学)
第五篇:数字信号处理课设