数字基带传输系统设计与性能研究 | 字数总计: 2.6k | 阅读时长: 10分钟 | 阅读量:
[collapse title=”仅供参考学习 抄袭与本人无关”]
[/collapse]
子函数
双极性信源信号产生子函数 SourceSignal
实现思路:通过rand(1,L)生成1×L,取值在(0,1)内的矩阵。当矩阵中元素的值小于0.5时,用-1替换;当大于0.5时,用1替换。即可得到取值为-1或1、长度为L的均匀分布双极性序列。
1 2 3 4 5 6 7 8 9 10 function an = SourceSignal (L) an=rand (1 ,L); for i =1 :L if an(i )<0.5 an(i )=-1 ; else an(i )=1 ; end end end
实现思路:首先定义一个1×A*L的矩阵dn,对矩阵dn每隔A插入an的对应元素,得到周期为A的发送信号。
1 2 3 4 5 6 7 8 function dn = SendSignal (an,A) L = length (an); dn = zeros (1 ,A*L); for i = 1 : L dn(A*(i -1 )+1 )=an(i ); end end
升余弦滚降滤波器(非匹配)生成子函数RaisedCosine
实现思路:窗函数法设计。通过升余弦滚降滤波器的单位冲激响应时域表达式得到滤波器序列hn,但是因为在-(N-1)/2:(N-1)/2的范围内,会出现数值溢出的情况,所以需要加判断处理数溢出情况,且对对称中心赋值1。再利用布莱克曼窗的时域表达式得到窗序列wn,将hn和wn相乘完成滤波器加窗得到hf,将hf以二进制形式写入filter.bin二进制文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function [hn,wn,hf] = RaisedCosine (N,a) Tc = 4 ; n = -(N-1 )/2 : (N-1 )/2 ; hn = sin (pi *n/Tc).*cos (a*pi *n/Tc)./(pi *n/Tc)./(1 -4 *a*a*n.*n/Tc/Tc); for i = 1 : N if (n(i ) == 0 ) hn(i ) = 1 ; elseif (1 -4 *a*a*n(i )*n(i )/Tc/Tc == 0 ) hn(i ) = 0 ; end end n=0 :N-1 ; wn=0.42 -0.5 .*cos (2. *pi .*n./(max (n)-1 ))+0.08 .*cos (4. *pi .*n./(max (n)-1 )); hf = hn .*wn; fid = fopen('filter.bin' ,'wb' ); fwrite(fid,hf,'double' ); fclose(fid); end
平方根升余弦滤波器(匹配)生成子函数SRRaisedCosine
实现思路:频率抽样法设计。通过升余弦滚降滤波器的单位冲激响的频率响应通过if语句分段写出,得到频率响应序列Hf,再经过开方和IDFT变换得到平方根升余弦滤波器的单位冲激响应时域序列hp,将hp以二进制形式写入filter.bin二进制文件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 function hp = SRRaisedCosine (N,a) hp = f_sampling(N,a); fid = fopen('filter.bin' ,'wb' ); fwrite(fid,hf,'double' ); fclose(fid); end function hp = f_sampling (N,a) k = -(N-1 )/2 :(N-1 )/2 ; n = k; fs = 1 ; f = k*fs/N; Tc = 4 ; f1 = (1 -a)/(2 *Tc); f2 = (1 +a)/(2 *Tc); Hf = zeros (1 ,N); for i = 1 : N if (abs (f(i ))<f1) Hf(i ) = Tc; elseif (abs (f(i ))<f2) Hf(i ) = Tc/2 *(1 +cos (pi *Tc/a*(abs (f(i ))-(1 -a)/(2 *Tc)))); else Hf(i ) = 0 ; end end Hf1 = sqrt (Hf); hp = 1 /N*Hf1*exp (j *2 *pi /N*k'*n); end
实现思路:将滤波器冲激响应h和发送信号dn进行卷积的xn,并对xn进行截断,最后得到发送滤波器输出信号xn。
1 2 3 4 5 6 function xn =SendOut (h,dn,A,L) xn=conv(h,dn); N=length (h); xn=xn(round ((N+1 )/2 ):round ((N+1 )/2 -1 +L*A)); end
实现思路:在每次调用时先将Eb归0,然后遍历发送序列xn,将每个码元幅值的平方累加到Eb上,最后除以序列长度L,就得到了每比特平均能量。
1 2 3 4 5 6 7 function Eb =Average_energy (xn,L) Eb=0 ; for i = 1 : LEb=Eb+abs (xn(i ))^2 ; end Eb=Eb/L; end
实现思路:利用SNR=10lg(Eb/N0)可得出需要的噪声N0为多少,噪声的方差sigma=N0/2,利用方差*rand函数产生的标准正态分布随机数就可以得到方差为sigma的高斯分布随机数,从而实现了根据SNR产生相应大小的高斯白噪声的需求。
1 2 3 4 5 6 7 function ni =Gaussin (SNR,Eb,xn) N0=Eb/(10 ^(SNR/10 )); sigma=sqrt (N0/2 ); ni=0 +sigma*randn (1 ,length (xn)); histogram(ni); title('高斯白噪声' ) end
实现思路:信道输出=信道输入+高斯白噪声
1 2 3 function aout =AWMGchannel (xn,ni) aout=xn+ni; end
实现思路:如果使用非匹配滤波器,那么接收滤波器输出就等于信道的输出,如果使用匹配滤波器,接收滤波器的输出就等于信道输出卷积上接收滤波器的冲激响应。
1 2 3 4 5 6 7 8 function re =receiptout (N,h,L,flag,aout,A) if flag==0 re=aout; else re=conv(aout,h); re=re(round ((N+1 )/2 ):round ((N+1 )/2 -1 +L*A)); end end
实现思路:眼图的实现实际上非常简单,只需要先在图上画出一个信号周期的波形(在本系统中也就是接受滤波器中的4个点),然后使用hold on,再画下一个周期的信号,如此循环直到遍历完接收滤波器输出序列就可以得到系统的眼图。
1 2 3 4 5 6 7 8 9 10 11 12 13 function [sp,jdout] =judgement (re,L,A) jdout=zeros (L,1 ); for i =1 :L sp(i )=real (re((i -1 )*A+1 )); end for i =1 :L if sp(i )>0 jdout(i )=1 ; else jdout(i )=-1 ; end end end
实现思路:先对接收滤波器的输出进行抽样,得到长度为L的采样序列sp,然后分别判断sp的每个码元属于判决阈值的那边,从而判断发送的是哪个信号,在本系统中,那就是将sp(i)的值与0比较。
1 2 3 4 5 6 7 8 9 10 11 function eyes = eyediagram1 (re,L,Tb) eyes = 0 ; figure ('name' ,'眼图' );for i = 1 :(8 *Tb):(Tb*(L-8 )) for j = 1 :8 *Tb eyes(j ) = re(i +j -1 ); end plot (eyes,'b' );hold on; end hold off;end
实现思路:遍历判决输出序列和信源发送序列,统计有多少码元不同,就可以得到误码率。
1 2 3 4 5 6 7 8 9 10 function BER (an,jdout,L) BE=0 ; for i =1 :L if an(i )~=jdout(i ) BE=BE+1 ; end end Pe=BE/L; fprintf('误码率:%4.2f%%\n' ,Pe*100 ); end
实现思路:对于抽样序列sp,先根据发送序列是0还是1分成2堆,一堆用红色表示,另一堆用蓝色表示,然后使用plot将两堆数据花在一个图上即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function constellation (sp,L,an) j = 1 ;k = 1 ; for i =1 :L if an(i ) == 1 x1(j )=sp(i ); j = j +1 ; else x2(k)=sp(i ); k = k+1 ; end end figure ('name' ,'星座图' ); plot (x1,zeros (1 ,length (x1)),'.b' ,x2,zeros (1 ,length (x2)),'.r' );title('星座图' ); end
系统主程序 调用所有子函数实现一个数字基带传输系统的仿真,主程序的运行可视为整个数字基带系统的传输。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 close all; clear; clc; A = 4 ; L = input("请输入信源序列长度:" ); an = SourceSignal(L); dn = SendSignal(an,A); flag = input("请选择滤波器模式:0. 非匹配滤波器模式 1. 匹配滤波器模式:" ); a = input("请输入滤波器滚降系数α:" ); N = input("请输入滤波器长度N:" ); if (flag == 0 ) [hn,wn,h] = RaisedCosine(N,a); elseif (flag == 1 ) h = SRRaisedCosine(N,a); end fid = fopen('filter.bin' ,'rb' ); h = fread(fid,'double' ); fclose(fid); xn = SendOut(h,dn,A,L); Eb = Average_energy(xn,L); SNR = input("请输入信噪比SNR:" ); ni = Gaussin(SNR,Eb,xn); aout = AWMGchannel(xn,ni); re = receiptout(N,h,L,flag,aout,A); [sp,jdout] = judgement(re,L,A);
滤波器性能测试与数据分析 通过仿真项目探究非匹配滤波器与匹配滤波器的性能差别和滤波器参数(滤波器长度、滚降系数)对滤波器性能(第一零点带宽、阻带最小衰减等)的影响。
滤波器性能(第一零点带宽和阻带最小衰减)测试程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 close all; clear; clc; N = 40 ; for a = 0.05 :0.1 :0.95 h = RaisedCosine(N,a); [Hw,w] = freqz(h); wq = min (w):max (w)/length (w)/1000 :max (w); Hx = interp1(w,Hw,wq); for i = 2 :length (Hx) if ((abs (Hx(i ))<abs (Hx(i -1 )))&&(abs (Hx(i ))<abs (Hx(i +1 )))&&(abs (Hx(i ))<0.1 )) disp (['第一零点带宽为' ,num2str(wq(i )),' rad/s' ]); break ; end end dbi = 20 *log (abs (Hx)/max (abs (Hx))); for j = i :length (dbi) if ((dbi(j )>dbi(j -1 ))&&(dbi(j )>dbi(j +1 ))) disp (['阻带最小衰减为' ,num2str(dbi(j )),' dB' ]); break ; end end fprintf('\n' ); end