现代信号处理大作业题目+答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
研究生“现代信号处理”课程大型作业
(以下四个题目任选三题做)
1. 请用多层感知器(MLP )神经网络误差反向传播(BP )算法实现异或问题(输入为
[00;01;10;11]X T =,要求可以判别输出为0或1)
,并画出学习曲线。其中,非线性函数采用S 型Logistic 函数。
2. 试用奇阶互补法设计两带滤波器组(高、低通互补),进而实现四带滤波器组;并画出其频响。滤波器设计参数为:F p =1.7KHz , F r =2.3KHz , F s =8KHz , A rmin ≥70dB 。
3. 根据《现代数字信号处理》(姚天任等,华中理工大学出版社,2001)第四章附录提供的数据(pp.352-353),试用如下方法估计其功率谱,并画出不同参数情况下的功率谱曲线:
1) Levinson 算法
2) Burg 算法
3) ARMA 模型法
4) MUSIC 算法
4. 图1为均衡带限信号所引起失真的横向或格型自适应均衡器(其中横向FIR 系统长M =11), 系统输入是取值为±1的随机序列)(n x ,其均值为零;参考信号)7()(-=n x n d ;信道具有脉冲响应:
12(2)[1cos()]1,2,3()20 n n h n W π-⎧+=⎪=⎨⎪⎩其它
式中W 用来控制信道的幅度失真(W = 2~4, 如取W = 2.9,3.1,3.3,3.5等),且信道受到均
值为零、方差001.02=v σ(相当于信噪比为30dB)的高斯白噪声)(n v 的干扰。试比较基
于下列几种算法的自适应均衡器在不同信道失真、不同噪声干扰下的收敛情况(对应于每一种情况,在同一坐标下画出其学习曲线):
1) 横向/格-梯型结构LMS 算法
2) 横向/格-梯型结构RLS 算法
并分析其结果。
图1 横向或格-梯型自适应均衡器
参考文献
[1] 姚天任, 孙洪. 现代数字信号处理[M]. 武汉: 华中理工大学出版社, 2001
[2] 杨绿溪. 现代数字信号处理[M]. 北京: 科学出版社, 2007
[3] S. K. Mitra. 孙洪等译. 数字信号处理——基于计算机的方法(第三版)[M]. 北京: 电子工
业出版社, 2006
[4] S.Haykin, 郑宝玉等译. 自适应滤波器原理(第四版)[M].北京: 电子工业出版社, 2003
[5] J. G. Proakis, C. M. Rader, F. Y. Ling, etc. Algorithms for Statistical Signal Processing [M].
Beijing: Tsinghua University Press, 2003
一、请用多层感知器(MLP)神经网络误差反向传播(BP)算法实现异或问题(输入为[00;01;10;11]
,要求可以判别输出为0或1),并画出学习曲线。其X T
中,非线性函数采用S型Logistic函数。
1、原理:
反向传播(BP)算法:
(1)、多层感知器的中间隐层不直接与外界连接,其误差无法估计。
(2)、反向传播算法:从后向前(反向)逐层“传播”输出层的误差,以间接算
出隐层误差。分两个阶段:
正向过程:从输入层经隐层逐层正向计算各单元的输出
反向过程:由输出层误差逐层反向计算隐层各单元的误差,并用此误差修正前层的权值。
2、流程图:
j
3、程序:
%使用了3层结构,第二层隐藏层4个单元。2,3层都使用Logisitic函数。%训练xor数据。
function mlp()
f= fopen('XOR.txt');
A = fscanf(f, '%g',[3 inf]);
A = A;
p = A(1:2, :)';%训练输入数据
t = A(3, :)';%desire out
[train_num , input_scale]= size(p) ;%规模
fclose(f);
accumulate_error=zeros(1,3001);
alpha = 0.5;%学习率
threshold = 0.005;% 收敛条件∑e^2 < threshold
wd1=0; wd2=0;
bd1=0; bd2=0;
circle_time =0;
hidden_unitnum = 4; %隐藏层的单元数
w1 = rand(hidden_unitnum,2);%4个神经元,每个神经元接受2个输入w2 = rand(1,hidden_unitnum);%一个神经元,每个神经元接受4个输入b1 = rand(hidden_unitnum,1);
b2 = rand(1,1);
while 1
temp=0;
circle_time = circle_time +1;
for i=1:train_num
%前向传播
a0 = double ( p(i,:)' );%第i行数据
n1 = w1*a0+b1;
a1 = Logistic(n1);%第一个的输出
n2 = w2*a1+b2;
a2 = Logistic(n2);%第二个的输出
a = a2;
%后向传播敏感性
e = t(i,:)-a;
accumulate_error(circle_time) = temp + abs(e)^2;
temp=accumulate_error(circle_time);
s2 = F(a2)*e; %输出层delta值
s1 = F(a1)*w2'*s2;%隐层delta值
%修改权值
wd1 = alpha .* s1*a0';
wd2 = alpha .* s2*a1';
w1 = w1 + wd1;
w2 = w2 + wd2;
bd1 = alpha .* s1;
bd2 = alpha .* s2;
b1 = b1 + bd1;
b2 = b2 + bd2;
end;%end of for
if accumulate_error(circle_time) <= threshold| circle_time>3001 %then break;
end;%end of if
end;%end of while
plot(accumulate_error,'m');
grid;
xlabel('学习次数')
ylabel('误差')
disp(['计算误差= ',num2str(accumulate_error(circle_time))] ) ;
disp(['迭代次数= ',num2str(circle_time)]);
%测试
a0 = double ([0 0]');
n1 = w1*a0+b1;
a1 = Logistic(n1);
n2 = w2*a1+b2;
a2 = Logistic(n2);
a = a2;
disp(['0 0 = ',num2str(a)]);
a0 = double ([0 1]');
n1 = w1*a0+b1;