2PSK modulation and demodulation, coding and decoding, and its bit error rate, power spectrum (voice signal)

off-the-shelf recording

%% --通信原理大作业-- %%
clear;
clc;
close all;
%% 音频录制
% 44100表示采样为44100Hz(可改为8000, 11025, 22050)等,此数值越大,录入的音质越好
% 8为用8bits存储,2为两通道即立体声(也可以改为1即单声道)
voice = audiorecorder(44100,8,2);
Rtime = 5;  %录制时间
fprintf("录制倒计时:");pause(1);
fprintf('1...');pause(1);
fprintf('2...');pause(1);
fprintf('3...');pause(1);
fprintf("\n开始录制...");
recordblocking(voice,Rtime);
fprintf("\n结束录制...\n");

MyRecording=getaudiodata(voice);    %得到以n*2列数字矩阵存储的刚录制的音频信号
filename='myspeech.wav';
audiowrite(filename,MyRecording,44100);%MyRecording表示要存入的波形矩阵,44100表采样率,'myspeech'为存储的文件名
clear voice;
%% 信号预处理
Fs_low = 8e3;        %降采样频率
[x,fs]=audioread(filename);              %打开语音信号
x1 = x(:,2);                                      %取单声道
Xn = resample(x1,Fs_low,fs);                      %降采样率
%% 预设参数
Eb_N0 = 1:10;        %信道信噪比
Ts_low = 1/Fs_low;   %降采样后的采样间隔
fc = 1e5;            %载波频率
Fs = 8e6;            %总采样率
Ts = 1/Fs;
T_end = length(x1)/fs;        %采样时间终点
Time = Ts:Ts:T_end;           %传输总时间片
N_sample = length(Time);      %总采样点数
sig_rate = length(Xn)*8/T_end;%信号传输速率设定
t_sig = 1/sig_rate;            
%% 原始信号处理
PCM_code = PCMencoding(Xn);                       %抽样信号编码
PCM_code = int8(reshape(PCM_code,1,[]));          %变换为向量
PCM_len = length(PCM_code);
                  
DBNRZ_code = 2*PCM_code-1;                        %将PCM后的01码变为双极性不归零码

%% 统一时间轴/对所有信号进行等采样率采样
NRZ_sample = zeros(1,N_sample);
msg_sample = zeros(1,N_sample);
carrier_sample = zeros(1,N_sample);
BPSK_sig = zeros(1,N_sample);

idx1 = 1;                             %创建索引号
for i = 1:N_sample
    idx1 = ceil(Time(i)/t_sig);
    if(idx1>PCM_len)
        idx1 = PCM_len;
    end
    NRZ_sample(i) = PCM_code(idx1);
    msg_sample(i) = DBNRZ_code(idx1);
	carrier_sample(i) = cos(2*pi*fc*Time(i));       %生成载波
    BPSK_sig(i) = msg_sample(i)*carrier_sample(i);  %BPSK调制
end
%% 信号在AWGN信道中传输后被接收、解调、译码
demodu_sig = zeros(1,N_sample);
bit_error = zeros(1,length(Eb_N0));
str_error = zeros(1,length(Eb_N0));
SNR = zeros(1,length(Eb_N0));
for indx = 1:length(Eb_N0)
    %************信号通过AWGN信道*************%
    transf_sig = awgn(BPSK_sig,Eb_N0(indx),'measured');  %使信号在AWGN信道下传输
    %************将接收的信号解调*************%
    demodu_sig = transf_sig.*carrier_sample;     %载波剥离
    %*****************信号累加****************%
    sum_Decode = sum_decode(demodu_sig,Time,t_sig,PCM_len);
    %*****************抽样判决****************%
    Judge_code = My_Judge(sum_Decode);
    %*******************译码******************%
    absolute_decode = (1+Judge_code)/2;                  %还原单极性01码
    temp_decode = reshape(absolute_decode,[],8);         %矩阵变换便于PCM解码
    PCM_decode = PCMdecoding(temp_decode);               %PCM解码
    Xn_decode = (PCM_decode/max(abs(PCM_decode)))';      %解码后归一化(数据还原)
    %****BPSK调制信号在AWGN信道下的性能分析****%
    SNR(indx) = mean(Xn.^2)/mean((Xn_decode-Xn).^2);               %PCM量噪比
    [error1,bit_error(indx)] = biterr(PCM_code,absolute_decode);   %传输信号误比特率
