1、 数字信号处理教程 课后习题及答案 目录 第一章 离散时间信号与系统 第二章 Z变换 第三章 离散傅立叶变换 第四章 快速傅立叶变换 第五章 数字滤波器的基本结构 第六章 无限长单位冲激响应(IIR)数字滤波器的设计方法 第七章 有限长单位冲激响应(FIR)数字滤波器的设计方法 第八章 数字信号处理中有限字长效应 第一章 离散时间信号与系统 1 .直接计算下面两个序列的卷积和 请用公式表示。 分析: ①注意卷积和公式中求和式中是哑变量( 看作参量)
2、 结果中变量是 , ②分为四步 (1)翻褶( -m ),(2)移位( n ),(3)相乘, ③ 如此题所示,因而要分段求解。 2 .已知线性移不变系统的输入为,系统的单位抽样响应 为,试求系统的输出,并画图 分析: ①如果是因果序列可表示成={,,……},例如小题(2)为={1,2,3,3,2,1} ; ② ; ③卷积和求解时,的分段处理。 3 .已知 ,通过直接计算卷积和的办法,试确定单位抽样响应为 的线性移不变系统的阶跃响应。 4. 判断下列每个序列是否是周期性的,若是周期性的,试确定其周期:
3、 分析: 序列为或时,不一定是周期序列, ①当整数,则周期为; ② ③当无理数 ,则不是周期序列。 5. 设系统差分方程为: 其中为输入,为输出。当边界条件选为 试判断系统是否是线性的?是否是移不变的? 分析:已知边界条件,如果没有限定序列类型(例如因果序列、反因果序列等),则递推求解必须向两个方向进行(n ³ 0及n < 0)。 ┇ ┇ ┇ ┇ ┇ ┇ 6.试判断:
4、 是否是线性系统?并判断(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. 以下序列是系统的单位抽
5、样响应,试说明系统是否是 (1)因果的,(2)稳定的? 分析: 注意:0!=1,已知LSI系统的单位抽样响应,可用来判断稳定性,用h(n)=0,n<0 来判断因果性。 9.列出下图系统的差分方程,并按初始条件,求输入为时的输出序列,并画图表示。 分析: “信号与系统”课中已学过双边Z变换,此题先写出H(z) 然后利用Z反变换(利用移位定理)在时域递推求解;也可直接求出序列域的差分方程再递推求解[注意输入为u(n)]。 解:系统的等效信号流图为: 10. 设有一系统,其输入输出关系由以下差分方程确定
6、 设系统是因果性的。 试求: 分析:小题(a)可用迭代法求解 小题(b)要特别注意卷积后的结果其存在的n值范围。 ┇ 分析:要想时域抽样后不产生失真的还原出原信号,则抽样频率()必须大于最高信号频率( )的2倍,即满足。 解:根据奈奎斯特定理可知: 分析:由于可知的非零范围为,h(n-m) 的非零范围为 解:按照题意,在区间之外单位抽样响应 皆为零;在区间 之外输入皆为零, 将两不等式相加可得: ,在此区间之外,的非零抽样互不重叠,故输出皆为零。由于题中给出输出除了区间之外
7、皆为零,所以有: 第二章 Z变换 1. 求以下序列的z变换,并画出零极点图和收敛域。 分析: Z 变换定义, n的取值是的有值范围。Z变换的收敛域 是满足 的z值范围。 解:(1) 由Z变换的定义可知: 解:(2) 由z变换的定义可知: 解:(3)
8、 解: (4) , 解:(5) 设 则有 而 ∴ 因此,收敛域为 : 解:(6) 2 . 假如的z变换代数表示式是下式,问可能有多少 不同的收敛域。 分析: 解 : 对X(Z)的分子和分母进行因式分解得 X(Z)的零点为 : 1/2 , 极点为 : j/2 , -j/2 , -3/4 ∴ X(Z)的收敛域为 :
9、 (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反变换
10、可得 x(n)。 留数定理法: (1)(i)长除法: 所以: (1)(ii)留数定理法: , 设 c为 内的逆时针方向闭合曲线: 当时, 在c内有 一个单极点 则 (1)(iii)部分分式法: 因为 所以 (2)(i). 长除法: , 因而 是左边序列,所以要按的 升幂排列:
11、 所以 (2)(ii)留数定理法: 内的逆时针方向闭合曲线 在c外有一个单极点 在c内有一个单极点 ∴ 综上所述,有: (2)(iii). 部分分式法: 则 因为 则是左边序列 所以 (3)(i). 长除法:
12、因为极点为,由可知,为 因果序列, 因而要按 的降幂排列: 则 所以 (3)(ii). 留数定理法: 内的逆时针方向闭合曲线。 (3)(iii). 部分分式法: 则 所以 4. 有一右边序列 ,其 变换为 (a) 将上式作部分分式展开(用 表示),由展开式求 。 (b) 将上式
13、表示成 的多项式之比,再作部分分式展开,由展开 式求 ,并说明所得到的序列与(a)所得的是一样的。 注意:不管哪种表示法最后求出x(n)应该是相同的。 解:(a) 因为 且x(n)是右边序列 所以 (b) 5.对因果序列,初值定理是,如果序列为 时 ,问相应的定理是什么? ,其z变换为: 分析: 这道题讨论如何由双边序列Z变换来求序列 初值,把序列分成因果序列和反因果序列两部分, [它们各自由求表达式是不同的],将它们 各自的相加即得所求。 若序列的Z变换为: 由题意可知:X
14、Z)的收敛域包括单位圆 则其收敛域应该为: 6. 有一信号,它与另两个信号和的 关系是: 其中 , 已知 , 分析: 解:根据题目所给条件可得: 而 所以 7. 求以下序列的频谱。 (1) (2) (3) (4) 分析:
15、可以先求序列的Z变换再求频率 即为单位圆上的Z变换,或者直接求序列的 傅里叶变换 解: 对题中所给的先进行z变换 再求频谱得: ∴ 8. 若是因果稳定序列,求证: 分析: 利用时域卷积则频域是相乘的关系来求解 再利用的傅里叶反变换,代入n = 0即可得所需结果。 证明: ∴ 9.求的傅里叶变换。 分析: 这道题利用傅里叶变换的定义即可求解,但最后结果应化为模和相角的关系。 解:根据傅里叶变换的概念可得:
16、 10. 设是如下图所示的信号的傅里叶变换, 不必求出,试完成下列计算: (a) (b) (c) (d) 分析: 利用序列傅里叶变换的定义、它的导数以及帕塞瓦公式 解: 由帕塞瓦尔公式可得: ∵ ∴ 即 由帕塞瓦尔公式可得: 11.已知有傅里叶变换,用表示下列信号的 傅里叶变换。 (a)(b) (c) 分析:
17、 利用序列翻褶后移位关系以及频域的取导数关系式来求解。 解: (c) 则 而 所以 12. 已知用下列差分方程描述的一个线性移不变因果系统 (a) 求这个系统的系统函数,画出其零极点图并指出其收敛区域; (b) 求此系统的单位抽样响应; (c) 此系统是一个不稳定系统,请找一个满足上述差分方程的稳 定的(非因果)系统的单位抽样响应。 分析: 则 , 要求
18、收敛域必须知道零点、极点 。收敛域为Z平面 某个圆以外,则为因果系统(不一定稳定),收敛域 若包括单位圆,则为稳定系统(不一定因果)。 (a) 对题中给出的差分方程的两边作Z变换,得: 所以 零点为z=0,极点为 因为是因果系统,所以|z|>1.62是其收敛区域。 零极点图如右图所示。
19、右边是本题的零极点图。 由于的收敛区域不包括单位圆,故这是个不 稳定系统。 (c) 若要使系统稳定,则收敛区域应包括单位圆,因此选的 收敛区域为 ,即 ,则 中第一项对应一个非因果序列,而第二项对应一个因果序列。 从结果可以看出此系统是稳定的,但不是因果的。 13. 研究一个输入为和输出为的时域线性离散移不变系 统,已知它满足
20、 并已知系统是稳定的。试求其单位抽样响应。 分析: 在Z变换域中求出, 然后和题12(c)一样分解成部分分式分别 求Z反变换。 解: 对给定的差分方程两边作Z变换,得: , 为了使它是稳定的,收敛区域必须包括 即可求得 14.研究一个满足下列差分方程的线性移不变系统,该系统 不限定为因果、稳定系统。利用方程的零极点图,试求 系统单位抽样响应的三种可能选择方案。 解 : 对题中给定的差分方程的两边
21、作Z变 换,得: 因此 其零点为 极点为 , 因为该系统不限定为因果,稳定系统,所以其收敛域情况有三种,分别如左图所示。 收敛域情况有: 零极点图一: 零极点图二: 零极点图三: 注:如果想要参看具体题解,请先选择方案,然后单击 解答 按键即可。 (1) 按12题结果(此处z1=2, z2=1/2), 可知当收敛区域为,则系统 是非稳定的,但是因果的。其单
22、 位抽样响应为: (2) 同样按12题,当收敛区域为 , 则系统是稳定的但是非因果的。 其单位抽样响应为: (其中 ) (3) 类似 , 当收敛区域为时, 则统是非稳定的,又是非因果的。 其单位抽样响应为: (其中 ) 15. 有一个用以下差分方程表示的线性移不变因果系统 当激励时,求系统的响应。请用z变换来求解。 分析: 两种解法: ①直接由Z变换Y(z)的关
23、系可得到y(n), ②由Y(z)用留数法可求得y(n)。 解法一: 已知, 将上式进行Z变换,得: 因此 令, 解法二: 差分方程进行Z变换后得: 其中 其收敛区域为。因为 是因果系统,且当时等 于零,所以 当 时,采用围线积分法,其中围线C 包围三个极点,所以 16. 下图是一个因果稳定系统的结构,试列出系统差分方程, 求系统函数。当 时,求系统单 位冲激响应 , 画出系统零极点图和频率响应曲线。 分析:
24、 解法一:利用此系统是一阶系统写出差分方程,令其二阶项系统为零, 可得一阶差分方程,取Z变换求得H(z)从而求得h(n)。 解法二:将系统用流图表示,改变流图中两个一阶节的级联次序 (线性系统服从交换定理),然后写出差分方程,再取Z变换 求得H(z)从而求得h(n)。 解法一:由图示可得 由方框图可看出:差分方程应该是一阶的 则有 因为此系统是一个因果稳定系统 ; 所以其收敛 解法二: 将图P2-11 画成流图结构,并化简如下: 由于线性流图的级
25、联结构可以改变级联次序,因而 上图又可化成: 由这个流图即可很方便地写出其线性差分方程: 取z变换可得: 所以 (由于系统是因果稳定的) 17.设是一离散时间信号,其z变换为,对下列信 号利用求它们的z变换: (a) ,这里△记作一次差分算子,定义为: (b) { (c) 分析: 式序列的抽取序列,是 内插零值序列(不是内插序列),解题的 关键是要进行变量变换,以得到与 的Z变换相似的表达式。 解: (a)
26、 (b) , (c)由此可设 第三章 离散傅立叶变换 1.如下图,序列x(n)是周期为6的周期性序列,试求其傅立叶级数的系数。 计算求得: 解:在一个周期内的计算值 7 。 10.
27、 ⑦。 解: (a) 方法一: 方法二证明 ( ɑ): 所以: (1)+(2) 得: 2) 由于: (4)+(5)得: (3)与(6)比较可知: 同理可证: (b) 利用(a)的结果: 证明:
28、 第四章 快速傅立叶变换 解: 解: ⑴ 直接计算: 复乘所需时间: 复加所需时间: ⑵用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
29、0.22 0.19 0.16 arg [] 10. 当实现按时间抽取快速傅立叶变换算法时,基本的蝶形计算 利用定点算术运算实现该蝶形计算时,通常假设所有数字都已按一定 比例因子化为小于1。因此在蝶形计算的过程中还必须关心溢出问题。 (a) 证明如果我们要求 则在蝶形计算中不可能出现溢出,即 似乎更容易些,也更适合些。问这些条件是否足以保证在蝶形 计算中不会出现溢出?请证明你的回答。 证明:(a)
30、 解:(a) 若直接利用10点快速傅立叶变换算法,则: 将n为偶数与n为奇数的部分分开,可得: (b) 如考虑利用线性调频z变换算法, 则 12. 我们希望利用一个单位抽样响应为N=50个抽样的有限冲激响应滤波 器来过滤一串很长的数据。要求利用重叠保留法通过快速傅立叶变换 来实现这种滤波器,为了做到这一点 ,则: (1) 输入各段必须重叠P个抽样点 ; (2) 我们必须从每一段产生的输出中取出Q个抽样点,使这些从每一段得 到的抽样连接在一起时,得到的序列就是
31、所要求的滤波输出。假设输 入的各段长度为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,但其中只
32、 有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_C
33、opy*/ /* 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; #d
34、efine 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;
35、 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 36、y=0.0;}
printf("\n");
for(i=0;i 37、 {
le=pow(2,m);
flag++;
le1=le/2;
for( j=0;j 38、 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 39、x;
}
}
}
nu2=n/2;
nm1=n-2;
j=0;i=0;
while(i<=nm1)
{
if (i 40、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 41、[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)
42、 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 43、"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. ");
pr 44、intf("\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 45、);
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 46、 y[i]=xt;
}
k=n/2;
while (k 47、 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;
48、 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 49、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]+ 50、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++)






