程佩青数字信号处理教程光盘序列号在哪可以找到

程佩青数字信号处理教程光盘序列号在哪可以找到,第1张

书名:数字信号处理教程(无光盘)原价:3980元作者:程佩青出版社:清华大学出版社出版日期:2001-08-01ISBN:9787900631671页码:485版次:2编辑推荐--------------------------------------------------------------------------------内容提要--------------------------------------------------------------------------------本书系统地讨论了数字信号处理的基本理论、基本分析方法、基本算法和基本实现方法。全书共九章。前三章是离散时间信号与系统的基本理论,即离散时间信号与系统、z变换及离散傅里叶变换。第四章讨论各种快速傅里叶变换算法。第五、六、七章是数字滤波器的结构、理论和设计方法,包括计算机辅助设计方法。第八章是数字信号处理的有限字长效应。第九章以公司的系列为例,介绍数字信号处理器。本书条理清楚,深入浅出,有实例,便于自学。本书可作为大专院校通信工程、电子信息工程信息工程、自动控制工程等专业的教材也可作为在通信、信息技术、图像处理、遥感、声纳、雷达、生物医学、地震、语音处理等有关领域从事信号处理的科技工作者的参考书。目录--------------------------------------------------------------------------------绪论第一章 离散时间信号与系统11 离散时间信号——序列12 线性移不变系统13 常系数线性差分方程14 连续时间信号的抽样习题第二章 z变换21 引言22 z变换的定义与收敛域23 z反变换24 z变换的基本性质和定理25 序列的z变换与连续信号的拉普拉斯变换、傅里叶变换的关系26 序列的傅里叶变换27 傅里叶变换的一些对称性质28 离散系统的系统函数,系统的频率响应习题第三章 离散傅里叶变换31 引言32 傅里叶变换的几种可能形式33 周期序列的离散傅里叶级数(DFS)34 离散傅里叶级数的性质35 离散傅里叶变换(DFT)——有限长序列的离散频域表示36 离散傅里叶变换的性质37 抽样z变换——频域抽样理论38 利用DFT计算模拟信号的傅里叶变换(级数)对39 序列的抽取与插值习题第四章 快速傅里叶变换41 引言42 直接计算DFT的问题及改进的途径43 按时间抽选(DIT)的基-2 FFT算法(库利图基算法)44 按频率抽选(DIF)的基-2 FFT算法(桑德图基算法)45 离散傅里叶反变换(IDFT)的快速计算方法46 N为复合数的FFT算法——混合基算法47 基-4 FFT算法48 分裂基FFT算法49 线性调频z变换(Chirpz变换)算法410 线性卷积与线性相关的FFT算法411 数字信号处理的实现习题第五章 数字滤波器的基本结构51 数字滤波器结构的表示方法52 无限长单位冲激响应(IIR)滤波器的基本结构53 有限长单位冲激响应(FIR)滤波器的基本结构54 数字滤波器的格型结构习题第六章 无限长单位冲激响应(IIR)数字滤波器的设计方法61 引言62 最小与最大相位延时系统,最小与最大相位超前系统63 全通系统64 用模拟滤波器设计IIR数字滤波器65 冲激响应不变法66 阶跃响应不变法67 双线性变换法68 常用模拟低通滤波器特性69 设计IIR滤波器的频率变换法610 先利用模拟域频带变换法,再利用数字化法设计数字各型滤波器611 先将模拟归一化低通原型数字化为数字低通,再利用数字域频带变换法设计数字各型滤波器612 直接在数字域设计IIR数字滤波器613 设计IIR滤波器的最优化方法614 数字滤波器的实现习题第七章 有限长单位冲激响应(FIR)数字滤波器的设计方法71 引言72 线性相位FIR滤波器的特点73 窗函数设计法74 频率抽样设计法75 设计FIR滤波器的最优化方法76 FIR数字滤波器的硬件实现——位串行方式实现77 IIR与FIR数字滤波器的比较习题第八章 数字信号处理中的有限字长效应81 引言82 二进制数的表示及其对量化的影响83 A/D变换的量化效应84 数字滤波器的系数量化效应85 数字滤波器运算中的有限字长效应86 FFT算法的有限字长效应习题第九章 数字信号处理器91 引言92 数字信号处理器的结构特点93 TMS 320C30数字信号处理器94 TMS 320系列DSP系统的设计与调试附录 本书所附“数字信号处理多媒体CAI教程”光盘简介参考文献

