📄 system_1.m
字号:
function [sampl,re_sampl]=system_1(A,F,P,D,snr,N)
%输入变量A ,F,P分别为输入信号的幅度、频率和相位,D为量化电平数,snr
%为信道信噪比,N为D/A转换时的内插点数;输出变量sampl为抽样后的输入
%信号,re_sampl为恢复出的输入信号。
%数字基带传输系统的MATLAB仿真实现%
%以下列出你自己编写的代码%
[samp1,quant,pcm2]=a_d_1(A,F,P,D);
psk_sig=modulat_1(pcm2,fc,fd,fs);
psk_after_channel=channel_1(psk_sig,snr);
adjudge_psk=adjudg_1(psk_after_channel);
re_pcm=demodul_1(adjudge_psk,fc,fd,fs);
[re_voltag,re_sampl]=d_a_1(re_pcm,D,N);
% A/D**********************************
function[sampl,quant,pcm2]=a_d_1(A,F,P,D)
Fs=20*F; %抽样信号sampl的波形
t=0:1/Fs:2/F;
sampl=A*sin(2*pi*F*t+P);
subplot(3,1,1);
c=sampl/max(sampl);
plot(t,sampl,'g*-');
partition=[-1:2/D:1];
codebook=[-1-1/D:2/D:1];
[indx,quant]=quantiz(c,partition,codebook);
indx=indx-1;
ind=zeros(length(indx),1);
i=1;
while i<=length(indx)
if indx(i,1)==-1
indx(i,1)=0
end
i=i+1;
end
a=min(quant); %对信号消顶
i=1;
while i<=length(quant)
if quant(1,i)==a
quant(1,i)=quant(1,i)+2/D
end
i=i+1;
end
pcm=dec2bin(indx,ceil(log2(D))); %对量化后信号编码
pcm1=reshape(pcm',1,length(pcm)*ceil(log2(D)));
for i=1:length(pcm1)
pcm2(i)=str2num(pcm1(i))
i=i+1;
end
%调制*****************************************
function psk_sig=modulat_1(pcm2,fc,fd,fs)
A_pcm=zeros(1,length(pcm2));
k=1;
for i=1:length(pcm2)
if pcm2(i)=='1'
A_pcm(k)=1
k=k+1;
elseif pcm2(i)=='0'
A_pcm(k)=0
k=k+1;
else A_pcm(k)=pcm2(i)
k=k+1;
end
end
a=A_pcm; %PCM2转换成数字型
psk_sig=dmod(a,fc,fd,fs,'psk');
%进入信道***************************************
function psk_after_channel=channel_1(psk_sig,snr);
n1=length(psk_sig);
psk_sig=psk_sig(:);
psk_sig_a=zeros(n1,1);
psk_sig_a=psk_sig_a(:); %产生列向量
for i=1:n1
if ischar(psk_sig(i))==1
psk_sig_a(i)=str2num(psk_sig(i));
else psk_sig(i)=psk_sig(i);
end
end
psk_after_channel=awgn(psk_sig,snr);
%抽样判决******************************
function adjudge_psk=adjudg_1(psk_after_channel)
n2=length(psk_after_channel);
adjudge_psk=zeros(1,n2);
for i=1:n2
if ischar(psk_after_channel)==1
psk_after_channel(i)=str2num(psk_after_channel);
end
end
for i=1:n2
if round(psk_after_channel(i))==1
adjudge_psk(i)=1;
elseif round(psk_after_channel(i))==0
adjudge_psk(i)=0;
else adjudge_psk(i)=-1;
end
end
%解调****************************************
function re_pcm=demodul_1(adjudge_psk,fc,fd,fs)
for i=1:length(adjudge_psk)
if ischar(adjudge_psk(i))==1
adjudge_psk=str2num(adjudge_psk(i));
end
end
re_pcm=ddemod(adjudge_psk,fc,fd,fs,'psk',2);
% d/a******************************************
function [re_voltag,re_sampl]=d_a_1(re_pcm,D,N)
for i=1:length(re_pcm)
if ischar(re_pcm(i))==1;
re_pcm(i)=str2num(re_pcm(i));
end
end
n=ceil(log2(D));
for i=2:n
if rem(length(re_pcm),n);
k=rem(length(re_pcm),n);
B=zeros(1,(n-k));
re_pcm1=[re_pcm,B];
else re_pcm1=re_pcm;
end
end
re_pcm1=re_pcm1(:);
m=ceil(length(re_pcm1)/n);
for i=1:m
A=re_pcm1((i-1)*n+1:(i-1)*n+n);
C=reshape(A,1,n);
E=fliplr(C);
sum=0;
for j=1:n
sum=sum+E(j)*2^(j-1);
V(i)=sum;
end
end
s=2/D;
for i=1:m
re_voltag(i)=(V(i)*s+s/2-1);
end
for i=1:length(re_voltag)
re_sampl((i-1)*(N+1)+1)=re_voltag(i);
for k=2:N
re_sampl((i-1)*(N+1)+k)=0;
end
end
h1=zeros(1,N);
for j=1:N
h1(j)=j/(N+1);
end
h=[0,h1,1,fliplr(h1),0];
h=h(:);
re_sampl=conv(h,re_sampl);
subplot(3,1,2);
plot( re_voltag,'m-*');
subplot(3,1,3)
plot(re_sampl,'k*');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -