范文网 论文资料 数字图像处理实验代码(精选)

数字图像处理实验代码(精选)

数字图像处理实验代码第一篇:数字图像处理实验代码简易photoshop代码数字图像处理实验报告一.一个简单的“photoshop”软件 二.设计目的:数字图像处理,就是用数字计算机及其他有关数字技术,对图像进行处理。

数字图像处理实验代码

第一篇:数字图像处理实验代码

简易photoshop代码数字图像处理实验报告

一.一个简单的“photoshop”软件 二.设计目的:

数字图像处理,就是用数字计算机及其他有关数字技术,对图像进行处理,以达到预期的目的。随着计算机的发展,图像处理技术在许多领域得到了广泛应用,数字图像处理已成为电子信息、通信、计算机、自动化、信号处理等专业的重要课程。

数字图像处理课程设计是在完成数字图像处理的相关理论的学习后,进行的综合性训练课程,其目的主要包括:

1、使学生进一步巩固数字图像处理的基本概念、理论、分析方法和实现方法;

2、增强学生应用VC++编写数字图像处理的应用程序及分析、解决实际问题的能力;

3、尝试将所学的内容解决实际工程问题,培养学生的工程实践能力,提高工科学生的就业能力。

三.设计内容: 1.打开图像: 主要代码:

static char szFilter[]="BMP文件(*.bmp)|*.bmp||"; //定义过滤文件的类型

CString filename;

int ret=dlg.DoModal(); //运行打开文件对方框

if(ret==IDOK)