(2) Chirip-z变换(CZT),是指在z域内对输入序列沿螺旋轮廓线进行z变换;Chirp-z变换(CZT)是一种更灵活的计算频谱的算法,它并不局限在单位圆上,而是可沿如下描述的轮廓线进行z变换:

Z=AW t=0,1,……,M-1

需要处理成什么

chirp-z是频谱分析工具, 能直接得出频谱

10 kHz载频

50 Hz 调幅信号

最上面是调制波形局部

中间是幅度频谱, 可以看到,在9950Hz和10050Hz位置的都有一个峰值, 这是调幅的特点

最下面是相位频谱

FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform)。FFT算法可分为按时间抽取算法和按频率抽取算法,先简要介绍FFT的基本原理。从DFT运算开始,说明FFT的基本原理。

DFT的运算为:

式中

由这种方法计算DFT对于X(K)的每个K值,需要进行4N次实数相乘和(4N-2)次相加,对于N个k值,共需NN乘和N(4N-2)次实数相加。改进DFT算法,减小它的运算量,利用DFT中

的周期性和对称性,使整个DFT的计算变成一系列迭代运算,可大幅度提高运算过程和运算量,这就是FFT的基本思想。

FFT基本上可分为两类,时间抽取法和频率抽取法,而一般的时间抽取法和频率抽取法只能处理长度N=2^M的情况,另外还有组合数基四FFT来处理一般长度的FFT 设N点序列x(n),,将x(n)按奇偶分组,公式如下图

改写为:

一个N点DFT分解为两个 N/2点的DFT,继续分解,迭代下去,其运算量约为

其算法有如下规律

两个4点组成的8点DFT

四个2点组成的8点DFT

按时间抽取的8点DFT

原位计算

当数据输入到存储器中以后,每一级运算的结果仍然储存在同一组存储器中,直到最后输出,中间无需其它存储器

序数重排

对按时间抽取FFT的原位运算结构,当运算完毕时,这种结构存储单元A(1)、A(2),…,A(8)中正好顺序存放着X(0),X(1),X(2),…,X(7),因此可直接按顺序输出,但这种原位运算的输入x(n)却不能按这种自然顺序存入存储单元中,而是按X(0),X(4),X(2),X(6),…,X(7)的顺序存入存储单元,这种顺序看起来相当杂乱,然而它也是有规律的。当用二进制表示这个顺序时,它正好是“码位倒置”的顺序。

蝶形类型随迭代次数成倍增加

每次迭代的蝶形类型比上一次蝶代增加一倍,数据点间隔也增大一倍 频率抽取2FFT算法是按频率进行抽取的算法。

设N=2^M,将x(n)按前后两部分进行分解,

按K的奇偶分为两组,即

得到两个N/2 点的DFT运算。如此分解,并迭代,总的计算量和时间抽取(DIT)基2FFT算法相同。

算法规律如下:

蝶形结构和时间抽取不一样但是蝶形个数一样,同样具有原位计算规律,其迭代次数成倍减小 时,可采取补零使其成为

