当前位置:首页 > 南邮现代信号处理最后大作业4道题目(含答案)
南邮研究生“现代信号处理”期末课程大作业
(四个题目任选三题做)
1. 请用多层感知器(MLP)神经网络误差反向传播(BP)算法实现异或问题(输入为,并画出学习曲线。其中,非线性函数X?[0 0;0 1;1 0;1 1]T,要求可以判别输出为0或1)采用S型Logistic函数。
2. 试用奇阶互补法设计两带滤波器组(高、低通互补),进而实现四带滤波器组;并画出其频响。滤波器设计参数为:Fp=1.7KHz, Fr=2.3KHz, Fs=8KHz, Armin≥70dB。
3. 根据《现代数字信号处理》(姚天任等,华中理工大学出版社,2001)第四章附录提供的数据(pp.352-353),试用如下方法估计其功率谱,并画出不同参数情况下的功率谱曲线: 1) Levinson算法 2) Burg算法 3) ARMA模型法 4) MUSIC算法
4. 图1为均衡带限信号所引起失真的横向或格型自适应均衡器(其中横向FIR系统长M=11), 系统输入是取值为±1的随机序列x(n),其均值为零;参考信号d(n)?x(n?7);信道具有脉冲响应:
2?(n?2)?1)] n?1,2,3?[1?cos( h(n)??2W?? 0 其它式中W用来控制信道的幅度失真(W = 2~4, 如取W = 2.9,3.1,3.3,3.5等),且信道受到均
2值为零、方差?v?0.001(相当于信噪比为30dB)的高斯白噪声v(n)的干扰。试比较基
于下列几种算法的自适应均衡器在不同信道失真、不同噪声干扰下的收敛情况(对应于每一种情况,在同一坐标下画出其学习曲线): 1) 横向/格-梯型结构LMS算法 2) 横向/格-梯型结构RLS算法 并分析其结果。
图1 横向或格-梯型自适应均衡器
一、请用多层感知器(MLP)神经网络误差反向传播(BP)算法实现异或问题(输入为X?[0 0;0 1;1 0;1 1]T,要求可以判别输出为0或1),并画出学习曲线。其中,非线性函 数采用S型Logistic函数。
1、原理:
反向传播(BP)算法:
(1)、多层感知器的中间隐层不直接与外界连接,其误差无法估计。
(2)、反向传播算法:从后向前(反向)逐层“传播”输出层的误差,以间接算出隐层误差。分两个阶段:
正向过程:从输入层经隐层逐层正向计算各单元的输出
反向过程:由输出层误差逐层反向计算隐层各单元的误差,并用此误
差修正前层的权值。 2、流程图:
从后向前计算隐层 前向计算求所有神经元的输出 开始 选择初始值 计算输出层
是否收敛? Y 结束 计算保存权值修正量 修正权值 N 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, :)';Tsire 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 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; a1 = Logistic(n1); n2 = w2*a1+b2; a2 = Logistic(n2); a = a2;
disp(['0 1 = ',num2str(a)]); a0 = double ([1 0]'); n1 = w1*a0+b1; a1 = Logistic(n1); n2 = w2*a1+b2; a2 = Logistic(n2); a = a2;
disp(['1 0 = ',num2str(a)]); a0 = double ([1 1]'); n1 = w1*a0+b1;
%then
共分享92篇相关文档