{

filename=dlg.GetFileName();

//获取所选择图像的路径

m_dib.LoadFromFile(filename);

//加载图像

if(!m_dib.m_bLoaded)

//判断是否加载图像成功

{ AfxMessageBox("图像打不开");

} return;

CFileDialog dlg(TRUE,"bmp",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);//定义文件对话框对

效果图:

2.水平镜像:把图像的第一列和最后一列调转,第二列和倒数第二列换过来,以此类推下去,直到第nw/2为止。 代码: int temp,i,j;

for(j=0;j

for(i=0;i

{

temp=m_dib.m_pdata[j*nw+i];

m_dib.m_pdata[j*nw+i]=m_dib.m_pdata[nw-i-1+j*nw];

m_dib.m_pdata[nw-i-1+j*nw]=temp;

} 效果图:

3.素描风格:先把灰度值与右下的作对比,如果差值大于一个值则说明这是轮廓,先把非轮廓的位置像素置为黑色,最后对所有像素进行底片化处理 代码: int temp,i,j;

for(j=0;j

for(i=0;i

{

temp=m_dib.m_pdata[j*nw+i]-m_dib.m_pdata[(j+1)*nw+i+1];

} if(temp<10) m_dib.m_pdata[j*nw+i]=0;

//黑色为0

for(j=0;j

for(i=0;i

{

int gray=m_dib.m_pdata[j*nw+i];

m_dib.m_pdata[j*nw+i]=255-gray;

}

图:

4图像雾化:在图像中引入一定的随机值,打乱图像中的像素值

代码:

int i,j,k,dat;

//i表示列,j表行

byte *ptemp=(byte *)new byte[nw*nh];

memset(ptemp,0,nw*nh);

for(j=0;j

for(i=0;i

{

k=rand()%8;//取任意的随机值

dat=j*nw+i+k; if(dat>=nw*nh) dat=nw*nh-1; ptemp[j*nw+i]=m_dib.m_pdata[dat];

} memcpy(m_dib.m_pdata,ptemp,nw*nh); 效果图:

5.浮雕处理:通过勾画图象轮廓和降低周围像素色值,从而生成具有凹凸感的浮雕效果。其方法是生成一缓冲区,计算当前像素的左上角与右下角的像素值之差,再加上一个补值。将其存储到缓冲区。再将缓冲区的数据逐点替换到图像中并显示出来。 代码:

int w=3,i,j;

//w为模板宽度

BYTE *p=new BYTE[nw*nh];

memcpy(p,m_dib.m_pdata,nw*nh);

for(j=w/2;j

for(i= w/2;i

{

p[j*nw+i]=m_dib.m_pdata[(j-1)*nw+i-1]*(1)+m_dib.m_pdata[(j+1)*nw+i+1]*(-1)+120;

}

memcpy(m_dib.m_pdata,p,nw*nh);

delete []p; 效果图:

6.直方图均衡化 代码:

int n[256]={0},g[256]={0}; //定义频数数组n,均衡化每个像素的灰度级的数组g

double f[256],t[256]; //定义频率数组f,累加的频率数组t

int g_max=0,g_mim=255;

int i,j,k,z;

for(j=0;j

//统计灰度级的频数n for(i=0;i

z=m_dib.m_pdata[j*nw+i];

n[z]++;

}

for(k=0;k<=255;k++)

//统计每个灰度级出现的频率

f[k]=n[k]/(nw*nh*1.0);

//累计灰度级的频率

t[0]=f[0]; for(k=1;k<=255;k++)

t[k]=t[k-1]+f[k];

for(j=0;j

for(i=0;i

g_max=w>g_max?w:g_max; //得到最大值

g_mim=w

}

for(k=0;k<=255;k++)

//利用公式求每个像素均衡化后的灰度级

g[k]=(int)((g_max-g_mim)*t[k]+g_mim+0.5);

for(j=0;j

//逐个替换

for(i=0;i

k=m_dib.m_pdata[j*nw+i];

m_dib.m_pdata[j*nw+i]=g[k];

}

for(j=0;j

//计算均衡化的直方图

{

//绘制原图像的直方图

for(i=0;i

{

BYTE temp=m_dib.m_pdata[j*nw+i];

m_hist[temp]++; } m_bHist=true;

CString str; int nh=m_dib.GetDIBHeight(); int i; // 画坐标轴

// 绘制坐标轴

pDC->MoveTo(410,nh+20); //(410,nh+20 )是直方图的左上角坐标

// 垂直轴

pDC->LineTo(410,nh+200);//(410,nh+200 )是直方图的左下角坐标

// 水平轴

pDC->LineTo(710,nh+200);//(710,nh+200 )是直方图的右下角坐标

// 写X轴刻度值

str.Format("0"); pDC->TextOut(410, nh+200+10, str); str.Format("50"); pDC->TextOut(460, nh+200+10, str); str.Format("100"); pDC->TextOut(510, nh+200+10, str); str.Format("150"); pDC->TextOut(560, nh+200+10, str); str.Format("200"); pDC->TextOut(610, nh+200+10, str); str.Format("255"); pDC->TextOut(665, nh+200+10, str); // 绘制X轴刻度 for ( i = 0; i < 256; i += 25) {

if ((i & 1) == 0) {

} // 10的倍数

pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2);

}

else {

} // 10的倍数

pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2); } // 绘制X轴箭头

pDC->MoveTo(705,nh+200-5); pDC->LineTo(710,nh+200); pDC->LineTo(705,nh+200+5); // 绘制y轴箭头

pDC->MoveTo(410,nh+20); pDC->LineTo(405,nh+20+5); pDC->MoveTo(410,nh+20); pDC->LineTo(415,nh+20+5); int max=0; for(i=0;i<256;i++) if(m_yuan[i]>max) {

} max=m_yuan[i];

for(i=0;i<256;i++) pDC->MoveTo(410+i,nh+200); pDC->LineTo(410+i,nh+200-(m_yuan[i]*160/max)); } if(m_bHist==true) //绘画新的直方图 {

CString str; int nh=m_dib.GetDIBHeight(); int i; // 画坐标轴 // 绘制坐标轴

pDC->MoveTo(10,nh+20); //(10,nh+20 )是直方图的左上角坐标

// 垂直轴

pDC->LineTo(10,nh+200);//(10,nh+200 )是直方图的左下角坐标

// 水平轴

pDC->LineTo(310,nh+200);//(310,nh+200 )是直方图的右下角坐标

// 写X轴刻度值 str.Format("0");

pDC->TextOut(10, nh+200+10, str); str.Format("50"); pDC->TextOut(60, nh+200+10, str); str.Format("100"); pDC->TextOut(110, nh+200+10, str); str.Format("150"); pDC->TextOut(160, nh+200+10, str); str.Format("200"); pDC->TextOut(210, nh+200+10, str); str.Format("255"); pDC->TextOut(265, nh+200+10, str); // 绘制X轴刻度 for ( i = 0; i < 256; i += 25) {

if ((i & 1) == 0) { // 10的倍数

} else {

// 10的倍数

pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2); pDC->MoveTo(i + 10, nh+200-2); pDC->LineTo(i + 10, nh+200+2); } } // 绘制X轴箭头

pDC->MoveTo(305,nh+200-5); pDC->LineTo(310,nh+200); pDC->LineTo(305,nh+200+5); // 绘制y轴箭头 pDC->MoveTo(10,nh+20); pDC->LineTo(5,nh+20+5); pDC->MoveTo(10,nh+20); pDC->LineTo(15,nh+20+5); int max=0; for(i=0;i<256;i++) if(m_hist[i]>max) { max=m_hist[i];

for(i=0;i<256;i++) pDC->MoveTo(10+i,nh+200); pDC->LineTo(10+i,nh+200-(m_hist[i]*160/max));

} } 效果图:

四.心得体会:

通过这次数字图像处理的课程设计,对图片有了更深一层的认识,理解了对图像处理的一些原理,在这个课程设计过程中,需要自己去查阅资料,找资料,还需要理解所找到的资料,遇到问题独立去思考,或者去请教同学,给了我一个很好的锻炼机会,做事情一定要坚持,最后一定会有收获的。

五.参考文献:

《数字图像处理》 ——电子工业出版社

《vc++数字图像处理实验指导书》 曹老师、何家峰主编

第二篇:遥感数字图像处理实验报告

遥感数字图像处理

学院 理学院 班级 地信131 学号 姓名

编写日期:1

2015.5

▶▶作业a

1.LS8_C_20140613_022505_000000_118039_GEOTIFF_L4

2. L5118_39_19860531 ProductDescription用记事本打开,读取头文件,并填写相关信息与相应位置即可

2

3. L5118-39-19960103

4. L7118039_20050815 直接打开以_mtl为后缀的文件,该文件中包含了遥感影像的所有波段

3 5. LM212803919761127 直接打开波段,然后波段合成即可

6. s5kj297_289_10m

7. WORLDVIEW-052606622010_01

4

▶▶作业b

在ENVI中将landsat的4景影像和SPOT-5的1景的影像打开,并联动连接查看同一区域

link displays是根据象元位置来连接的,geographic link是通过地理坐标位置来连接的。

5

由上图可知,将遥感影像联动时亦可实现不同影像同一区域的快速检索,但是我们也可以看到,由于受到各方面因素的影像并不能特别精确的指在同一地方。

▶▶作业c

1.WORLDVIEW-2影像保存为jpg和TIF格式的4-3-2波段合成的假彩色图像。可用同样的方法将SPOT-5影像保存为jpg和tif格式的4-3-2波段合成的假彩色图像

6 2.为landsat的5景影像附上波段的波长,并根据波长用landsat 5的7-4-3波段,保存为jpg和tif格式影像

为波长复制后,导入影像文件各波段显示差异前后对比

转换为JPG格式后可以用看图软件直接打开

7

▶▶作业d

需要对影像进行裁剪,裁剪的基本步骤如下:

1.L5118_39_19860531裁剪前后对比

2. L5118-39-19960103裁剪前后对比

3. L7118039_20050815裁剪前后对比

4. LS8_C_20140613_022505_000000_118039_GEOTIFF_L4裁剪前后对比

▶▶

作业e

将剪裁影像,重采样成10m,重采样的操作主要如下

9

1.L5118_39_19860531重采样前后对比

2. L5118-39-19960103重采样前后对比

10

3. L7118039_20050815重采样前后对比

11

4.LS8_C_20140613_022505_000000_118039_GEOTIFF_L4重采样前后对比

12

第三篇:天津科技大学---数字图像处理实验报告

·

数字图像处理实验报告

专 业:计算机科学技术 学 号:11101110 姓 名:马艳松 提交日期:2014.6.5

实验一 数字图像的读入与显示

一.实验目的:

1.熟悉opencv的开发环境设置

2.读取一幅图像,并显示,掌握Imread, imwrite,imshow的使用

3.掌握opencv中图像的表示,及其属性的含义。 二.实验内容: 配置好visualstudio2010下opnecv开发环境

使用opencv的函数读入一幅图像,并在窗口中显示出来。

三.实验步骤: #include "stdafx.h" #include using namespace cv; using namespace std; void test1() { Mat inputImage=imread("..imageookeach.jpg",1); if(!inputImage.empty()) {

cvNamedWindow("test");

imshow("test",inputImage);

waitKey(); } else

{

cout<<"file open error!";

getchar(); } }

int _tmain(int argc, _TCHAR* argv[]) { test1(); return 0; }

四.实验心得:通过上课实验理解了opencv的配置过程。通过程序实现了图片的成象处理。

实验二 数字图像像素的访问

一.实验目的: 掌握opencv开发环境中对灰度图像及彩色图像中的像素的访问方法

理解mat数据结构

掌握opencv中对图像进行处理的基本过程。 二.实验内容: (1)打开一幅灰度图像,对其进行线性灰度变换(直线方程的参数为k, b),并显示变换前、后的图像。;调整K值,分别取>1, <1, =1, 以及-1,比较不同K值时的图像增强效果。

(2)打开一幅彩色图像,对每个像素进行访问,分别令R、G、B的值为0,查看处理后的图像,并比较原图像的差异。

重点和难点: 掌握灰度图像和彩色图像的像素的值的访问方法。 三.实验步骤: 1r)实验代码

void image1Pixel() {

double durationa,durationb,durationc; double cacStart,cacEnd;

Mat image=imread("..imageookeach.jpg",1); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++) for(int i=0;i

for(int j=0;j

{

b=image.at(i,j)[0];

g=image.at(i,j)[1];

r=image.at(i,j)[2];

fgray=0.299*r+0.587*g+0.114*b;

gray.at(i,j)=saturate_cast(fgray);

}

imshow("",gray);

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); // the elapsed time in ms waitKey(); } 2)实验代码

#include "stdafx.h"

#include using namespace cv; using namespace std;

void image1Pixel() {

{

Mat inputImage=imread("..imageookeach.jpg",1); if(!inputImage.empty()) { double durationa,durationb,durationc; double cacStart,cacEnd; Mat image=imread("..imageookeach.jpg",1); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); Mat grayGB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRG(image.size().height,image.size().width,CV_8UC3,Scalar(0)); uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++) for(int i=0;i

for(int j=0;j

} imshow("org",image); cvNamedWindow("gray"); imshow("gray",gray); waitKey(); b=image.at(i,j)[0]; g=image.at(i,j)[1]; r=image.at(i,j)[2]; //////////////////////////// grayGB.at(i,j)[0] = b; grayGB.at(i,j)[1] = g; grayGB.at(i,j)[2] = 0; //R grayRB.at(i,j)[0] = b; grayRB.at(i,j)[1] = 0;// G grayRB.at(i,j)[2] = r; grayRG.at(i,j)[0] = 0; //B grayRG.at(i,j)[1] = g; grayRG.at(i,j)[2] = r; //////////////////////////// fgray=0.299*r+0.587*g+0.114*b; gray.at(i,j)=saturate_cast(fgray); cvNamedWindow("org"); cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); } void test1()

}

} cvNamedWindow("test"); imshow("test",inputImage); waitKey(); else {

} cout<<"file open error!"; getchar(); int _tmain(int argc, _TCHAR* argv[]) {

}

image1Pixel(); test1(); return 0; 心得体会:通过本次试验,我了解并大致掌握灰度图像和彩色图像的像素的值的访问方法。由于之前很少练习这方面的内容,试验过程中遇到了一些问题,好在在别人的帮助下和向别人咨询终于了解了这方面知识的大致框架和原理。由此更坚定了我学习下去的信心和动力!

实验三 图像的平滑

一.实验目的: 掌握opencv开发环境中对灰度图像及彩色图像中的像素的访问方法

掌握opencv中对图像进行处理的基本过程。

掌握均值平滑和中值滤波的基本原理

二.实验内容: (1)打开一幅灰度图像,对图像进行3*3(包括中心点)的邻域平均处理。

(2)对原图进行3*3(包括中心点)的中值滤波处理。

(3)比较原图像与邻域平均的图像、中值滤波后的图像的差异

三.实验步骤: 1)中值滤波处理

for(int i=1;i

{

for(int j=1;j

{

int

imshow("中值滤波",gray);

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); waitKey(); } int GetMidNum(int n[]) {

for (int i=0;i<9;i++)

for(int j = 0 ;j<8;j++)

{

if (n[j]>n[j+1])

{

int temp ;

temp = n[j+1];

n[j+1] = n[j];

n[j]= temp;

}

}

return n[4]; }

void test4_4() { int count[256];//存放各个像素值对应的个数

float hist[256],sumHist[256]; uchar grayHist[256]; for (int i=0;i<256;i++) {

count[i]=0;

hist[i]=0; a[9]={gray.at(i-1,j),gray.at(i,j),gray.at(i+1,j),

gray.at(i-1,j-j),gray.at(i,j-1),gray.at(i+1,j-1)

+gray.at(i-1,j+1),gray.at(i,j+1),gray.at(i+1,j+1)};

gray.at(i,j)=GetMidNum(a);

}

}

} int _tmain(int argc, _TCHAR* argv[]) { image1Pixel(); //Test3();

//test4_4(); return 0; }

2)邻域平均

void image1Pixel() sumHist[i]=0; grayHist[i]=0; } Mat image=imread("..imageookeach.jpg",0); for(int i=0;i(i); for(int j=0;j

count[data[j]]++; } } for(int i=0;i<256;i++) hist[i]=((float)count[i])/(image.size().height*image.size().width); sumHist[0]=hist[0]; for(int i=1;i<256;i++) sumHist[i]=sumHist[i-1]+hist[i]; for(int i=0;i<256;i++) grayHist[i]=saturate_cast(sumHist[i]*255); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); for(int i=0;i(i); uchar* grayData=gray.ptr(i); for(int j=0;j

grayData[j]=grayHist[data[j]]; } } cvNamedWindow("tset"); imshow("org",image); cvNamedWindow("hist"); imshow("hist",gray); waitKey(); {

double durationa,durationb,durationc; double cacStart,cacEnd;

Mat image=imread("..imageookeach.jpg",1); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++) for(int i=0;i

for(int j=0;j

{

b=image.at(i,j)[0];

g=image.at(i,j)[1];

r=image.at(i,j)[2];

fgray=0.299*r+0.587*g+0.114*b;

gray.at(i,j)=saturate_cast(fgray);

}

imshow("",gray);

cacEnd = static_cast(getTickCount()); durationa=(cacEnd-cacStart)/cv::getTickFrequency(); // the elapsed time in ms waitKey(); }

void Test3() {

int GetMidNum(int n[]); double durationa,durationb,durationc; double cacStart,cacEnd;

Mat image=imread("..imageookeach.jpg",1); Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0)); Mat grayGB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRB(image.size().height,image.size().width,CV_8UC3,Scalar(0)); Mat grayRG(image.size().height,image.size().width,CV_8UC3,Scalar(0)); //gray=0.299R+0.587G+0.114b uchar r,g,b; float fgray; cacStart = static_cast(getTickCount()); for(int m=0;m<100;m++)

for(int i=0;i

b=image.at(i,j)[0];

g=image.at(i,j)[1];

r=image.at(i,j)[2];

}

实验心得:通过这次试验,我明白了,平滑技术用于平滑图像的噪声,平滑噪声可以在空间域中进行,基本方法是求像素灰度的平均值或中值。但是这些很容易引起边缘的模糊,常用的有均值滤波、中值滤波,在使用时,针对不同的噪声,也需要不同的滤波法,没有哪种方法是绝对好,必须具体情况具体分析。 最后比较三种平滑效果,八点平滑最好,说明对高斯噪声平滑滤波效果较好。中值滤波基本把椒盐噪声都滤去了,说明中值滤波对椒盐噪声平滑效果比高斯噪声好。

fgray=0.299*r+0.587*g+0.114*b;

gray.at(i,j)=saturate_cast(fgray); } imshow("原图",gray); for(int i=1;i

for(int j=1;j

{

gray.at(i,j)= (gray.at(i-1,j)+gray.at(i,j)+gray.at(i+1,j)+

gray.at(i-1,j-j)+gray.at(i,j-1)+gray.at(i+1,j-1)

+gray.at(i-1,j+1)+gray.at(i,j+1)+gray.at(i+1,j+1))/9;

}

imshow("邻域平均",gray); 实验四 图像的直方图均衡化

一.实验目的: 掌握直方图均衡化的基本步骤及实现方法

掌握opencv中对图像进行处理的基本过程。

二.实验内容: (1)打开一幅灰度图像,对图像进行直方图均衡化处理。

(2)比较原图像与均衡化的图像的差异。

(3)要求自己按照课本介绍的均衡化的步骤在opencv下实现直方图均衡化处理。

三.实验步骤:void test1() { Mat inputImage=imread("..imageookeach.jpg",1);

if(!inputImage.empty()) {

cvNamedWindow("test");

imshow("test",inputImage);

waitKey(); } else

{

cout<<"file open error!";

getchar(); } } void test4() { int count[256]; float hist[256],sumHist[256]; uchar grayHist[256];

for (int i=0;i<256;i++) {

count[i]=0;

hist[i]=0;

sumHist[i]=0;

grayHist[i]=0; }

Mat image=imread("..imageookeach.jpg",0);

for(int i=0;i

uchar* data=image.ptr(i);

for(int j=0;j

{

count[data[j]]++;

} } for(int i=0;i<256;i++)

hist[i]=((float)count[i])/(image.size().height*image.size().width); sumHist[0]=hist[0]; for(int i=1;i<256;i++)

sumHist[i]=sumHist[i-1]+hist[i]; for(int i=0;i<256;i++)

grayHist[i]=saturate_cast(sumHist[i]*255);

Mat gray(image.size().height,image.size().width,CV_8UC1,Scalar(0));

for(int i=0;i

uchar* data=image.ptr(i);

uchar* grayData=gray.ptr(i);

for(int j=0;j

{

grayData[j]=grayHist[data[j]];

} }

cvNamedWindow("org");

imshow("org",image);

cvNamedWindow("hist");

imshow("hist",gray);

waitKey();

} int _tmain(int argc, _TCHAR* argv[]) { //test1(); test4(); return 0; }

四.实验心得:通过这次的实验,我明白了直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

第四篇:数字信号处理实验报告完整版

实验 1

利用 T DFT 分析信号频谱

一、实验目的

1.加深对 DFT 原理的理解。

2.应用 DFT 分析信号的频谱。

3.深刻理解利用 DFT 分析信号频谱的原理,分析实现过程中出现的现象及解决方法。

二、实验设备与环境

计算机、MATLAB 软件环境 三、实验基础理论

T 1.DFT 与 与 T DTFT 的关系

有限长序列 的离散时间傅里叶变换 在频率区间的 N 个等间隔分布的点 上的 N 个取样值可以由下式表示:

212 /0( )| ( ) ( ) 0 1Nj knjNk NkX e x n e X k k N      由上式可知,序列 的 N 点 DFT ,实际上就是 序列的 DTFT 在 N 个等间隔频率点 上样本 。

2.利用 T DFT 求 求 DTFT

方法 1 1:由恢复出的方法如下:

由图 2.1 所示流程可知:

101( ) ( ) ( )Nj j n kn j nNn n kX e x n e X k W eN               由上式可以得到:

IDFT DTFT

第五篇:《数字信号处理》实验三用双线性变换法设计IIR数字滤波器

实验三 用双线性变换法设计IIR数字滤波器

一、 实验目的

1、熟悉用双线性变换法设计IIR数字滤波器的原理与方法

2、掌握数字滤波器的计算机仿真方法

3、通过观察对实际心电图信号的滤波作用获得数字滤波的感性知识。

二、 实验内容及原理

1、用双线性变换法设计一个巴特沃斯低通IIR数字滤波器。设计指标参数为在通带内截止频率低于0.2时最大衰减小于1dB在阻带内0.3频率区间上最小衰减大于15dB。

2、以0.02为采样间隔打印出数字滤波器在频率区间0/2上的幅频响应特性曲线。

3、用所设计的滤波器对实际心电图信号采样序列进行仿真滤波处理并分别打印出滤波前后的心电图信号波形图观察总结滤波作用与效果。 教材例中已求出满足本实验要求的数字滤波系统函数 31kkzHzH 3211212121kzCzBzzAzHkkk 式中 A0.09036 2155.09044.03583.00106.17051.02686.1332211CBCBCB

三、实验结果 心电图信号采样序列 0510152025303540455055-100-50050nxn心电图信号采样序列xn 用双线性变换法设计IIR数字滤波器一级滤波后的心电图信号 0102030405060-100-80-60-40-2002040ny1n一级滤波后的心电图信号 二级滤波后的心电图信号 0102030405060-100-80-60-40-2002040ny2n二级滤波后的心电图信号 三级滤波后的心电图信号 0102030405060-80-60-40-2002040ny3n三级滤波后的心电图信号 用双线性变换法设计IIR数

验字滤波器滤代波器的幅频响应曲线 码 00.050.10.150.20.250.30.350.40.450.5-50-40-30-20-10010w/pi20lgHjw滤波器的幅频响应曲线

四、实x-4-20-4-6-4-2-4-6-6-4-4-6-6-261280-16-38-60-84-90-66-32-4-2-48121210666400000-2-4000-2-200-2-2-2-20 n0:55 subplot111 stemnx. axis0 55 -100 50 xlabeln ylabelxn title心电图信号采样序列xn N56 A0.09036 20.09036 0.09036 B1 -1.2686 0.7051 B11 -1.0106 0.3583 B21 -0.9044 0.2155 y1filterABx n0:55 figure subplot111 stemny1. xlabeln ylabely1n title一级滤波后的心电图信号 y2filterAB1y1 n0:55 figure 用双线性变换法设计IIR数字滤波器subplot111 stemny2. xlabeln ylabely2n title二级滤波后的心电图信号 y3filterAB2y2 n0:55figure subplot111 stemny3. xlabeln ylabely3n title三级滤波后的心电图信号 A0.09036 20.09036 0.09036 B11 -1.2686 0.7051 B21 -1.0106 0.3583 B31 -0.9044 0.2155 H1wfreqzAB1100 H2wfreqzAB2100 H3wfreqzAB3100 H4H1.H2 HH4.H3 magabsH db20log10mageps/maxmag figure subplot111 plotw/pidb axis0 0.5 -50 10 xlabelw/pi ylabel20lgHjw title滤波器的幅频响应曲线

五、实验总结 双线性变换法的特点 对频率的压缩符合下列公式 11112zzTs sTsTz22 用双线性变换法设计IIR数字滤波器这样的变换叫做双线性变换。用双线性变换法来设计数字滤波器由于从s面映射到s1面具有非线性频率压缩的特点因此不可能产生频率混叠现象而且转换成的Hz是因果稳定的这是双线性变换法的最大优点。其缺点是w与之间的非线性关系直接影响数字滤波器频香逼真的模仿模拟滤波器的频响。 数字滤波器的输入和输出均为数字信号通过一定的运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分。数字滤波器可以通过模拟其网络传输函数进行实现。如图中所示滤波器对其高于截止频率的频段产生很高的衰减所得信号较之原信号剔除了高频的成分。

上一篇
下一篇
返回顶部