% 程序功能: 调用各个子模块
function main()
M=4; %表示四进制
k=log2(M); %每符号含比特数
ft=1e2; %原始二进制数据的码率
fs=1e4; %采样率
fc=1e3; %栽频
transmit_bit_length=1e2; %需要处理的比特数
for snr=-12:0
[modsignal,transmit]=psk(fs,ft,fc,transmit_bit_length,M);%基带信号模块
signal_rev=channelAWGN(modsignal,snr); %信道模块
demodulat=modulator_cor(signal_rev,fs,fc,ft,M); %相关解调模块
data=detector(demodulat); %检测模块
data1(:,1)=data(:,2);
data1(:,2)=data(:,1); %两列数据互换
send=bi2de(transmit,'left-msb'); %把发送信号做二变十进制变换
rec=bi2de(data1,'left-msb'); %把接收信号做二变十进制变换
erro(snr+13)=sum(mod(send+rec,2))/length(send); %求误码率
end
plot([-12:0],erro);
% 程序功能: 产生基带信号与信号的调制
function [modsignal,transmit]=psk(fs,ft,fc,transmit_bit_length,M)
k=log2(M); %每符号含比特数
transmit=zeros(transmit_bit_length/k,k); %生成随进二进制数据产生的矩阵
for i=1:k
transmit(:,i)=randi([0,1],transmit_bit_length/k,1); %随机二进制数据产生
end
transmit4=bi2de(transmit,'left-msb'); %将二进制数据产生
T=fs/(ft/k); %每个符号的采样点数
signal=zeros(1,length(transmit4)*T);
for i=1:length(transmit4)
signal((i-1)*T+1:i*T)=ones(1,T)*transmit4(i); %一个码长内被分成200个采样点, 为了使与调制的载波频率一样
end
modsignal=modulate(signal,fc,fs,'pm',pi/2); %调制
subplot(211);
plot(signal(1:650));title('基带信号');
axis([1 650 -1 4]);
subplot(212);
plot(modsignal(1:650));title('调制信号');
axis([1 650 -1 1]);
% 程序功能: 加入高斯白噪声
function signal_rev=channelAWGN(signal,snr)
snr_lin =10^(snr/10); %dB转换
%计算信号功率和噪声功率
signal_power=sum(signal.^2)/length(signal); %计算已调信号功率
noise_power=signal_power/snr_lin;
noise_std=sqrt(noise_power); %计算噪声的标准方差
noise=noise_std*randn(1,length(signal)); %生成噪声
signal_rev=signal+noise; %加噪声
figure;
subplot(311);
stem(signal(1:100));title('4psk的调制信号');
subplot(312);
stem(signal_rev(1:100));title('受噪声干扰后信号');
% 程序功能: 实现相关解调
function demodulat=modulator_cor(signal,fs,fc,ft,M)
demodulat=0
k=log2(M); %每个符号含比特数
t=[0:1/fs:(length(signal)-1)/fs];
f1=cos(2*pi*fc*t); %基函数
f2=cos(2*pi*fc*t+pi/2);
r1=signal.*f1;
r2=signal.*f2;
T=fs/(ft/k); %每个符号的采样点数
figure;
subplot(611);
plot(f1(1:200));title('基函数1');
subplot(612);
plot(r1(1:200));title('接受信号与基函数1相乘后信号');
subplot(613);
plot(f2(1:200));title('基函数2');
subplot(614);
plot(r2(1:200));title('接受信号与基函数2相乘后信号');
subplot(615);
plot(signal(1:200));title('接收信号');
%频率的乘积等价于时域的卷积
for i=1:length(signal)/T
out1(i)=sum(r1((i-1)*T+1:i*T)); %基函数与f1的相关解调信号输出
out2(i)=sum(r2((i-1)*T+1:i*T)); %基函数与f2的相关解调信号输出
end
dem=[out1/max(abs(out1));out2/max(abs(out2))];%将输出信号做归一化处理
% 程序功能: 实现判决输出
function data=detector(demodulat)
angler=angle(j.*dem(2,:)+dem(1,:)); %求相位角
data4=(((-pi<=angler)&(angler<-3*pi/4))|((3*pi/4<=angler)&(angler<=pi)))*2+((-3*pi/4<=angler)&(angler<-pi/4))*3+((pi/
4<=angler)&(angler<=3*pi/4)); %判决
data=de2bi(data4,2); %十进制变为二进制
figure;
subplot(411);
stem(demodulat(1,:));
subplot(412);
stem(demodulat(2,:));
subplot(413);
stem(angler);
subplot(414);
stem(data);
有同志帮忙看下代码问题怎么解决吗
。。也要说是啥问题啊。