,或者先分解为两个p,q的序列,其中pq=N,然后进行计算。 前面介绍,采用FFT算法可以很快算出全部N点DFT值,即z变换X(z)在z平面单位圆上的全部等间隔取样值。实际中也许①不需要计算整个单位圆上z变换的取样,如对于窄带信号,只需要对信号所在的一段频带进行分析,这时希望频谱的采样集中在这一频带内,以获得较高的分辨率,而频带以外的部分可不考虑,②或者对其它围线上的z变换取样感兴趣,例如语音信号处理中,需要知道z变换的极点所在频率,如极点位置离单位圆较远,则其单位圆上的频谱就很平滑,这时很难从中识别出极点所在的频率,如果采样不是沿单位圆而是沿一条接近这些极点的弧线进行,则在极点所在频率上的频谱将出现明显的尖峰,由此可较准确地测定极点频率。③或者要求能有效地计算当N是素数时序列的DFT,因此提高DFT计算的灵活性非常有意义。

螺旋线采样是一种适合于这种需要的变换,且可以采用FFT来快速计算,这种变换也称作Chirp-z变换。

Chirp-z变换的计算步骤:

(1)求h(n)的主值序列

(2)用FFT求 的付里叶变换 H(k)=FFT[ ] L点

(3)对x(n)加权并补零

g(n)=

(4)G(k)=FFT[g(n)] L点

(5)Y(k)=G(k)H(k) L点

(6)y(n)=IFFT[Y(k)] L点

(7) 0≤k≤M-1

乘法计算量估算:

(1)、(2)两步可以事先计算,不必实时计算。(3)、(7)两步两次加权,共计N+M次复乘。形成Y(k),需L次复乘。一个FFT与一个IFFT需Llog2L次乘法。所以,总乘法数为L+N+M+Llog2L,而直接计算乘法数为NM。可见,N及M较大时,用FFT实现Chirp-Z变换,速度上有很大的改进。

Chirp-z变换的特点:(与FFT相比)

(1)输入序列的长度N与输出序列的长度M不需要相等;

(2)N及M不必是合成数,二者均可为素数;

(3)zk点的角间隔φ0是任意的,因此频率分辨率也是任意的;

(4)周线不必是z平面上的圆;

(5)起始点z0可任意选定,因此可从任意频率上开始对输入数据进行窄带高分辨率力分析;

(6)若A=1,M=N,则可用Chirp-z变换计算DFT,即使N为素数。

import javautil;

import javaawt;

import javaapplet;

import javatext;

public class AlarmClock extends Applet implements Runnable

