clear;
close all;
% initialization
%%%待发送的文字
Letter_Tr='XiaMenUniversity1234567890abcdefghijklmnopqrsthshiuywqXiamenNni';
%%%转换成二进制信息
Bit_Tr = double (reshape (dec2bin (double (Letter_Tr), 8)', 1, length (Letter_Tr) * 8)) - '0';
f0=4000; %signal frequency
fc=16000; % carrier frequence
fs=96000; % sampling frequency
snr=5;
ml=1; % modulation of level ml=1 BPSK,ml=2 QPSK
nb=length(Bit_Tr); % number of transmiting bit
t=0:1/fs:nb*(1/f0)-1/fs;
N=length(t) % number of samples
symlen=N/nb; %一个bit的点数
datanrz=2*Bit_Tr-1; % translate source data into NRZ code
idata=datanrz(1:nb);
ich=zeros(1,nb*symlen);
for i=1:nb
ich((i-1)*symlen+1:i*symlen)=idata(i);
end
for ii=1:N
a(ii)=cos(2*pi*fc*t(ii));
b(ii)=sin(2*pi*fc*t(ii));
end
idata1=ich.*a;
qdata1=ich.*b;
% idata4=idata1.*a;
% qdata4=qdata1.*b;
% amp=sqrt(0.5/(10^(snr/10))); %%%%%%%%%加噪声
% ss=idata1+amp*randn(size(idata1));
ss=awgn(idata1,snr);
H1 = [0.05 -0.063 0.088 -0.126 -0.25 0.9047 0.25 0 0.126 0.038 0.088];
%H1=[1 -0.0509 0.0049 0.1351 0.6565 0.4899 0.1876 -0.0367];
H2=[0.3122 -0.1040 0.8908 0.3134];
befores=ss(1:1920);
backs=ss(1921:length(ss));
ss1=[filter(H2,1,befores) filter(H1,1,backs)];
idata2=ss1.*a; % multiply carrier
%低通滤波器
Num = remez(20,[0 0.35 0.4 1],[1 1 0 0]);
idata22=filter(Num,1,idata2);
qdata2=ss.*b; % multiply carrier
%低通滤波器
Num1 = remez(20,[0 0.35 0.4 1],[1 1 0 0]);
qdata22=filter(Num1,1,qdata2);
%equalization
mu=0.01;%%% 迭代步长
K=3;
NN=3072;
test1=ich;
mse_av=zeros(1,NN-2*K);
estimated_c=zeros(1,2*K+1);
estimated_c(K+1)=1;
for k=1:NN-2*K,
y_k=idata22(k:k+2*K);
z_k=estimated_c*y_k.';
e_k=test1(k)-z_k;
estimated_c=estimated_c+mu*e_k*y_k;
mse(k)=e_k^2;
end
mse_av=mse_av+mse;
figure
plot(mse_av);
xlabel('迭代次数');
ylabel('MSE');
yy=[idata22(3073:length(idata22)) zeros(1,2*K)];
Nn=length(yy);
for k=1:Nn-2*K,
y_k=yy(k:k+2*K);
z_k=estimated_c*y_k.';
z1(k)=z_k;
end
%equalization
mu2=0.001;
KK=10;
NNN=3072;
test2=qdata1;
mse_av2=zeros(1,NNN-2*KK);
estimated_c2=zeros(1,2*KK+1);
estimated_c2(KK+1)=1;
for k=1:NNN-2*KK,
y_k2=qdata22(k:1:k+2*KK);
z_k2=estimated_c2*y_k2.';
e_k2=test2(k)-z_k2;
estimated_c2=estimated_c2+mu2*e_k2*y_k2;
mse2(k)=e_k2^2;
end
mse_av2=mse_av2+mse2;
% figure
% plot(1:NNN-2*KK,mse_av2);
yy=[qdata22(3073:length(idata22)) zeros(1,2*KK)];
Nn2=length(yy);
for k=1:Nn2-2*KK,
y_k2=yy(k:1:k+2*KK);
z_k2=estimated_c2*y_k2.';
z2(k)=z_k2;
end
% integral and decision
idata3=zeros(1,nb-128);
qdata3=zeros(1,nb-128);
for n=1:nb-128
ichsum(n)=sum(z1((n-1)*symlen+1:n*symlen))/(symlen);
if ichsum(n)>=0
idata3(n)=1;
else idata3(n)=0;
end
qchsum(n)=sum(z2((n-1)*symlen+1:n*symlen))/(symlen);
if qchsum(n)>=0
qdata3(n)=1;
else qdata3(n)=0;
end
end
% P/S conversion
demodata=zeros(1,nb-128);
demodata(1:nb-128)=idata3;
Bit_Tr1=Bit_Tr(129:504);
num_ber=sum(abs(Bit_Tr1-idata3))
L2=length(demodata)/8;
% 将解调出来的二进制信息恢复成字母
Letter_Recover=char(bin2dec(char(reshape(demodata,8,L2)'+'0')))'
%calculate number of error
%
% figure(2)
% c=1:nb;
% plot(c,ichsum,'.');
figure(2)
for i=1:nb-128
plot(ichsum(i),qchsum(i),'.');hold on;
end
xlabel('实部');
ylabel('虚部');
% plot(mse33(1:1000));
% xlabel('迭代次数');
% ylabel('MSE');
% % figure(1)
% subplot(2,1,1)
% plot(idata2(1:500));
% subplot(2,1,2)
% plot(idata22(1:500));