end
snr = 10.^(Eb_N0/10);                            %%信噪比转换为线性值
str_err_theo = 2*qfunc(sqrt(snr)*sin(pi/2));     %%理论误符号率
bit_err_theo = 1/log2(2)*str_err_theo;           %%理论误比特率
%% 语音播放
sound(x,fs);                    %播放原始语音信号
pause(T_end);
sound(Xn_decode,Fs_low);        %播放解码译码后的语音信号

%% ------------------------- 画图部分 ---------------------------- %%
%%
%----------------画原始音频信号图-------------%
figure;
[F1,M1]=My_FFT(x,fs);                 %对原始信号做FFT变换
Ty = 1/fs;
Time_y = Ty:Ty:T_end;
subplot(2,1,1);
plot(Time_y,x);                       %做原始语音信号的时域波形图
title('原始语音信号时域图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(2,1,2);                      
plot(F1,M1);title('原始语音信号频谱'); %做原始语音信号的频谱图
xlabel('频率(f/Hz)');ylabel('幅度');
clear F1 M1;
%%
%----------画基带信号的双极性不归零信号--------%
[F3,M3] = My_FFT(msg_sample,Fs);
figure;
subplot(211);
plot(Time,msg_sample);title('基带信号双极性不归零码波形');
axis([5e-3 10e-3 -2 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F3,M3);title('基带信号双极性不归零码的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F3 M3;
%%
%----------画基带信号的单极性不归零信号--------%
[F4,M4] = My_FFT(NRZ_sample,Fs);
figure;
subplot(211);
plot(Time,NRZ_sample);title('基带信号单极性不归零码波形');
axis([5e-3 10e-3 -1 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F4,M4);title('基带信号单极性不归零码的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F4 M4;
%%
%----------画基带信号的单极性RNZ和双极性NRZ功率谱--------%
[Am1,Freq1] = pwelch(NRZ_sample,[],[],[],Fs,'centered','power');
[Am2,Freq2] = pwelch(msg_sample,[],[],[],Fs,'centered','power');
figure;
Am1_db = 10*log10(Am1);
Am2_db = 10*log10(Am2);
subplot(211);
plot(Freq1,Am1_db);
title('基带信号单极性不归零码的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
subplot(212);
plot(Freq2,Am2_db);
title('基带信号双极性不归零码的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
%%
%--------绘制BPSK已调信号的时域图和频谱图------%
[F6,M6] = My_FFT(BPSK_sig,Fs);
[Am4,Freq4] = pwelch(BPSK_sig,[],[],[],Fs,'centered','power');
Am4_db = 10*log10(Am4);
figure;
subplot(311);
plot(Time,BPSK_sig);
axis([5e-5 10e-5 -2 2]);title('BPSK调制后的信号时域图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F6,M6);title('BPSK调制后的信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq4,Am4_db);
title('BPSK调制后的信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
%clear F6 M6 Am4 Am4_db Freq4;

% Phase = phase(F6);        %相位
% figure;
% plot(F6,Phase);title('BPSK调制后的频谱(相位谱)');
% xlabel('频率(f/Hz)');ylabel('相位');
%%
%---------绘制单载波信号的时域图和频谱图--------%
[F7,M7] = My_FFT(carrier_sample,Fs);
[Am5,Freq5] = pwelch(carrier_sample,[],[],[],Fs,'centered','power');
Am5_db = 10*log10(Am5);
figure;
subplot(211);
plot(Time,carrier_sample);
axis([5e-5 10e-5 -2 2]);title('单载波信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(Freq5,Am5_db);
title('单载波信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
subplot(313);
plot(F7,M7);title('单载波信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F7 M7 Am5_db Am5 Freq5;
%%
%---绘制叠加高斯白噪声的已调信号的时域图和频谱图---%
[F8,M8] = My_FFT(transf_sig,Fs);
[Am6,Freq6] = pwelch(transf_sig,[],[],[],Fs,'centered','power');
Am6_db = 10*log10(Am6);
figure;
subplot(311);
plot(Time,transf_sig);
axis([5e-5 10e-5 -2 2]);title('叠加高斯白噪声的已调信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F8,M8);title('叠加高斯白噪声的已调信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq6,Am6_db);
title('叠加高斯白噪声的已调信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
clear F8 M8 Am6_db Am6 Freq6;
%%
%--------绘制BPSK解调后信号的时域图和频谱图------%
[F9,M9] = My_FFT(demodu_sig,Fs);
[Am7,Freq7] = pwelch(demodu_sig,[],[],[],Fs,'centered','power');
Am7_db = 10*log10(Am7);
figure;
subplot(311);
plot(Time,demodu_sig);
axis([5e-3 10e-3 -2 2]);title('解调后信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F9,M9);title('解调后信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq7,Am7_db);
title('解调后信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
clear F9 M9 Freq7 Am7_db Am7;
%%
recover_sig = zeros(1,N_sample);
idx2 = 1;                             %创建索引号
for i = 1:N_sample
    idx2 = ceil(Time(i)/t_sig);
    if(idx2>PCM_len)
        idx2 = PCM_len;
    end
    recover_sig(i) = Judge_code(idx2);
end
%----------解调、抽样判决后恢复信号--------%
[F4,M4] = My_FFT(recover_sig,Fs);
figure;
subplot(211);
plot(Time,recover_sig);title('抽样判决后恢复信号波形');
axis([5e-3 10e-3 -2 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F4,M4);title('抽样判决后恢复信号的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F4 M4;
%%
%--------------数字通信系统性能分析-------------%
% figure;
% semilogy(Eb_N0,bit_error,'-k*',Eb_N0,bit_err_theo,'-bp');
% title('BPSK载波调制信号在AWGN信道下的传输性能');
% xlabel('信噪比Eb/N0'); ylabel('误比特率/误码率');
% legend('仿真误比特率','理论误比特率');
%% 自定义函数
%%-------------自定义函数求fft便于画图-----------%%
function [f,m] = My_FFT(yt,fs)
Fw = abs(fft(yt));
if(iscolumn(yt) || isrow(yt))
    Fw = reshape(Fw,1,[]);         %变换为行向量便于处理
elseif(size(yt,1)>size(yt,2))
    Fw = reshape(Fw,size(yt,2),[]);
end
n = length(yt);                    %采样点数
if(mod(n,2)==0)
    m = [Fw(fix(length(Fw)/2):-1:1),Fw(1:fix(length(Fw)/2))];    %双边谱
else
    m = [Fw(fix(length(Fw)/2):-1:1),Fw(1:fix(length(Fw)/2)+1)];  %双边谱
end
m = reshape(m,1,[]);
f = (-n/2:n/2-1)*(fs/n);     % 频率范围   
end
%% 累加译码函数
function out_code = sum_decode(demodule_sig,Time,bit_period,bit_len)
    out_code = zeros(1,bit_len);
    temp = 0;
    idx_ex = 1;
    N_sample = length(Time);
    for k = 1:N_sample
        idx = ceil(Time(k)/bit_period);
        if(idx > bit_len)
            idx = bit_len;
        end
        if(idx == 0)  
            idx = 1;
        end
        if(idx > idx_ex)
            out_code(idx_ex) = temp;
            temp = 0;
            idx_ex = idx;
        else
            temp = temp + demodule_sig(k);
        end
        if(k == N_sample) 
            out_code(idx) = temp;
        end
    end
end
%% PCM编码函数(非均匀量化)
function code = PCMencoding(speech)
% PCM编码
speech1=speech./max(abs(speech)).*2048;                      %数据量化
speech2=speech1;
LengthOfSpeech=length(speech2);
code = zeros(LengthOfSpeech,8);
for i=1:LengthOfSpeech
    if speech2(i)>0 %确定极性码
        B1=1;
    else
        B1=0;
    end
    speech2(i)=abs(speech2(i));
    C=[0 16 32 64 128 256 512 1024 2048];%A律13折现非均匀区间
    for j=1:length(C)-1
        if speech2(i)>=C(j)&&speech2(i)<=C(j+1)
            L=j-1;
            L1=dec2bin(L,3);
            B2=L1(1);
            B2=str2double(B2);
            B3=L1(2);
            B3=str2double(B3);
            B4=L1(3);
            B4=str2double(B4);
        end
    end
    a=C(L+1);%确定段内码
    b=C(L+2);
    [B5,a1,b1]=judge(speech2(i),a,b);
    [B6,a2,b2]=judge(speech2(i),a1,b1);
    [B7,a3,b3]=judge(speech2(i),a2,b2);
    [B8,~,~]=judge(speech2(i),a3,b3);
    code(i,1)=B1;
    code(i,2)=B2;
    code(i,3)=B3;
    code(i,4)=B4;
    code(i,5)=B5;
    code(i,6)=B6;
    code(i,7)=B7;
    code(i,8)=B8;
end
end

%%
function decode = PCMdecoding(code)
% PCM译码
C2=[0,16;16,32;32,64;64,128;128,256;256,512;512,1024;1024,2048];
step=[1,1,2,4,8,16,32,64];
LengthOfSpeech=size(code,1);
temp = zeros(LengthOfSpeech,3);
for i=1:LengthOfSpeech
    temp(i,1)=code(i,1);
    temp(i,2)=bin2dec(num2str(code(i,2:4)));
    temp(i,3)=bin2dec(num2str(code(i,5:8)));
end
decode = zeros(1,LengthOfSpeech);
for i=1:LengthOfSpeech
    decode(i)=C2(temp(i,2)+1,1)+(temp(i,3)+0.5)*step(temp(i,2)+1);
    if temp(i,1)==0
        decode(i)=-decode(i);
    end
end
end
%% 抽样判决函数(硬判决)
function Judge_code = My_Judge(demodule_code)
    Judge_code = zeros(1,length(demodule_code));
    for i = 1:length(demodule_code)
        if(demodule_code(i)>0)
            Judge_code(i) = 1;
        else
            Judge_code(i) = -1;
        end
    end
end
%% PCM编码函数判决
function [B,m1,n1]=judge(I,m,n)
    if I>=m&&I<(m+n)/2
        B=0;
        m1=m;
        n1=(m+n)/2;
    else
        B=1;
        m1=(m+n)/2;
        n1=n;
    end
end

fixed voice

%% --通信原理大作业-- %%
clear;
clc;
close all;

filename='myspeech.wav';                % 填音频文件名
%% 信号预处理
Fs_low = 8e3;        %降采样频率
[x,fs]=audioread(filename);              %打开语音信号
x1 = x(:,2);                                      %取单声道
Xn = resample(x1,Fs_low,fs);                      %降采样率
%% 预设参数
Eb_N0 = 1:10;        %信道信噪比
Ts_low = 1/Fs_low;   %降采样后的采样间隔
fc = 1e5;            %载波频率
Fs = 4*fc;            %总采样率
Ts = 1/Fs;
T_end = length(x1)/fs;        %采样时间终点
Time = Ts:Ts:T_end;           %传输总时间片
N_sample = length(Time);      %总采样点数
sig_rate = length(Xn)*8/T_end;%信号传输速率设定
t_sig = 1/sig_rate;            
%% 原始信号处理
PCM_code = PCMencoding(Xn);                       %抽样信号编码
PCM_code = int8(reshape(PCM_code,1,[]));          %变换为向量
PCM_len = length(PCM_code);
                  
DBNRZ_code = 2*PCM_code-1;                        %将PCM后的01码变为双极性不归零码

%% 统一时间轴/对所有信号进行等采样率采样
NRZ_sample = zeros(1,N_sample);
msg_sample = zeros(1,N_sample);
carrier_sample = zeros(1,N_sample);
BPSK_sig = zeros(1,N_sample);

idx1 = 1;                             %创建索引号
for i = 1:N_sample
    idx1 = ceil(Time(i)/t_sig);
    if(idx1>PCM_len)
        idx1 = PCM_len;
    end
    NRZ_sample(i) = PCM_code(idx1);
    msg_sample(i) = DBNRZ_code(idx1);
	carrier_sample(i) = cos(2*pi*fc*Time(i));       %生成载波
    BPSK_sig(i) = msg_sample(i)*carrier_sample(i);  %BPSK调制
end
%% 信号在AWGN信道中传输后被接收、解调、译码
demodu_sig = zeros(1,N_sample);
bit_error = zeros(1,length(Eb_N0));
str_error = zeros(1,length(Eb_N0));
SNR = zeros(1,length(Eb_N0));
for indx = 1:length(Eb_N0)
    %************信号通过AWGN信道*************%
    transf_sig = awgn(BPSK_sig,Eb_N0(indx),'measured');  %使信号在AWGN信道下传输
    %************将接收的信号解调*************%
    demodu_sig = transf_sig.*carrier_sample;     %载波剥离
    %*****************信号累加****************%
    sum_Decode = sum_decode(demodu_sig,Time,t_sig,PCM_len);
    %*****************抽样判决****************%
    Judge_code = My_Judge(sum_Decode);
    %*******************译码******************%
    absolute_decode = (1+Judge_code)/2;                  %还原单极性01码
    temp_decode = reshape(absolute_decode,[],8);         %矩阵变换便于PCM解码
    PCM_decode = PCMdecoding(temp_decode);               %PCM解码
    Xn_decode = (PCM_decode/max(abs(PCM_decode)))';      %解码后归一化(数据还原)
    %****BPSK调制信号在AWGN信道下的性能分析****%
    SNR(indx) = mean(Xn.^2)/mean((Xn_decode-Xn).^2);               %PCM量噪比
    [error1,bit_error(indx)] = biterr(PCM_code,absolute_decode);   %传输信号误比特率
end
snr = 10.^(Eb_N0/10);                            %%信噪比转换为线性值
str_err_theo = 2*qfunc(sqrt(snr)*sin(pi/2));     %%理论误符号率
bit_err_theo = 1/log2(2)*str_err_theo;           %%理论误比特率
%% 语音播放
sound(x,fs);                    %播放原始语音信号
pause(T_end);
sound(Xn_decode,Fs_low);        %播放解码译码后的语音信号

%% ------------------------- 画图部分 ---------------------------- %%
%%
%----------------画原始音频信号图-------------%
figure;
[F1,M1]=My_FFT(x,fs);                 %对原始信号做FFT变换
Ty = 1/fs;
Time_y = Ty:Ty:T_end;
subplot(2,1,1);
plot(Time_y,x);                       %做原始语音信号的时域波形图
title('原始语音信号时域图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(2,1,2);                      
plot(F1,M1);title('原始语音信号频谱'); %做原始语音信号的频谱图
xlabel('频率(f/Hz)');ylabel('幅度');
clear F1 M1;
%%
%----------画基带信号的双极性不归零信号--------%
[F3,M3] = My_FFT(msg_sample,Fs);
figure;
subplot(211);
plot(Time,msg_sample);title('基带信号双极性不归零码波形');
axis([5e-3 10e-3 -2 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F3,M3);title('基带信号双极性不归零码的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F3 M3;
%%
%----------画基带信号的单极性不归零信号--------%
[F4,M4] = My_FFT(NRZ_sample,Fs);
figure;
subplot(211);
plot(Time,NRZ_sample);title('基带信号单极性不归零码波形');
axis([5e-3 10e-3 -1 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F4,M4);title('基带信号单极性不归零码的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F4 M4;
%%
%----------画基带信号的单极性RNZ和双极性NRZ功率谱--------%
[Am1,Freq1] = pwelch(NRZ_sample,[],[],[],Fs,'centered','power');
[Am2,Freq2] = pwelch(msg_sample,[],[],[],Fs,'centered','power');
figure;
Am1_db = 10*log10(Am1);
Am2_db = 10*log10(Am2);
subplot(211);
plot(Freq1,Am1_db);
title('基带信号单极性不归零码的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
subplot(212);
plot(Freq2,Am2_db);
title('基带信号双极性不归零码的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
%%
%--------绘制BPSK已调信号的时域图和频谱图------%
[F6,M6] = My_FFT(BPSK_sig,Fs);
[Am4,Freq4] = pwelch(BPSK_sig,[],[],[],Fs,'centered','power');
Am4_db = 10*log10(Am4);
figure;
subplot(311);
plot(Time,BPSK_sig);
axis([5e-5 10e-5 -2 2]);title('BPSK调制后的信号时域图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F6,M6);title('BPSK调制后的信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq4,Am4_db);
title('BPSK调制后的信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
%clear F6 M6 Am4 Am4_db Freq4;

% Phase = phase(F6);        %相位
% figure;
% plot(F6,Phase);title('BPSK调制后的频谱(相位谱)');
% xlabel('频率(f/Hz)');ylabel('相位');
%%
%---------绘制单载波信号的时域图和频谱图--------%
[F7,M7] = My_FFT(carrier_sample,Fs);
[Am5,Freq5] = pwelch(carrier_sample,[],[],[],Fs,'centered','power');
Am5_db = 10*log10(Am5);
figure;
subplot(211);
plot(Time,carrier_sample);
axis([5e-5 10e-5 -2 2]);title('单载波信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(Freq5,Am5_db);
title('单载波信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
subplot(313);
plot(F7,M7);title('单载波信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F7 M7 Am5_db Am5 Freq5;
%%
%---绘制叠加高斯白噪声的已调信号的时域图和频谱图---%
[F8,M8] = My_FFT(transf_sig,Fs);
[Am6,Freq6] = pwelch(transf_sig,[],[],[],Fs,'centered','power');
Am6_db = 10*log10(Am6);
figure;
subplot(311);
plot(Time,transf_sig);
axis([5e-5 10e-5 -2 2]);title('叠加高斯白噪声的已调信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F8,M8);title('叠加高斯白噪声的已调信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq6,Am6_db);
title('叠加高斯白噪声的已调信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
clear F8 M8 Am6_db Am6 Freq6;
%%
%--------绘制BPSK解调后信号的时域图和频谱图------%
[F9,M9] = My_FFT(demodu_sig,Fs);
[Am7,Freq7] = pwelch(demodu_sig,[],[],[],Fs,'centered','power');
Am7_db = 10*log10(Am7);
figure;
subplot(311);
plot(Time,demodu_sig);
axis([5e-3 10e-3 -2 2]);title('解调后信号时域波形图');
xlabel('时间(t/s)');ylabel('幅值');
subplot(312);
plot(F9,M9);title('解调后信号的频谱');
xlabel('频率(f/Hz)');ylabel('幅度');
subplot(313);
plot(Freq7,Am7_db);
title('解调后信号的功率谱');
xlabel('Frequency (Hz)');ylabel('Magnitude (dB)');grid;
clear F9 M9 Freq7 Am7_db Am7;
%%
recover_sig = zeros(1,N_sample);
idx2 = 1;                             %创建索引号
for i = 1:N_sample
    idx2 = ceil(Time(i)/t_sig);
    if(idx2>PCM_len)
        idx2 = PCM_len;
    end
    recover_sig(i) = Judge_code(idx2);
end
%----------解调、抽样判决后恢复信号--------%
[F4,M4] = My_FFT(recover_sig,Fs);
figure;
subplot(211);
plot(Time,recover_sig);title('抽样判决后恢复信号波形');
axis([5e-3 10e-3 -2 2]);
xlabel('时间(t/s)');ylabel('幅值');
subplot(212);
plot(F4,M4);title('抽样判决后恢复信号的频谱图');
xlabel('频率(f/Hz)');ylabel('幅度');
clear F4 M4;
%%
%--------------数字通信系统性能分析-------------%
figure;
semilogy(Eb_N0,bit_error,'-k*',Eb_N0,bit_err_theo,'-bp');
title('BPSK载波调制信号在AWGN信道下的传输性能');
xlabel('信噪比Eb/N0'); ylabel('误比特率/误码率');
legend('仿真误比特率','理论误比特率');
%% 自定义函数
%%-------------自定义函数求fft便于画图-----------%%
function [f,m] = My_FFT(yt,fs)
Fw = abs(fft(yt));
if(iscolumn(yt) || isrow(yt))
    Fw = reshape(Fw,1,[]);         %变换为行向量便于处理
elseif(size(yt,1)>size(yt,2))
    Fw = reshape(Fw,size(yt,2),[]);
end
n = length(yt);                    %采样点数
if(mod(n,2)==0)
    m = [Fw(fix(length(Fw)/2):-1:1),Fw(1:fix(length(Fw)/2))];    %双边谱
else
    m = [Fw(fix(length(Fw)/2):-1:1),Fw(1:fix(length(Fw)/2)+1)];  %双边谱
end
m = reshape(m,1,[]);
f = (-n/2:n/2-1)*(fs/n);     % 频率范围   
end
%% 累加译码函数
function out_code = sum_decode(demodule_sig,Time,bit_period,bit_len)
    out_code = zeros(1,bit_len);
    temp = 0;
    idx_ex = 1;
    N_sample = length(Time);
    for k = 1:N_sample
        idx = ceil(Time(k)/bit_period);
        if(idx > bit_len)
            idx = bit_len;
        end
        if(idx == 0)  
            idx = 1;
        end
        if(idx > idx_ex)
            out_code(idx_ex) = temp;
            temp = 0;
            idx_ex = idx;
        else
            temp = temp + demodule_sig(k);
        end
        if(k == N_sample) 
            out_code(idx) = temp;
        end
    end
end
%% PCM编码函数(非均匀量化)
function code = PCMencoding(speech)
% PCM编码
speech1=speech./max(abs(speech)).*2048;                      %数据量化
speech2=speech1;
LengthOfSpeech=length(speech2);
code = zeros(LengthOfSpeech,8);
for i=1:LengthOfSpeech
    if speech2(i)>0 %确定极性码
        B1=1;
    else
        B1=0;
    end
    speech2(i)=abs(speech2(i));
    C=[0 16 32 64 128 256 512 1024 2048];%A律13折现非均匀区间
    for j=1:length(C)-1
        if speech2(i)>=C(j)&&speech2(i)<=C(j+1)
            L=j-1;
            L1=dec2bin(L,3);
            B2=L1(1);
            B2=str2double(B2);
            B3=L1(2);
            B3=str2double(B3);
            B4=L1(3);
            B4=str2double(B4);
        end
    end
    a=C(L+1);%确定段内码
    b=C(L+2);
    [B5,a1,b1]=judge(speech2(i),a,b);
    [B6,a2,b2]=judge(speech2(i),a1,b1);
    [B7,a3,b3]=judge(speech2(i),a2,b2);
    [B8,~,~]=judge(speech2(i),a3,b3);
    code(i,1)=B1;
    code(i,2)=B2;
    code(i,3)=B3;
    code(i,4)=B4;
    code(i,5)=B5;
    code(i,6)=B6;
    code(i,7)=B7;
    code(i,8)=B8;
end
end

%%
function decode = PCMdecoding(code)
% PCM译码
C2=[0,16;16,32;32,64;64,128;128,256;256,512;512,1024;1024,2048];
step=[1,1,2,4,8,16,32,64];
LengthOfSpeech=size(code,1);
temp = zeros(LengthOfSpeech,3);
for i=1:LengthOfSpeech
    temp(i,1)=code(i,1);
    temp(i,2)=bin2dec(num2str(code(i,2:4)));
    temp(i,3)=bin2dec(num2str(code(i,5:8)));
end
decode = zeros(1,LengthOfSpeech);
for i=1:LengthOfSpeech
    decode(i)=C2(temp(i,2)+1,1)+(temp(i,3)+0.5)*step(temp(i,2)+1);
    if temp(i,1)==0
        decode(i)=-decode(i);
    end
end
end
%% 抽样判决函数(硬判决)
function Judge_code = My_Judge(demodule_code)
    Judge_code = zeros(1,length(demodule_code));
    for i = 1:length(demodule_code)
        if(demodule_code(i)>0)
            Judge_code(i) = 1;
        else
            Judge_code(i) = -1;
        end
    end
end
%% PCM编码函数判决
function [B,m1,n1]=judge(I,m,n)
    if I>=m&&I<(m+n)/2
        B=0;
        m1=m;
        n1=(m+n)/2;
    else
        B=1;
        m1=(m+n)/2;
        n1=n;
    end
end

Guess you like

Origin blog.csdn.net/weixin_44312889/article/details/128525152