{

Thread timer=null; //创建线程timer

Image clockp,gif1,gif2,clock6,clock7; //clockp:闹钟的外壳,闹铃和报时鸟

int s,m,h,hh;

AudioClip ipAu,danger,chirp;

boolean canPaint=true;

boolean flag=false;

boolean strike=true;

int counter=0;

int lasts;

Image offscreen_buf=null;

int i,j,t=0;

int timeout=166;

int lastxs=0,lastys=0,lastxm=0,lastym=0,lastxh=0,lastyh=0;

Date dummy=new Date(); //生成Data对象

GregorianCalendar cal=new GregorianCalendar();

SimpleDateFormat df=new SimpleDateFormat("yyyy MM dd HH:mm:ss");//设置时间格式

String lastdate=dfformat(dummy);

Font F=new Font("TimesRoman",FontPLAIN,14);//设置字体格式

Date dat=null;

Date timeNow=null;

Color fgcol=Colorblue;

Color fgcol2=ColordarkGray;

Panel setpanel;

Color backcolor=Colorpink;

TextField showhour,showmin,showsec,sethour,setmin,setsec;//显示当前时间文本框和定时文本框

Button onbutton;

Button offbutton;

Label hlabel1,mlabel1,slabel1,hlabel2,mlabel2,slabel2;//显示时间单位时所用的标签(时、分、秒)

Label info1=new Label("欢迎使用定时提醒闹钟"),info2=new Label("");

Label note1=new Label("当前时间:"),note2=new Label("闹钟设置:");

boolean setalerm=false,clickflag=false;//判断是否响铃和振动

int fixh=0,fixm=0,fixs=0;//记录闹钟的定时

public void init()//初始化方法

{

Integer gif_number;

int fieldx=50,fieldy1=120,fieldy2=220,fieldw=30,fieldh=20,space=50;//显示时间和定时文本框的定位参数

setLayout(null); //将布局管理器初始化为null

setpanel=new Panel();

setpanelsetLayout(null);

setpaneladd(note1);

setpaneladd(note2);

note1setBounds(30,100,60,20);

note1setBackground(backcolor);

note1setForeground(Colorblack);

note2setBounds(30,180,60,20);

note2setBackground(backcolor);

note2setForeground(Colorblack);

hlabel1=new Label();

mlabel1=new Label();

slabel1=new Label();

hlabel2=new Label();

mlabel2=new Label();

slabel2=new Label();

//显示当前时间用的文本框

showhour=new TextField("00",5);

showmin=new TextField("00",5);

showsec=new TextField("00",5);

//定时用的文本框(时、分、秒)

sethour=new TextField("00",5);

setmin=new TextField("00",5);

setsec=new TextField("00",5);

//当前时间用的文本框的位置、大小

setpaneladd(showhour);

showhoursetBounds(fieldx,fieldy1,fieldw,fieldh);

showhoursetBackground(Colorwhite);

//在文本框后加入单位“时”

setpaneladd(hlabel1);

hlabel1setText("时");

hlabel1setBackground(backcolor);

hlabel1setForeground(Colorblack);

hlabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=fieldx+space;

//当前时间的分钟文本框的位置、大小

setpaneladd(showmin);

showminsetBounds(fieldx,fieldy1,fieldw,fieldh);

showminsetBackground(Colorwhite);

//在文本框后加入单位“分”

setpaneladd(mlabel1);

mlabel1setText("分");

mlabel1setBackground(backcolor);

mlabel1setForeground(Colorblack);

mlabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=fieldx+space;

//当前时间的秒文本框的位置、大小

setpaneladd(showsec);

showsecsetBounds(fieldx,fieldy1,fieldw,fieldh);

showsecsetBackground(Colorwhite);

//在文本框后加入单位“秒”

setpaneladd(slabel1);

slabel1setText("秒");

slabel1setBackground(backcolor);

slabel1setForeground(Colorblack);

slabel1setBounds(fieldx+fieldw+3,fieldy1,14,20);

fieldx=50;

//定时的小时文本框的位置、大小

setpaneladd(sethour);

sethoursetBounds(fieldx,fieldy2,fieldw,fieldh);

sethoursetBackground(Colorwhite);

//在文本框后加入单位“时”

setpaneladd(hlabel2);

hlabel2setText("时");

hlabel2setBackground(backcolor);

hlabel2setForeground(Colorblack);

hlabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

fieldx=fieldx+space;

//定时的分钟文本框的位置、大小

setpaneladd(setmin);

setminsetBounds(fieldx,fieldy2,fieldw,fieldh);

setminsetBackground(Colorwhite);

//在文本框后加入单位“分”

setpaneladd(mlabel2);

mlabel2setText("分");

mlabel2setBackground(backcolor);

mlabel2setForeground(Colorblack);

mlabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

fieldx=fieldx+space;

//定时的秒文本框的位置、大小

setpaneladd(setsec);

setsecsetBounds(fieldx,fieldy2,fieldw,fieldh);

setsecsetBackground(Colorwhite);

//在文本框后加入单位“秒”

setpaneladd(slabel2);

slabel2setText("秒");

slabel2setBackground(backcolor);

slabel2setForeground(Colorblack);

slabel2setBounds(fieldx+fieldw+3,fieldy2,14,20);

//设置闹钟控制按钮(on,off)

onbutton=new Button("开");

offbutton=new Button("关");

setpaneladd(onbutton);

setpaneladd(offbutton);

onbuttonsetBounds(90,180,40,20);

offbuttonsetBounds(140,180,40,20);

//加入一些附加的信息标签(题头,题尾)

setpaneladd(info1);

info1setBackground(backcolor);

info1setForeground(Colorblue);

info1setBounds(50,50,150,20);

setpaneladd(info2);

info2setBackground(backcolor);

info2setForeground(Colorblue);

info2setBounds(150,280,100,20);

//将面板加入当前容器中,并设置面板的大小和背景色

add(setpanel);

setpanelsetBounds(300,1,250,420);

setpanelsetBackground(backcolor);

//获取声音文件

ipAu=getAudioClip(getDocumentBase(),"bells/仙剑mid");

danger=getAudioClip(getDocumentBase(),"bells/0mid");

chirp=getAudioClip(getDocumentBase(),"bells/3mid");

int xcenter,ycenter,s,m,h;

xcenter=145;

ycenter=162;

s=(int)calget(CalendarSECOND);

m=(int)calget(CalendarMINUTE);

h=(int)calget(CalendarHOUR_OF_DAY);

//初始化指针位置

lastxs=(int)(Mathcos(s314f/30-314f/2)30+xcenter);

lastys=(int)(Mathsin(s314f/30-314f/2)30+ycenter);

lastxm=(int)(Mathcos(m314f/30-314f/2)25+xcenter);

lastym=(int)(Mathsin(m314f/30-314f/2)25+ycenter);

lastxh=(int)(Mathcos((h30+m/2)314f/180-314f/2)18+xcenter);

lastyh=(int)(Mathsin((h30+m/2)314f/180-314f/2)18+ycenter);

lasts=s;

MediaTracker mt=new MediaTracker(this);//创建Tracke对象

clockp=getImage(getDocumentBase(),"休闲png");

gif1=getImage(getDocumentBase(),"gif1gif");

gif2=getImage(getDocumentBase(),"gif2gif");

clock6=getImage(getDocumentBase(),"clock6gif");

clock7=getImage(getDocumentBase(),"clock7gif");

mtaddImage(clockp,i++);

mtaddImage(gif1,i++);

mtaddImage(gif2,i++);

mtaddImage(clock6,i++);

mtaddImage(clock7,i++);

try{mtwaitForAll();}catch(InterruptedException e){};//等待加载结束

resize(600,420);//设置窗口大小

}

public void paint(Graphics g){//重写paint()方法

int xh,yh,xm,ym,xs,ys,strike_times;

int xcenter,ycenter;

String today;

Integer gif_number;

xcenter=148;

ycenter=186;

dat=new Date();

calsetTime(dat);

//读取当前时间

s=(int)calget(CalendarSECOND);

m=(int)calget(CalendarMINUTE);

h=(int)calget(CalendarHOUR_OF_DAY);

today=dfformat(dat);

//指针位置

xs=(int)(Mathcos(s314f/30-314f/2)30+xcenter);

ys=(int)(Mathsin(s314f/30-314f/2)30+ycenter);

xm=(int)(Mathcos(m314f/30-314f/2)25+xcenter);

ym=(int)(Mathsin(m314f/30-314f/2)25+ycenter);

xh=(int)(Mathcos((h30+m/2)314f/180-314f/2)18+xcenter);

yh=(int)(Mathsin((h30+m/2)314f/180-314f/2)18+ycenter);

//设置字体和颜色

gsetFont(F);

gsetColor(fgcol);

gsetColor(fgcol2);

gsetColor(getBackground());

gfillRect(1,1,634,419);

gdrawImage(clockp,75,110,this);

gdrawImage(clock6,83,280,this);

gsetColor(fgcol2);

gsetColor(getBackground());

gsetColor(fgcol2);

//以数字方式显示年、月、日和时间

gdrawString(today,55,415);

gdrawLine(xcenter,ycenter,xs,ys);

gsetColor(fgcol);

//画指针

gdrawLine(xcenter,ycenter-1,xm,ym);

gdrawLine(xcenter-1,ycenter,xm,ym);

gdrawLine(xcenter,ycenter-1,xh,yh);

gdrawLine(xcenter-1,ycenter,xh,yh);

lastxs=xs;lastys=ys;

lastxm=xh;lastym=ym;

lastxh=xh;lastyh=yh;

lastdate=today;

if(h<12)hh=h;//将系统时间变换到0-11区间

else hh=h-12;

if(hh==0) strike_times=12;//计算整点时钟声数

else strike_times=hh;

if((s==0&&m==0)||flag){//判断是否整点,是否是主动刷新

if(counter<strike_times){

flag=true;

gdrawImage(gif2,115,35,this);

if(lasts!=s){

if(strike){

counter++;

dangerplay();//播放闹铃声

}

if(strike)strike=false;

else strike=true;

}

}

else {

counter=0;

flag=false;

}

}

else

gdrawImage(gif1,115,35,this);

int timedelta;//记录当前时间与闹铃定时的时差

Integer currh,currm,currs;//分别记录当前的时、分、秒

timeNow=new Date();

currh=new Integer(timeNowgetHours());

currm=new Integer(timeNowgetMinutes());

currs=new Integer(timeNowgetSeconds());

//判断是否要更新当前显示的时间,这样可以避免文本框出现频率闪动

if(currhintValue()!=IntegervalueOf(showhourgetText())intValue())

showhoursetText(currhtoString());

if(currmintValue()!=IntegervalueOf(showmingetText())intValue())

showminsetText(currhtoString());

if(currsintValue()!=IntegervalueOf(showsecgetText())intValue())

showsecsetText(currhtoString());

if(setalerm){ //判断是否设置了闹钟

//判断当前时间是否为闹钟所定的时间

if((currhintValue()==fixh)&&(currmintValue()==fixm)&&(currsintValue()==fixs))

clickflag=true;

timedelta=currmintValue()60+currsintValue()-fixm60-fixs;

if((timedelta<60)&&(clickflag==true)){ //若当前时间与闹钟相差时间达到60秒

chirpplay();

gdrawImage(clock7,83,280,this);

}

else{

chirpstop();

clickflag=false;

}

}

if(lasts!=s)

ipAuplay();//播放滴答声

lasts=s;

if(canPaint){

t+=1;

if(t==12)t=0;

}

canPaint=false;

dat=null;

}

public void start(){

if(timer==null){

timer=new Thread(this);//将timer实例化

timerstart();

}

}

public void stop(){

timer=null;

}

public void run(){

while(timer!=null){

try{timersleep(timeout);}catch(InterruptedException e){}

canPaint=true;

repaint();//刷新画面

}

timer=null;

}

public void update(Graphics g){ //采用双缓冲技术的update()方法

if(offscreen_buf==null)

offscreen_buf=createImage(600,420);

Graphics offg=offscreen_bufgetGraphics();

offgclipRect(1,1,599,419);

paint(offg);

Graphics ong=getGraphics();

ongclipRect(1,1,599,419);

ongdrawImage(offscreen_buf,0,0,this);

}

public boolean action(Event evt,Object arg){ //按钮事件处理函数

if(evttarget instanceof Button){

String lable=(String)arg;

if(lableequals("开")){

setalerm=true;

//获取输入的时间

fixh=IntegervalueOf(sethourgetText())intValue();

fixm=IntegervalueOf(setmingetText())intValue();

fixs=IntegervalueOf(setsecgetText())intValue();

clickflag=false;

}

if(lableequals("关")){

setalerm=false;

if(chirp!=null)

chirpstop();

clickflag=false;

}

return true;

}

return false;

}

}

以上就是关于程佩青数字信号处理教程光盘序列号在哪可以找到全部的内容,包括:程佩青数字信号处理教程光盘序列号在哪可以找到、czt变换是什么、求用Chirp-Z变换处理窄带信号的Matlab程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9847119.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存