资源描述
数字信号处理教程
课后习题及答案
目录
第一章 离散时间信号与系统
第二章 Z变换
第三章 离散傅立叶变换
第四章 快速傅立叶变换
第五章 数字滤波器的基本结构
第六章 无限长单位冲激响应(IIR)数字滤波器的设计方法
第七章 有限长单位冲激响应(FIR)数字滤波器的设计方法
第八章 数字信号处理中有限字长效应
第一章 离散时间信号与系统
1 .直接计算下面两个序列的卷积和
请用公式表示。
分析:
①注意卷积和公式中求和式中是哑变量( 看作参量),
结果中变量是 ,
②分为四步 (1)翻褶( -m ),(2)移位( n ),(3)相乘,
③
如此题所示,因而要分段求解。
2 .已知线性移不变系统的输入为,系统的单位抽样响应
为,试求系统的输出,并画图
分析:
①如果是因果序列可表示成={,,……},例如小题(2)为={1,2,3,3,2,1} ;
② ;
③卷积和求解时,的分段处理。
3 .已知 ,通过直接计算卷积和的办法,试确定单位抽样响应为 的线性移不变系统的阶跃响应。
4. 判断下列每个序列是否是周期性的,若是周期性的,试确定其周期:
分析:
序列为或时,不一定是周期序列,
①当整数,则周期为;
②
③当无理数 ,则不是周期序列。
5. 设系统差分方程为:
其中为输入,为输出。当边界条件选为
试判断系统是否是线性的?是否是移不变的?
分析:已知边界条件,如果没有限定序列类型(例如因果序列、反因果序列等),则递推求解必须向两个方向进行(n ³ 0及n < 0)。
┇
┇
┇
┇
┇
┇
6.试判断:
是否是线性系统?并判断(2),(3)是否是移不变系统?
分析:利用定义来证明线性:满足可加性和比例性,
移不变性:输入与输出的移位应相同T[x(n-m)]=y(n-m)。
7. 试判断以下每一系统是否是(1)线性,(2)移不变的?
分析:
注意:T [x(n)] = g(n) x(n) 这一类表达式,若输入移位m,则有x(n)移位变成x(n-m),而g(n)并不移位,但y(n)移位m则x(n)和g(n)均要移位m 。
8. 以下序列是系统的单位抽样响应,试说明系统是否是
(1)因果的,(2)稳定的?
分析:
注意:0!=1,已知LSI系统的单位抽样响应,可用来判断稳定性,用h(n)=0,n<0 来判断因果性。
9.列出下图系统的差分方程,并按初始条件,求输入为时的输出序列,并画图表示。
分析:
“信号与系统”课中已学过双边Z变换,此题先写出H(z) 然后利用Z反变换(利用移位定理)在时域递推求解;也可直接求出序列域的差分方程再递推求解[注意输入为u(n)]。
解:系统的等效信号流图为:
10. 设有一系统,其输入输出关系由以下差分方程确定
设系统是因果性的。 试求:
分析:小题(a)可用迭代法求解
小题(b)要特别注意卷积后的结果其存在的n值范围。
┇
分析:要想时域抽样后不产生失真的还原出原信号,则抽样频率()必须大于最高信号频率( )的2倍,即满足。
解:根据奈奎斯特定理可知:
分析:由于可知的非零范围为,h(n-m) 的非零范围为
解:按照题意,在区间之外单位抽样响应 皆为零;在区间 之外输入皆为零,
将两不等式相加可得: ,在此区间之外,的非零抽样互不重叠,故输出皆为零。由于题中给出输出除了区间之外皆为零,所以有:
第二章 Z变换
1. 求以下序列的z变换,并画出零极点图和收敛域。
分析:
Z 变换定义,
n的取值是的有值范围。Z变换的收敛域
是满足
的z值范围。
解:(1) 由Z变换的定义可知:
解:(2) 由z变换的定义可知:
解:(3)
解: (4)
,
解:(5) 设
则有
而
∴
因此,收敛域为 :
解:(6)
2 . 假如的z变换代数表示式是下式,问可能有多少
不同的收敛域。
分析:
解 : 对X(Z)的分子和分母进行因式分解得
X(Z)的零点为 : 1/2 , 极点为 : j/2 , -j/2 , -3/4
∴ X(Z)的收敛域为 :
(1) 1/2 < | Z | < 3/4 , 为双边序列, 请看 <图形一>
(2) | Z | < 1/2 , 为左边序列,请看 <图形二>
(3) | Z | > 3/4 , 为右边序列, 请看 <图形三>
分析:
长除法:对右边序列(包括因果序列)H(z)的分子、分母都要按
z的降幂排列,对左边序列(包括反因果序列)H(z)的分子、分
母都要按z的升幂排列。
部分分式法:若X(z)用z的正幂表示,则按X(z)/z 写成部分分
式,然后求各极点的留数,最后利用已知变换关系求z反变换可得
x(n)。
留数定理法:
(1)(i)长除法:
所以:
(1)(ii)留数定理法:
, 设 c为
内的逆时针方向闭合曲线:
当时,
在c内有
一个单极点
则
(1)(iii)部分分式法:
因为
所以
(2)(i). 长除法:
,
因而 是左边序列,所以要按的
升幂排列:
所以
(2)(ii)留数定理法:
内的逆时针方向闭合曲线
在c外有一个单极点
在c内有一个单极点
∴
综上所述,有:
(2)(iii). 部分分式法:
则
因为 则是左边序列
所以
(3)(i). 长除法:
因为极点为,由可知,为
因果序列, 因而要按 的降幂排列:
则
所以
(3)(ii). 留数定理法:
内的逆时针方向闭合曲线。
(3)(iii). 部分分式法:
则
所以
4. 有一右边序列 ,其 变换为
(a) 将上式作部分分式展开(用 表示),由展开式求 。
(b) 将上式表示成 的多项式之比,再作部分分式展开,由展开
式求 ,并说明所得到的序列与(a)所得的是一样的。
注意:不管哪种表示法最后求出x(n)应该是相同的。
解:(a)
因为
且x(n)是右边序列
所以
(b)
5.对因果序列,初值定理是,如果序列为 时
,问相应的定理是什么?
,其z变换为:
分析:
这道题讨论如何由双边序列Z变换来求序列
初值,把序列分成因果序列和反因果序列两部分,
[它们各自由求表达式是不同的],将它们
各自的相加即得所求。
若序列的Z变换为:
由题意可知:X(Z)的收敛域包括单位圆
则其收敛域应该为:
6. 有一信号,它与另两个信号和的
关系是:
其中 ,
已知 ,
分析:
解:根据题目所给条件可得:
而
所以
7. 求以下序列的频谱。
(1) (2)
(3) (4)
分析:
可以先求序列的Z变换再求频率
即为单位圆上的Z变换,或者直接求序列的
傅里叶变换
解:
对题中所给的先进行z变换
再求频谱得:
∴
8. 若是因果稳定序列,求证:
分析:
利用时域卷积则频域是相乘的关系来求解
再利用的傅里叶反变换,代入n = 0即可得所需结果。
证明:
∴
9.求的傅里叶变换。
分析:
这道题利用傅里叶变换的定义即可求解,但最后结果应化为模和相角的关系。
解:根据傅里叶变换的概念可得:
10. 设是如下图所示的信号的傅里叶变换,
不必求出,试完成下列计算:
(a) (b)
(c) (d)
分析:
利用序列傅里叶变换的定义、它的导数以及帕塞瓦公式
解:
由帕塞瓦尔公式可得:
∵
∴
即
由帕塞瓦尔公式可得:
11.已知有傅里叶变换,用表示下列信号的
傅里叶变换。
(a)(b)
(c)
分析:
利用序列翻褶后移位关系以及频域的取导数关系式来求解。
解:
(c)
则
而
所以
12. 已知用下列差分方程描述的一个线性移不变因果系统
(a) 求这个系统的系统函数,画出其零极点图并指出其收敛区域;
(b) 求此系统的单位抽样响应;
(c) 此系统是一个不稳定系统,请找一个满足上述差分方程的稳
定的(非因果)系统的单位抽样响应。
分析:
则 ,
要求收敛域必须知道零点、极点 。收敛域为Z平面
某个圆以外,则为因果系统(不一定稳定),收敛域
若包括单位圆,则为稳定系统(不一定因果)。
(a) 对题中给出的差分方程的两边作Z变换,得:
所以
零点为z=0,极点为
因为是因果系统,所以|z|>1.62是其收敛区域。
零极点图如右图所示。
右边是本题的零极点图。
由于的收敛区域不包括单位圆,故这是个不
稳定系统。
(c) 若要使系统稳定,则收敛区域应包括单位圆,因此选的
收敛区域为 ,即 ,则
中第一项对应一个非因果序列,而第二项对应一个因果序列。
从结果可以看出此系统是稳定的,但不是因果的。
13. 研究一个输入为和输出为的时域线性离散移不变系
统,已知它满足
并已知系统是稳定的。试求其单位抽样响应。
分析:
在Z变换域中求出,
然后和题12(c)一样分解成部分分式分别
求Z反变换。
解:
对给定的差分方程两边作Z变换,得:
,
为了使它是稳定的,收敛区域必须包括
即可求得
14.研究一个满足下列差分方程的线性移不变系统,该系统
不限定为因果、稳定系统。利用方程的零极点图,试求
系统单位抽样响应的三种可能选择方案。
解 :
对题中给定的差分方程的两边
作Z变 换,得:
因此
其零点为
极点为 ,
因为该系统不限定为因果,稳定系统,所以其收敛域情况有三种,分别如左图所示。
收敛域情况有:
零极点图一:
零极点图二:
零极点图三:
注:如果想要参看具体题解,请先选择方案,然后单击 解答 按键即可。
(1) 按12题结果(此处z1=2, z2=1/2),
可知当收敛区域为,则系统
是非稳定的,但是因果的。其单
位抽样响应为:
(2) 同样按12题,当收敛区域为
,
则系统是稳定的但是非因果的。
其单位抽样响应为:
(其中 )
(3)
类似 , 当收敛区域为时,
则统是非稳定的,又是非因果的。
其单位抽样响应为:
(其中 )
15. 有一个用以下差分方程表示的线性移不变因果系统
当激励时,求系统的响应。请用z变换来求解。
分析:
两种解法:
①直接由Z变换Y(z)的关系可得到y(n),
②由Y(z)用留数法可求得y(n)。
解法一:
已知,
将上式进行Z变换,得:
因此
令,
解法二:
差分方程进行Z变换后得:
其中
其收敛区域为。因为
是因果系统,且当时等
于零,所以 当
时,采用围线积分法,其中围线C
包围三个极点,所以
16. 下图是一个因果稳定系统的结构,试列出系统差分方程,
求系统函数。当 时,求系统单
位冲激响应 , 画出系统零极点图和频率响应曲线。
分析:
解法一:利用此系统是一阶系统写出差分方程,令其二阶项系统为零,
可得一阶差分方程,取Z变换求得H(z)从而求得h(n)。
解法二:将系统用流图表示,改变流图中两个一阶节的级联次序
(线性系统服从交换定理),然后写出差分方程,再取Z变换
求得H(z)从而求得h(n)。
解法一:由图示可得
由方框图可看出:差分方程应该是一阶的
则有
因为此系统是一个因果稳定系统 ; 所以其收敛
解法二: 将图P2-11 画成流图结构,并化简如下:
由于线性流图的级联结构可以改变级联次序,因而
上图又可化成:
由这个流图即可很方便地写出其线性差分方程:
取z变换可得:
所以
(由于系统是因果稳定的)
17.设是一离散时间信号,其z变换为,对下列信
号利用求它们的z变换:
(a) ,这里△记作一次差分算子,定义为:
(b) {
(c)
分析:
式序列的抽取序列,是
内插零值序列(不是内插序列),解题的
关键是要进行变量变换,以得到与
的Z变换相似的表达式。
解:
(a)
(b) ,
(c)由此可设
第三章 离散傅立叶变换
1.如下图,序列x(n)是周期为6的周期性序列,试求其傅立叶级数的系数。
计算求得:
解:在一个周期内的计算值
7 。
10.
⑦。
解: (a)
方法一:
方法二证明
( ɑ):
所以:
(1)+(2) 得:
2) 由于:
(4)+(5)得:
(3)与(6)比较可知:
同理可证:
(b) 利用(a)的结果:
证明:
第四章 快速傅立叶变换
解: 解: ⑴ 直接计算:
复乘所需时间:
复加所需时间:
⑵用FFT计算:
复乘所需时间:
复加所需时间:
流图如下图所示:
由(1)式可得的路径,如下表所示:
k
0 1 2 3 4 5 6 7 8 9
0.8 0.67 0.56 0.46 0.39 0.32 0.27 0.22 0.19 0.16
arg []
10. 当实现按时间抽取快速傅立叶变换算法时,基本的蝶形计算
利用定点算术运算实现该蝶形计算时,通常假设所有数字都已按一定
比例因子化为小于1。因此在蝶形计算的过程中还必须关心溢出问题。
(a) 证明如果我们要求
则在蝶形计算中不可能出现溢出,即
似乎更容易些,也更适合些。问这些条件是否足以保证在蝶形
计算中不会出现溢出?请证明你的回答。
证明:(a)
解:(a)
若直接利用10点快速傅立叶变换算法,则:
将n为偶数与n为奇数的部分分开,可得:
(b) 如考虑利用线性调频z变换算法,
则
12. 我们希望利用一个单位抽样响应为N=50个抽样的有限冲激响应滤波
器来过滤一串很长的数据。要求利用重叠保留法通过快速傅立叶变换
来实现这种滤波器,为了做到这一点 ,则:
(1) 输入各段必须重叠P个抽样点 ;
(2) 我们必须从每一段产生的输出中取出Q个抽样点,使这些从每一段得
到的抽样连接在一起时,得到的序列就是所要求的滤波输出。假设输
入的各段长度为100个抽样点,而离散傅立叶变换的长度为128点。
进一步假设,圆周卷积的输出序列标号是从n=0到n=127。
则:(a)求P ; (b)求Q; (c)求取出来的Q个点之起点和终点的标
号,即确定从圆周卷积的128点中要取出哪些点,去和前一段的
点衔接起来。
解:
(a) 由于用重叠保留法,如果冲激响应
h(n) 的点数为N点,则圆周卷积
结果的前面的(N-1)个点不代表线
性卷积结果。故每段重叠点数P为
P=N – 1 =50 – 1=49
(b) 每段点数为 27 =128,但其中只
有100个是有效输入数据,其余
28个点为补充的零值点。因而
各段的重叠而又有效的点数Q为
Q=100 – P=100 – 49 =51
(c) 每段128 个数据点中,取出来的
Q个点的序号为 n=49 到 n=99。
用这些点和前后段取出的相应点
连接起来,即可得到原来的长输
入序列。 另外,对于第一段数
据不存在前一 段问题,故在数据
之前必须加上P=N – 1 =49个
零值点,以免丢失数据。
13. 请用C语言编写程序:
(1) 按频率抽取的FFT算法 (2) 分裂基FFT算法
解:(1)
/*Free_Copy*/
/* C语言编写的频率抽取FFT算法(最大计算64点)*/
/* 输入: 序列点数、序列值 * /
/* 输出: 序列FFT变换后的数值及反变换(应与原序列相同 ) */
#include "conio.h"
#include "math.h"
#include "stdio.h"
#define N 64
#define PI 3.1415926
#define w0 (0.125*PI)
#define Cmul(a,b,c) a.x=b.x*c.x-b.y*c.y;a.y=b.x*c.y+b.y*c.x;
#define Cequal(a,b) a.x=b.x;a.y=b.y;
#define Cadd(a,b,c) a.x=b.x+c.x;a.y=b.y+c.y;
#define Csub(a,b,c) a.x=b.x-c.x;a.y=b.y-c.y;
#define Wn(w,r) w.x=cos(2.0*PI*r/n);w.y=-sin(2.0*PI*r/n);
struct comp
{
float x;
float y;
};
void main()
{
int i,j,nu2,nm1,n,m,le,le1,k,ip,z;
int flag,f,n1;
struct comp a[N],t,t1,w,d;
float a_ipx,m1;
printf("\nThis program is about FFT by DIF way. ");
printf("\nplease enter N : ");
scanf("%d",&n1);
n=n1;
m1=log(n1)/log(2);
m=log(n1)/log(2);
if (m!=m1) n=pow(2,m+1);
for(i=0;i<n;i++) {a[i].x=a[i].y=0.0;}
printf("\n");
for(i=0;i<n1;i++)
{
printf("\nplease enter data(%d)_[Re]: ",i);
scanf("%f",&a[i].x);
printf("\nplease enter data(%d)_[Im]: ",i);
scanf("%f",&a[i].y);
}
for(z=0;z<=1;z++)
{
flag=-1;
for (m=(log(n)/log(2));m>=1;m--)
{
le=pow(2,m);
flag++;
le1=le/2;
for( j=0;j<le1;j++)
{
for (i=j;i<=(n-1);i+=le)
{
ip=i+le1;
Cequal(t,a[i]);
Cequal(t1,a[ip]);
f=(int) (i*pow(2,flag))%n;
Wn(w,f);
Cadd(a[i],t,t1);
Csub(a[ip],t,t1);
a_ipx=a[ip].x;
if (z==1)
{
w.y*=-1;
}
a[ip].x=a[ip].x*w.x-a[ip].y*w.y;
a[ip].y=a_ipx*w.y+a[ip].y*w.x;
}
}
}
nu2=n/2;
nm1=n-2;
j=0;i=0;
while(i<=nm1)
{
if (i<j)
{
Cequal(d,a[j]);
Cequal(a[j],a[i]);
Cequal(a[i],d);
}
k=nu2;
while(k<=j)
{
j=j-k;k=k/2;
}
j=j+k;
i=i+1;
}
if(z==0)
{
printf("\n序列的fft是:\n\n");
}
else
printf("\n用ifft计算出的原序列是:\n\n" ) ;
for(i=0;i<n;i++)
if(z==0)
{
printf(" %7.3f",a[i].x);
if (a[i].y>=0)
printf(" + %7.3f j \n",a[i].y);
else
printf(" - %7.3f j \n",fabs(a[i].y));
a[i].y= -a[i].y;
}
else
{
printf(" %7.3f",a[i].x/n);
a[i].y=-a[i].y/n;
if (a[i].y>=0)
printf(" + %7.3f j \n",a[i].y);
else
printf(" - %7.3f j \n",fabs(a[i].y));
}
}
printf("\n");
}
(2);分 裂 基 FFT 算 法 程 序
/*Free_Copy*/
/*主程序:64点分裂基FFT算法*/
/*输入: 64点任意序列*/
/*输出: 序列的FFT变换*/
#include "conio.h";
#include"math.h"
#include"stdio.h"
#define PI 3.1415926
#define N 128
void main()
{
float x[N],y[N],xt;
float cc1,cc3,ss1,ss3;
float r1,r2,r3,s1,s2,a,a3,e,m1;
int n,n1,m,j,k,i;
int is,id,i0,i1,i2,i3,n2,n4;
printf("\nThis program is about FFT by SPEFT way. ");
printf("\nplease enter n : ");
scanf("%d",&n1);
n=n1;
m1=log(n1)/log(2);
m=log(n1)/log(2);
if (m!=m1) n=pow(2,m+1);
for(i=0;i<=N;i++)
{
x[i]=y[i]=0.0;
}
printf("\n");
for(i=1;i<=n1;i++)
{
printf("\nplease enter data(%d)_[Re]: ",i);
scanf("%f",&x[i]);
printf("\nplease enter data(%d)_[Im]: ",i);
scanf("%f",&y[i]);
}
j=1;
for (i=1;i<=n-1;i++)
{
if (i<j)
{
xt=x[j];
x[j]=x[i];
x[i]=xt;
xt=y[j];
y[j]=y[i];
y[i]=xt;
}
k=n/2;
while (k<j)
{
j=j-k;
k=k/2;
}
j=j+k;
}
is=1;
id=4;
while (is<n)
{
for (i0=is;i0<=n;i0+=id)
{
i1=i0+1;
r1=x[i0];
x[i0]=r1+x[i1];
x[i1]=r1-x[i1];
r1=y[i0];
y[i0]=r1+y[i1];
y[i1]=r1-y[i1];
}
is=2*id-1;
id=4*id;
}
n2=2;
for (k=2;k<=m;k++)
{
n2=n2*2;
n4=n2/4;
e=2.0*PI/n2;
a=0.0;
for (j=1;j<=n4;j++)
{
a3=3.0*a;
cc1=cos(a);
ss1=sin(a);
cc3=cos(a3);
ss3=sin(a3);
a=j*e;
is=j;
id=2*n2;
while (is<n)
{
for (i0=is;i0<=n-1;i0+=id)
{
i1=i0+n4;
i2=i1+n4;
i3=i2+n4;
r1=x[i2]*cc1+y[i2]*ss1;
s1=y[i2]*cc1-x[i2]*ss1;
r2=x[i3]*cc3+y[i3]*ss3;
s2=y [i3]*cc3-x[i3]*ss3;
r3=r1+r2;
r2=r1-r2;
r1=s1+s2;
s2=s1-s2;
x[i2]=x[i0]-r3;
x[i0]=x[i0]+r3;
x[i3]=x[i1]-s2;
x[i1]=x[i1]+s2;
y[i2]=y[i0]-r1;
y[i0]=y[i0]+r1;
y[i3]=y[i1]+r2;
y[i1]=y[i1]-r2;
}
is=2*id-n2+j;
id=4*id;
}
}
}
printf("\n分裂基fft结果是: \n ");
for (i=1;i<=n;i++)
展开阅读全文