📄 bsc.m
字号:
% 读取lena.jpc
f = fopen('lena_gray.j2c','r');
im = fread(f);
fclose(f);
% im = randint(1,495,[1 255]); %小数据测试
%RS编码
%k个数据为一组,在im尾部补0形成k的整数倍码流
n = 255;
k = 223;
N = ceil(length(im)/k);
im_filled = zeros(1,N*k);
im_filled(1:length(im)) = im;
im_block = reshape(im_filled,k,N);
im_block_gf = gf(im_block',8);
imenc_block_gf = rsenc(im_block_gf,n,k);
imenc_stream_gf = reshape(imenc_block_gf',1,N*n);
imenc_stream = imenc_stream_gf.x; %gf域变量变为uint
%进制转换
imenc_char = dec2bin(imenc_stream,8); %uint变量z转换成char型
imenc_bin = [];
for i =1:length(imenc_char) %char型转换成二进制
for j = 1:8
temp = bin2dec(imenc_char(i,j));
imenc_bin = [imenc_bin temp];
end
end
%BPSK调制
im_bpsk = imenc_bin;
%经过BSC信道
for i = 1:length(imenc_bin)
w = randint(1,1,[1 100]); %建立概率模型,设误码率Pe为10^-3
if(w<=1)
imenc_bin(1,i) = ~imenc_bin(1,i);
end
end
% %经过信道,加白噪声
% snr_db = ??;
% snr = 10^(snr_db/10);
% signal_power = (norm(im_bpsk)^2)/length(im_bpsk);
% noise_power = signal_power/snr;
% noise = sqrt(noise_power)*randn(1,length(N*n));
% im_noi = noise + im_bpsk;
%接收端解码
for i = 1:length(imenc_stream) %二进制转换成一维十进制行向量
temp = imenc_bin(1,(i-1)*8+1:i*8);
im_rec(1,i) = bin2dec(dec2bin(temp)');
end
imrec_gf = gf(im_rec,8);
im_dec = [];
for i = 1:N
temp = imrec_gf(1,(i-1)*n+1:i*n);
im_dec = [im_dec rsdec(temp,n,k)];
end
im_dec = double(im_dec.x);
%解码后图像文件还原
im_reconstr = im_dec(1:length(im));
f = fopen('lena_reconstr.jpc','w+');
fwrite(f,im_reconstr);
fclose(f);
%计算PSNR
Lmax =n; %对于256个灰度级的黑白图像,Lmax =255
mse = 0;
for i = 1:length(im_reconstr)
mse = mse + (im_reconstr(i)- im(i)).^2;
end
mse = mse/length(im_reconstr);
Psnr = 10*log10(Lmax.^2/mse);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -